【问题标题】:Normalizing y-axis in histograms in R ggplot to proportion by group将R ggplot中直方图中的y轴归一化为按组的比例
【发布时间】:2014-03-04 19:27:40
【问题描述】:

我的问题与Normalizing y-axis in histograms in R ggplot to proportion 非常相似,只是我有两组不同大小的数据,我希望每个比例与其组大小而不是总大小有关。

为了更清楚,假设我在一个数据框中有两组数据:

dataA<-rnorm(100,3,sd=2)
dataB<-rnorm(400,5,sd=3)
all<-data.frame(dataset=c(rep('A',length(dataA)),rep('B',length(dataB))),value=c(dataA,dataB))

我可以将这两个分布绘制在一起:

ggplot(all,aes(x=value,fill=dataset))+geom_histogram(alpha=0.5,position='identity',binwidth=0.5)

而不是 Y 轴上的频率,我可以得到比例:

ggplot(all,aes(x=value,fill=dataset))+geom_histogram(aes(y=..count../sum(..count..)),alpha=0.5,position='identity',binwidth=0.5)

但这给出了相对于总数据大小的比例(此处为 500 点):是否有可能相对于每个组大小?

我的目标是让我们能够直观地比较 A 和 B 之间给定 bin 中值的比例,而与它们各自的大小无关。也欢迎与我原来的想法不同的想法!

谢谢!

【问题讨论】:

    标签: r ggplot2 histogram


    【解决方案1】:

    像这样? [根据OP的评论编辑]

    ggplot(all,aes(x=value,fill=dataset))+
      geom_histogram(aes(y=0.5*..density..),
                     alpha=0.5,position='identity',binwidth=0.5)
    

    使用y=..density.. 缩放直方图,使每个直方图下的面积为1,或sum(binwidth*y)=1. 因此,您可以使用y = binwidth*..density.. 让y 代表每个bin 中总数的分数。在你的情况下,binwidth=0.5

    IMO 这更容易解释:

    ggplot(all,aes(x=value,fill=dataset))+
      geom_histogram(aes(y=0.5*..density..),binwidth=0.5)+
      facet_wrap(~dataset,nrow=2)
    

    【讨论】:

    • 感谢您的回答,但实际上我认为密度不等于除以数据集的计数,除非条形宽度为 1(参见 stackoverflow.com/questions/11766856/… 中的示例)。特别是在我的情况下,我想读取一个 bin 在 Y 轴上代表的百分比。
    • 你是对的 - 需要按 binwidth 进行缩放。查看我的编辑。
    • 哦,是的,当然!我什至没有意识到当我回复时,我想我太专注于y=..count../sum(..count..)的版本。显然,..count../sum(..count..) 每个计数除以总计数,而在..density.. 的情况下,它独立应用于每个组:我仍然不明白为什么,如果你有一个想法?
    • 我刚刚遇到了这个问题。根据github.com/tidyverse/ggplot2/issues/3522,您可能可以执行aes(y = stat(density*width)),这将达到相同的结果,但无需手动设置binwidth。然而,这是否应该被允许仍然有点不清楚。
    猜你喜欢
    • 2014-04-06
    • 2012-07-30
    • 2017-12-19
    • 1970-01-01
    • 2020-03-19
    • 1970-01-01
    • 2018-09-01
    • 1970-01-01
    相关资源
    最近更新 更多