【问题标题】:Possible ggplot2 bug: inconsistent normalizations of overlaid histograms可能的 ggplot2 错误:重叠直方图的标准化不一致
【发布时间】:2018-06-12 13:04:57
【问题描述】:

我最近在 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   

但是,当绘制按类别细分的 Value 列时,类别 1 的归一化程度比类别 0 高得多:

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

这看起来很奇怪。两个直方图的 bin 宽度看起来是相等的,因为它们应该是相等的,但是事件的总计数不相等,因为它们应该是相等的。 0类直方图其实就是整个数据集的直方图:

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

这是一个 ggplot2 错误,还是我犯了一些我没有注意到的错误? (顺便说一下,如果我将类别 0 和 1 替换为“A”和“B”,我会得到同样的结果)。

系统详情:

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

【问题讨论】:

    标签: r ggplot2 histogram


    【解决方案1】:

    geom_histogram 默认通过参数position="stack" 将条形堆叠在一起。这对于同时查看整体组成和每个部分的贡献很有用,但对于直接比较各个部分不是那么有用。您可以通过将位置参数更改为"identity" 来覆盖它,例如:

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

    【讨论】:

    • 谢谢!奇怪的是,我以前从未注意到这一点,可能是因为我更经常使用 geom_density 而不是 geom_histogram。
    猜你喜欢
    • 2014-06-22
    • 2013-04-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多