Ajouter une ligne verticale avec une interception différente pour chaque panneau dans ggplot2

StackOverflow https://stackoverflow.com/questions/1644661

Question

J'utilise ggplot2 pour créer des panneaux d'histogrammes et j'aimerais pouvoir ajouter une ligne verticale à la moyenne de chaque groupe. Mais geom_vline () utilise la même interception pour chaque panneau (c'est-à-dire la moyenne globale):

require("ggplot2")
# setup some sample data
N <- 1000
cat1 <- sample(c("a","b","c"), N, replace=T)
cat2 <- sample(c("x","y","z"), N, replace=T)
val <- rnorm(N) + as.numeric(factor(cat1)) + as.numeric(factor(cat2))
df <- data.frame(cat1, cat2, val)

# draws a single histogram with vline at mean
qplot(val, data=df, geom="histogram", binwidth=0.2) + 
  geom_vline(xintercept=mean(val), color="red")

# draws panel of histograms with vlines at global mean
qplot(val, data=df, geom="histogram", binwidth=0.2, facets=cat1~cat2) + 
  geom_vline(xintercept=mean(val), color="red")

Comment puis-je le faire utiliser la moyenne des groupes de chaque panneau en tant qu'interception x? (Points bonus si vous pouvez également ajouter une étiquette de texte par la ligne avec la valeur de la moyenne.)

Était-ce utile?

La solution

L’une des méthodes consiste à construire le fichier data.frame avec les valeurs moyennes au préalable.

library(reshape)
dfs <- recast(data.frame(cat1, cat2, val), cat1+cat2~variable, fun.aggregate=mean)
qplot(val, data=df, geom="histogram", binwidth=0.2, facets=cat1~cat2) + geom_vline(data=dfs, aes(xintercept=val), colour="red") + geom_text(data=dfs, aes(x=val+1, y=1, label=round(val,1)), size=4, colour="red")

Autres conseils

Je suppose que ceci est une refonte de @ eduardo, mais en une ligne.

ggplot(df) + geom_histogram(mapping=aes(x=val)) 
  + geom_vline(data=aggregate(df[3], df[c(1,2)], mean), 
      mapping=aes(xintercept=val), color="red") 
  + facet_grid(cat1~cat2)

alt text http://www.imagechicken.com/uploads/1264782634003683000.png

ou en utilisant plyr ( nécessite (plyr) un paquet de l'auteur de ggplot, Hadley):

ggplot(df) + geom_histogram(mapping=aes(x=val)) 
  + geom_vline(data=ddply(df, cat1~cat2, numcolwise(mean)), 
      mapping=aes(xintercept=val), color="red") 
  + facet_grid(cat1~cat2)

Il semble insatisfaisant que vline ne soit pas coupé sur les facettes, je ne sais pas pourquoi.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top