1

我正在尝试使用出色的 ggplot2 使用条形几何来绘制概率质量而不是计数。但是,使用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)
4

1 回答 1

2

我认为您几乎已经弄清楚了,并且一旦您意识到需要条形图而不是直方图,就会知道。

具有分类数据的条的默认宽度是 0.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))
于 2013-09-05T17:32:48.757 回答