Pregunta

Estoy usando ggplot2 para crear paneles de histogramas, y me gustaría poder agregar una línea vertical en la media de cada grupo. Pero geom_vline () usa la misma intersección para cada panel (es decir, la media global):

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

¿Cómo puedo hacer que use el grupo de cada panel como la intersección x? (Puntos de bonificación si también puede agregar una etiqueta de texto por la línea con el valor de la media).

¿Fue útil?

Solución

Una forma es construir data.frame con los valores medios de antemano.

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

Otros consejos

Supongo que esto es una reelaboración de @ eduardo realmente, pero en una línea.

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)

texto alternativo http://www.imagechicken.com/uploads/1264782634003683000.png

o usando plyr ( require (plyr) un paquete del autor 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)

Parece insatisfactorio que vline no se corte en las facetas, no estoy seguro de por qué.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top