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")
我运行 对调查响应进行了多项 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")