ggplot2显示概率质量而非计数的因子直方图

时间:2013-09-05 10:56:00

标签: r ggplot2

我正在尝试使用优秀的ggplot2使用bar geom绘制概率质量而不是计数。但是,使用aes(y=..density..)分配不会合计为一个(但接近)。我认为问题可能是因为因素的默认binwidth。这是一个问题的例子,

age <- c(rep(0,4), rep(1,4))
mppf <- c(1,1,1,0,1,1,0,0)
data.test <- as.data.frame(cbind(age,mppf))
data.test$age <- as.factor(data.test$age)
data.test$mppf <- as.factor(data.test$mppf)
p.test.density <- ggplot(data.test, aes(mppf, group=age, fill=age)) +
geom_bar(aes(y=..density..), position='dodge') +
scale_y_continuous(limits=c(0,1))
dev.new()
print(p.test.density)

我可以通过将x变量保持为连续并设置binwidth=1来解决这个问题,但它看起来并不优雅。

data.test$mppf.numeric <- as.numeric(data.test$mppf)
p.test.density.numeric <- ggplot(data.test, aes(mppf.numeric, group=age, fill=age)) + 
geom_histogram(aes(y=..density..), position='dodge', binwidth=1)+ 
scale_y_continuous(limits=c(0,1))
dev.new()
print(p.test.density.numeric)

1 个答案:

答案 0 :(得分:2)

我认为你几乎已经弄明白了,一旦你意识到你需要一个条形图而不是直方图。

带有分类数据的小节的默认宽度为.9(请参阅?stat_bingeom_bar的帮助页面未提供默认小节宽度,但会将您转到stat_bin进一步阅读。鉴于此,您的图显示条宽为.9的正确密度。只需更改为宽度1,您将看到预期看到的密度值。

ggplot(data.test, aes(x = mppf, group = age, fill = age)) +
  geom_bar(aes(y=..density..), position = "dodge", width = 1) +
  scale_y_continuous(limits=c(0,1))