ggplot2 直方图显示组的比例而不是计数

ggplot2 histogram showing proportion of group by bin instead of count

假设数据集由两组组成:

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

我们可以像这样用两组绘制直方图:

ggplot(all,aes(value,fill=dataset))+geom_histogram(bins=50,position='stack')

我想获得相同类型的图,但使用每个组的 比例而不是每个 bin 的计数

我通过手动计算每个组的比例找到了以下方法:

ggplot(all,aes(x=value,fill=dataset))+geom_histogram(aes(y=c(..count..[..group..==1]/(..count..[..group..==1]+..count..[..group..==2]),..count..[..group..==2]/(..count..[..group..==1]+..count..[..group..==2]))),position='stack',bins=50)+ylab('proportion')

这给出了预期的结果(如下),但这是一个非常不优雅的解决方案。我可能在这里遗漏了一些东西,是否有更好的方法来获得相同(或相似)的结果?

library(ggplot2) 
library(scales)
  
dataA<-rnorm(200,3,sd=2)
dataB<-rnorm(500,5,sd=3)
all<-data.frame(dataset=c(rep('A',length(dataA)),rep('B',length(dataB))),value=c(dataA,dataB))  
  
ggplot(all, aes(value, fill = dataset)) +
  geom_histogram(aes(y = stat(count / sum(count)))) +
  scale_y_continuous(labels = scales::percent_format())
#> `stat_bin()` using `bins = 30`. Pick better value with `binwidth`.

reprex package (v2.0.1)

于 2022 年 1 月 15 日创建

您可能正在寻找 position = 'fill' 而不是 'stack'

library(ggplot2)
set.seed(42)

dataA <- rnorm(200, 3, sd = 2)
dataB <- rnorm(500, 5, sd = 3)

all <- data.frame(
  dataset = c(rep('A', length(dataA)),rep('B', length(dataB))),
  value   = c(dataA, dataB)
)

ggplot(all, aes(value, fill = dataset)) +
  geom_histogram(bins = 50, position = 'fill')
#> Warning: Removed 14 rows containing missing values (geom_bar).

reprex package (v2.0.1)

于 2022 年 1 月 15 日创建