多面密度直方图

Faceted density histogram

我试图并排绘制两个直方图,显示每个条件下每个观察值的密度。

例如,如果我有以下数据框:

> (test <- data.frame(rain=c(T,T,T,F,F), bikes=as.integer(c(1,1,2,1,2)), location=as.factor(c('a','b','a','b','b'))))
   rain bikes location
1  TRUE     1        a
2  TRUE     1        b
3  TRUE     2        a
4 FALSE     1        b
5 FALSE     2        b

然后我想为 rain=FALSE 绘制一个直方图,有两个高度为 0.5 的条;另一个 rain=TRUE,高度为 1/3 和 2/3。

我试过了

ggplot(test, aes(x=bikes, y=..density..)) + 
  geom_bar() + 
  scale_x_discrete() + 
  facet_wrap(~rain) + 
  scale_y_continuous(breaks=seq(0, 1, 0.05))

它给出了正确的形状,但每个条都高了大约 10%:

我也试过 y=..count../sum(..count..),但那里的条形高度是 0.2、0.2、0.4、0.2 - 它似乎是对整个数据框求和,而不仅仅是 rain 条件.

(我不太明白 ..foo.. 语法。我看过 this answer,但我仍然不明白 densitycount 在哪里来自.)

我知道我可以创建一个临时数据框来代替绘图,但我更愿意避免这种情况——从同一个数据框中做所有事情对于我将来可能想做的事情来说感觉更灵活——但我没有想出一个不那么糟糕的方法。

理想情况下,我还想用 location 给条形图上色。如果我用 ..density.. 这样做,我会得到这个结果:

显然是在四种情况(雨-a、雨-b、干-a、干-b)中的每一种条件下计算的统计数据。我希望它只在 rain/dry 条件下计算。

嗨,为了让 R 做你想做的事,修改你的数据框要容易得多。使用 plyr 包:

❥ library(plyr)
❥ test2 <- ddply(test, .(rain), transform, proportion = 1/length(rain))
❥ test2
   rain bikes location proportion
1 FALSE     1        b     0.5000
2 FALSE     2        b     0.5000
3  TRUE     1        a     0.3333
4  TRUE     1        b     0.3333
5  TRUE     2        a     0.3333
❥ ggplot(test2, aes(x=bikes)) + geom_bar(aes(y = proportion), stat= "identity") + facet_grid(~rain) + scale_y_continuous(labels=percent) + scale_x_continuous(breaks = 1:max(test2$bikes))