Domanda

Sto usando ggplot2 per creare pannelli di istogrammi e mi piacerebbe poter aggiungere una linea verticale alla media di ciascun gruppo. Ma geom_vline () usa la stessa intercetta per ogni pannello (cioè la media 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")

Come posso ottenerlo per usare la media di gruppo di ogni pannello come intercetta x? (Punti bonus se puoi anche aggiungere un'etichetta di testo sulla riga con il valore della media.)

È stato utile?

Soluzione

Un modo è costruire prima il data.frame con i valori medi.

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

Altri suggerimenti

Immagino che questa sia una rielaborazione di @ eduardo's davvero, ma in una riga.

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 usando plyr ( richiedono (plyr) un pacchetto dell'autore di 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)

Sembra insoddisfacente che Vline non sia tagliato sulle sfaccettature, non sono sicuro del perché.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top