2010-03-09 4 views
41

En utilisant ggplot2 J'utilise normalement geom_text et quelque chose comme position=jitter pour annoter mes graphiques.Comment bien annoter un ggplot2 (manuel)

Cependant - pour une belle intrigue je trouve souvent qu'il vaut la peine d'annoter manuellement. comme ci-dessous:

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

Le problème est que je ne peux pas obtenir la couleur des annotations de texte pour correspondre à la couleur de la ligne. Je suppose que je pourrais résoudre cela avec une échelle manuelle, mais j'espère qu'il y a un meilleur moyen?

+2

voir aussi le paquet 'directlabels' – baptiste

Répondre

46

Si vous utilisez geom_text() au lieu de annoter(), vous pouvez passer une couleur de groupe à votre terrain:

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

Donc, en utilisant annoter() il ressemble à ceci: alt text http://www.cerebralmastication.com/wp-content/uploads/2010/03/before.png

puis après en utilisant geom_text() il ressemble à ceci: alt text http://www.cerebralmastication.com/wp-content/uploads/2010/03/after.png

+5

Avez-vous remarquez la légende sur le côté droit? Normalement, il devrait s'agir d'un cercle au lieu d'un «a» sur la ligne. Cela ne semble pas bien. – qed

+0

Je reçois aussi le label. De toute façon pour enlever ça? – max

+2

Vous pouvez vous débarrasser du 'a' en ajoutant "show_guide = F" à geom_text. (La réponse de mbask empêche le rendu moche par la duplication et devrait être utilisée à la place.L'option show_guide devrait également être définie sur F.) – bug313

57

J'ai eu un problème similaire et l'ai résolu avec JD Réponse longue. Mais à la suite de ggplot2 mise à jour vers la version 0.9.0, j'ai remarqué que tous les appels geom_text() rendus quelque peu flou sur les parcelles.

Merci à kohske je découvrais que ce code

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

trace le geom_text nrow(data2) fois!

La manière correcte pour fournir des données à geom_text est la construction d'un autre data.frame tenant les coordonnées, les étiquettes et les couleurs pour les chaînes que vous voulez tracer:

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

C'est une bien meilleure réponse, surtout pour les grands ensembles de données. La duplication de geom_text peut vraiment tuer un PDF, rend le ralentissement douloureux. – naught101

+2

Ran dans le même problème et cela l'a résolu! L'utilisation de geom_text() sans son propre mappage de données entraînera un sur-remplissage et une mauvaise résolution du texte. Fournir un mappage de données résoudra le problème. – Chris

+0

Merci @kohske et @mbask. Pour ceux qui reçoivent des erreurs "Valeur discrète fournie à l'échelle continue" lors de l'utilisation du code ci-dessus. Essayez en faisant votre dataframe d'inclure l'option 'stringsAsFactors = FALSE' – micstr