web-dev-qa-db-fra.com

Normalisation de l'axe des y dans les histogrammes dans R ggplot pour proportionner par groupe

Ma question est très similaire à Normalisation de l'axe des y dans les histogrammes dans R ggplot to proportion , sauf que j'ai deux groupes de données de taille différente, et je voudrais que chaque proportion soit relative à sa taille de groupe au lieu de la taille totale.

Pour le rendre plus clair, disons que j'ai deux ensembles de données dans une trame de données:

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))

Je peux tracer les deux distributions avec:

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

et au lieu de la fréquence sur l'axe Y je peux avoir la proportion avec:

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

Mais cela donne la proportion par rapport à la taille totale des données (500 points ici): est-il possible de l'avoir par rapport à chaque taille de groupe?

Mon objectif ici est de permettre de comparer visuellement la proportion de valeurs dans un bac donné entre A et B, indépendamment de leur taille respective. Les idées qui diffèrent de la mienne sont également les bienvenues!

Merci!

35
Erwan

Comme ça? [édité sur la base des commentaires d'OP]

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

L'utilisation de y=..density.. Met à l'échelle les histogrammes pour que la zone sous chacun soit 1, ou sum(binwidth*y)=1. Par conséquent, vous utiliseriez y = binwidth*..density.. Pour que y représente la fraction du total dans chaque poubelle. Dans votre cas, binwidth=0.5.

OMI, c'est un peu plus facile à interpréter:

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