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

R ggplot2显示概率质量而非计数的因素直方图,r,ggplot2,R,Ggplot2,我试图使用优秀的ggplot2,使用条形几何图来绘制概率质量,而不是计数。然而,使用aes(y=…密度…)分布不等于一(但很接近)。我认为问题可能是由于默认的binwidth for factors。这是一个问题的例子 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(d

我试图使用优秀的ggplot2,使用条形几何图来绘制概率质量,而不是计数。然而,使用
aes(y=…密度…)
分布不等于一(但很接近)。我认为问题可能是由于默认的binwidth for factors。这是一个问题的例子

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)

我想你几乎已经弄明白了,一旦你意识到你需要的是条形图而不是柱状图,你就会明白

带有分类数据的条形图的默认宽度为.9(请参见
?stat_-bin
geom_-bar
的帮助页面不提供默认条形图宽度,但会将您发送到
stat_-bin
以供进一步阅读)。考虑到这一点,您的曲线图显示了0.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))

如果x不是连续的,那么您就不能根据定义绘制直方图。@Roland and@Richie,谢谢您的快速回复。不幸的是,我在使用
geom_bar
时遇到了同样的问题,我也试过了。太棒了。谢谢你的
width=1
。我花了很多时间想弄明白这一点。我假设stat_bin默认为width=1。下次我将进一步深入查看帮助文件。顺便说一句,
geom_直方图
默认为带有因子的
geom_条
,因此添加“width=1”也适用于geom_直方图。
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))