15

ggplot2 を使用してヒストグラムのパネルを作成しています。各グループの平均に垂直線を追加できるようにしたいと考えています。しかし、 geom_vline() は各パネルに同じ切片 (つまり、グローバル平均) を使用します。

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

各パネルのグループ平均を x 切片として使用するにはどうすればよいですか? (平均値の行にテキスト ラベルを追加することもできればボーナス ポイントです。)

4

2 に答える 2

15

これは @eduardo のリワークだと思いますが、1 行です。

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)

代替テキスト http://www.imagechicken.com/uploads/1264782634003683000.png

またはplyrrequire(plyr)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)

vline がファセットでカットされていないのは不満に思えますが、その理由はわかりません。

于 2010-01-29T15:21:39.053 に答える
10

1 つの方法は、事前に平均値を使用して data.frame を構築することです。

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")
于 2009-10-29T17:05:30.047 に答える