可能存在ggplot2 bug:叠加直方图的归一化结果不一致。

3
我最近偶然发现了ggplot2中一些奇怪的行为。以下是代码:
N <- 1000
coin <- rep(c(0,1),N/2)
N1 <- sum(coin)
N0 <- sum(1-coin)
values <- rep(0,N)
values[coin==0] <- rnorm(N0,mean=0,sd=1)
values[coin==1] <- rnorm(N1,mean=0,sd=1)
dat = data.frame('Value'=values,'Category'=as.factor(coin))

创建一个数据集,其中包含一个数字列和一个因子列,每个类别中都有相同数量的事件:
> summary(dat)
     Value           Category
 Min.   :-3.901785   0:500   
 1st Qu.:-0.669807   1:500   
 Median : 0.020031           
 Mean   :-0.008229           
 3rd Qu.: 0.650803           
 Max.   : 3.195819   

然而,将按类别分解的价值列进行绘制时,类别1的标准化要比类别0高得多:

ggplot(dat,aes(x=Value,fill=Category)) + geom_histogram(alpha=0.5) + theme_bw()

这看起来非常奇怪。两个直方图的箱宽度看起来相等,正如它们应该的那样,但事件的总计数不相等,而它们应该是相等的。实际上,类别0的直方图是整个数据集的直方图:

在这里输入图片描述

ggplot(dat,aes(x=Value)) + geom_histogram(alpha=0.5) + theme_bw()

enter image description here

这是 ggplot2 的 bug 吗?还是我犯了一些我没有注意到的错误?顺便说一下,如果我将类别0和1替换为'A'和'B',我得到相同的结果。

系统详细信息:

  • Mac OS X High Sierra
  • R版本3.4.0(2017-04-21)
  • ggplot2_2.2.1
1个回答

5

geom_histogram 默认通过参数 position="stack" 将条形图叠放在一起。这对于同时查看整体组成和每个部分的贡献非常有用,但不太适合直接比较部分。您可以通过将位置参数更改为 "identity" 来覆盖此行为,例如:

ggplot(dat,aes(x=Value,fill=Category)) +
 geom_histogram(alpha=0.5, position="identity") + theme_bw()

Histogram using position="identity"


谢谢!奇怪,我以前从来没有注意到这一点,可能是因为我更经常使用geom_density而不是geom_histogram。 - jwimberley

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接