Ggplot2 使用密度标尺生成高度不正确的几何条

Ggplot 2 is producing geombars with incorrect height using a density scale

我运行 对调查响应进行了多项 2 变量分类分析。因为有些反应更为常见,所以我使用 geom_bars 的密度标度,这样倾斜的数据确实会扭曲差异。我很困惑为什么条形总和大约为 1.12,因为密度缩放应该强制总和为 1 或 100%。

数据为4600份调查回复。我不确定如何给出一个实际有助于再现图形差异的数据示例。如果没有大样本,谈论密度是不值得的……数据是这样的,每个响应当然都有很多其他变量。

data <- data.frame(pm = c(1, 1, 2, 2, 2, 3), 
                   wt = c(12, 16, 86, 56, 10, 34), 
                   VA = c("Yes", "No", "No", "No", "Yes", "Yes"))

这是我用来绘制这些变量之一的代码的基本示例:

  plot <- 
  ggplot(data,aes(factor(VA),weight=wt,fill=factor(pm))) +
  geom_bar(aes(y=..density..,group=factor(pm)),
           position="dodge")

我分别计算了以下 table,这些是我希望在图表中显示的值。

                     Available  Not Available
Cash Ridership %     28.18      71.82 
Pass Ridership %     52.40      47.60
10-Ride Ridership %  45.80      54.20

相反,现金条显示为 32% 和 80%,而不是 28% 和 72%。我以类似方式制作的所有其他图表都有同样的问题,但直到这一张我才真正注意到。

请注意,在 ?stat_bin 中它说的是密度(强调我的)

density of points in bin, scaled to integrate to 1

而且 width 的默认参数是 width = 0.9。因此,默认情况下,高度会按比例缩放至总计 1/0.9 = 1.111。所以两种可能的解决方案是:

改变宽度

ggplot(data,aes(factor(VA), weight=wt, fill=factor(pm))) +
  geom_bar(aes(y=..density.., group=factor(pm)),
           position="dodge", width = 1) 

重新缩放密度

ggplot(data,aes(factor(VA), weight=wt, fill=factor(pm))) +
  geom_bar(aes(y=..density..*.9, group=factor(pm)),
           position="dodge")