2010-03-09 10 views
41

Utilizzare Io di solito uso geom_text e qualcosa come position=jitter per annotare i miei grafici.Come annotare correttamente un ggplot2 (manuale)

Tuttavia, per una bella trama, spesso trovo utile annotare manualmente. come di seguito:

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") 

Il problema è che non riesco a ottenere il colore delle annotazioni di testo in modo che corrisponda al colore della linea. Immagino di poter risolvere questo problema con una scala manuale, ma spero che ci sia un modo migliore?

+2

veda anche il pacchetto 'directlabels' – baptiste

risposta

46

Se si utilizza geom_text() al posto di Annotate() è possibile passare un colore gruppo alla trama:

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")) 

Quindi, utilizzando annotate() sembra che questo: alt text http://www.cerebralmastication.com/wp-content/uploads/2010/03/before.png

poi dopo usando geom_text() assomiglia a questo: alt text http://www.cerebralmastication.com/wp-content/uploads/2010/03/after.png

+5

avete fatto nota la leggenda sul lato destro? Normalmente dovrebbe essere un cerchio invece di un 'a' sulla linea. Questo non sembra buono. – qed

+0

Anche io ricevo l'etichetta. Ad ogni modo per rimuovere questo? – max

+2

Puoi sbarazzarti di 'a' aggiungendo "show_guide = F" a geom_text. (La risposta di mbask evita il brutto rendering per duplicazione e dovrebbe essere usato al suo posto. Inoltre, l'opzione show_guide dovrebbe essere impostata su F.) – bug313

57

Ho avuto un problema simile e l'ho risolto con la risposta JD Long. Ma come risultato dell'aggiornamento ggplot2 alla versione 0.9.0 ho notato che tutte le chiamate geom_text() sono state rese un po 'sfocate sui grafici.

Grazie a kohske ho scoperto che questo codice

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")) 

trame del geom_text nrow(data2) volte!

Il modo corretto per la fornitura di dati da geom_text sta costruendo un data.frame diversa tenendo coordinate, etichette e colori per le stringhe che si desidera tracciare:

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

Questa è una risposta molto migliore, specialmente per i grandi set di dati. La duplicazione di geom_text può davvero uccidere un PDF, rendendo il rendering dolorosamente lento. – naught101

+2

È andato nello stesso problema e questo lo ha risolto! L'utilizzo di geom_text() senza la propria mappatura dei dati comporterà un overplotting e una scarsa risoluzione del testo. Fornire una mappatura dei dati risolverà il problema. – Chris

+0

Grazie a @kohske e @mbask. Per coloro che ottengono errori "Valore discreto fornito in scala continua" quando si utilizza il codice sopra. Prova a fare in modo che il tuo dataframe includa l'opzione 'stringsAsFactors = FALSE' – micstr