Нормализация оси y в гистограммах в R ggplot до пропорции по группам - программирование

Нормализация оси y в гистограммах в R ggplot до пропорции по группам

Мой вопрос очень похож на нормализовать ось y в гистограммах в R ggplot до пропорции, за исключением того, что у меня есть две группы данных разного размера, и я бы так что каждая пропорция зависит от размера ее группы, а не от общего размера.

Чтобы сделать его более понятным, скажем, у меня есть два набора данных в кадре данных:

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 точек): возможно ли это относить к каждому размеру группы?

Моя цель заключается в том, чтобы дать возможность визуально сравнить долю значений в данном бункере между А и В независимо от их соответствующего размера. Идеи, которые отличаются от моего оригинального, также приветствуются!

Спасибо!

4b9b3361

Ответ 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 представляла долю от общего числа в каждом бине. В вашем случае 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)