将R ggplot中的直方图中的y轴归一化为按组比例

Erw*_*wan 31 r histogram ggplot2

我的问题非常类似于将R ggplot中的直方图中的y轴标准化为比例,除了我有两组不同大小的数据,我希望每个比例相对于其组大小而不是总大小.

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

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))
Run Code Online (Sandbox Code Playgroud)

我可以将两个发行版一起绘制:

ggplot(all,aes(x=value,fill=dataset))+geom_histogram(alpha=0.5,position='identity',binwidth=0.5)
Run Code Online (Sandbox Code Playgroud)

而不是Y轴上的频率我可以有以下比例:

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

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

我的目标是使得可以在视觉上比较A和B之间给定箱中的值的比例,而与它们各自的大小无关.也欢迎与我的原创不同的想法!

谢谢!

jlh*_*ard 40

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

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

使用y=..density..直方图比例,使每个区域下面的面积为1,或者sum(binwidth*y)=1.因此,您将使用y = binwidth*..density..y来表示每个区域中总数的分数.在你的情况下,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)
Run Code Online (Sandbox Code Playgroud)

  • 哦,是的,当然!我什至没有意识到,当我回答时,我想我太专注于使用y = .. count ../ sum(.. count ..)`的版本。显然,用..count ../ sum(.. count ..)`将每个计数除以总计数,而对于`..density..`则将其独立应用于每个组:我仍然不知道不知道为什么,如果您有想法? (3认同)
  • 我刚刚遇到这个问题。根据https://github.com/tidyverse/ggplot2/issues/3522,您也许可以执行“aes(y = stat(密度*宽度))”,这将获得相同的结果,但无需手动设置bin 宽度。然而,目前还不清楚这是否“应该”被允许。 (3认同)
  • 谢谢您的回答,但实际上我认为密度不等于除以数据集的计数,除非条宽为 1(例如参见 http://stackoverflow.com/questions/11766856/normalizing- y-axis-in-histograms-in-r-ggplot-to-proportion)。特别是在我的情况下,我想读取一个 bin 在 Y 轴上表示的百分比。 (2认同)