首页 文章

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

提问于
浏览
29

我的问题非常类似于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之间给定箱中的值的比例,而与它们各自的大小无关 . 也欢迎与我的原创不同的想法!

谢谢!

1 回答

  • 36

    像这样? [根据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)
    

相关问题