Fügen Sie eine vertikale Linie mit unterschiedlichem Schnittpunkt für jede Platte in ggplot2

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

Frage

Ich bin mit ggplot2 Platten von Histogrammen zu schaffen, und ich möchte eine vertikale Linie an dem Mittelwert jeder Gruppe hinzufügen zu können. Aber geom_vline () verwendet die gleiche Intercept für jede Platte (das heißt die globalen Mittel):

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

Wie kann ich es jede Gruppe als der x-Schnittpunkt bedeutet Panel-benutzen? (Bonuspunkte, wenn Sie können auch eine Textbeschriftung durch die Zeile mit dem Wert der mittleren hinzufügen.)

War es hilfreich?

Lösung

Eine Möglichkeit ist es, die data.frame mit den Mittelwert vor der Hand zu konstruieren.

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

Andere Tipps

Ich denke, dies ist eine Überarbeitung von @ eduardo ist wirklich, aber in einer Zeile.

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

oder mit plyr (require(plyr) ein Paket vom Autor 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)

Es scheint, dass unbefriedigende vline nicht auf den Facetten geschnitten wird, ich bin mir nicht sicher, warum.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top