2009-10-29 24 views
13

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() utiliza la misma intersección para cada panel (es decir, la media global):Agregue una línea vertical con intersección diferente para cada panel en ggplot2

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 conseguir que se utilice el grupo de cada panel significa que 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.)

Respuesta

9

Una forma es construir el data.frame con los valores medios antes de la mano.

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

Supongo que esto es una reelaboración de @ eduardo's really, 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) 

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

o el uso de plyr (require(plyr) un paquete por el 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 poco satisfactoria que vline no se corta en las facetas, I' No estoy seguro por qué.

Cuestiones relacionadas