2010-03-09 35 views
41

Uso de ggplot2 Normalmente uso geom_text y algo así como position=jitter para anotar mis trazados.Cómo anotar muy bien un ggplot2 (manual)

Sin embargo, para una buena trama a menudo me parece que vale la pena anotar manualmente. como abajo:

data2 <- structure(list(type = structure(c(5L, 1L, 2L, 4L, 3L, 5L, 1L, 
2L, 4L, 3L, 5L, 1L, 2L, 4L, 3L, 5L, 1L, 2L, 4L, 3L), .Label = c("EDS", 
"KIU", "LAK", "MVH", "NA*"), class = "factor"), value = c(0.9, 
0.01, 0.01, 0.09, 0, 0.8, 0.05, 0, 0.15, 0, 0.41, 0.04, 0.03, 
0.52, 0, 0.23, 0.11, 0.02, 0.64, 0.01), time = c(3L, 3L, 3L, 
3L, 3L, 6L, 6L, 6L, 6L, 6L, 15L, 15L, 15L, 15L, 15L, 27L, 27L, 
27L, 27L, 27L), year = c(2008L, 2008L, 2008L, 2008L, 2008L, 2007L, 
2007L, 2007L, 2007L, 2007L, 2007L, 2007L, 2007L, 2007L, 2007L, 
2006L, 2006L, 2006L, 2006L, 2006L)), .Names = c("type", "value", 
"time", "year"), row.names = c(1L, 3L, 4L, 5L, 6L, 7L, 9L, 10L, 
11L, 12L, 13L, 15L, 16L, 17L, 18L, 19L, 21L, 22L, 23L, 24L), class = "data.frame") 
ggplot(data2, aes(x=time, y=value, group=type, col=type))+ 
geom_line()+ 
geom_point()+ 
theme_bw()+ 
annotate("text", x=6, y=0.9, label="this is a wrong color")+ 
annotate("text", x=15, y=0.6, label="this is a second annotation with a wrong color") 

El problema es que no puedo obtener el color de las anotaciones de texto para que coincida con el color de la línea. Supongo que podría arreglar esto con una escala manual, pero espero que haya una mejor manera.

+2

ver también el paquete 'directlabels' – baptiste

Respuesta

46

Si utiliza geom_text() en lugar de anotar() puede pasar un grupo de color a su terreno:

ggplot(data2, aes(x=time, y=value, group=type, col=type))+ 
geom_line()+ 
geom_point()+ 
theme_bw() + 
geom_text(aes(7, .9, label="correct color", color="NA*")) + 
geom_text(aes(15, .6, label="another correct color!", color="MVH")) 

Así, utilizando anotar() se parece a esto: alt text http://www.cerebralmastication.com/wp-content/uploads/2010/03/before.png

continuación, después de usando geom_text() se ve así: alt text http://www.cerebralmastication.com/wp-content/uploads/2010/03/after.png

+5

¿Te ha nota la leyenda en el lado derecho? Normalmente debería ser un círculo en lugar de una 'a' en la línea. Esto no se ve bien. – qed

+0

También recibo la etiqueta. De todos modos para eliminar esto? – max

+2

Puede deshacerse de la 'a' agregando "show_guide = F" a geom_text. (La respuesta de mbask evita la representación fea por duplicación y debería utilizarse en su lugar. También allí la opción show_guide debe establecerse en F.) – bug313

57

Tuve un problema similar y lo resolví con la respuesta larga de JD. Pero como resultado de ggplot2 actualizando a la versión 0.9.0 noté que todas las llamadas a geom_text() se veían un tanto borrosas en las tramas.

Gracias a kohske he descubierto que este código

ggplot(data2, aes(x=time, y=value, group=type, col=type))+ 
geom_line()+ 
geom_point()+ 
theme_bw() + 
geom_text(aes(7, .9, label="correct color", color="NA*")) + 
geom_text(aes(15, .6, label="another correct color!", color="MVH")) 

parcelas del geom_text nrow(data2) veces!

La forma correcta para el suministro de datos a geom_text está construyendo una hoja.de.datos diferentes coordenadas, la celebración de las etiquetas y los colores de las cadenas que desea trazar:

data2.labels <- data.frame(
    time = c(7, 15), 
    value = c(.9, .6), 
    label = c("correct color", "another correct color!"), 
    type = c("NA*", "MVH") 
) 

ggplot(data2, aes(x=time, y=value, group=type, col=type))+ 
    geom_line()+ 
    geom_point()+ 
    theme_bw() + 
    geom_text(data = data2.labels, aes(x = time, y = value, label = label)) 
+6

Esta es una respuesta mucho mejor, especialmente para grandes conjuntos de datos. La duplicación de geom_text realmente puede matar a un PDF, lo que hace que su procesamiento sea extremadamente lento. – naught101

+2

Se metió en el mismo problema y esto lo resolvió! El uso de geom_text() sin su propia asignación de datos dará como resultado una sobreimpresión y una mala resolución del texto. Proporcionar un mapeo de datos resolverá el problema. – Chris

+0

Gracias @kohske y @mbask. Para aquellos que obtienen errores de "Valor discreto suministrado a escala continua" cuando usan el código anterior. Cuando cree su dataframe, intente incluir la opción 'stringsAsFactors = FALSE' – micstr

Cuestiones relacionadas