web-dev-qa-db-fra.com

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

J'ai une question très simple qui me fait me cogner la tête contre le mur.

Je voudrais mettre à l'échelle l'axe des y de mon histogramme pour refléter la proportion (0 à 1) que chaque casier représente, au lieu d'avoir la surface des barres somme à 1, comme en utilisant y = .. densité .. fait, ou ayant la barre la plus élevée égale à 1, comme y = .. ncount .. le fait.

Mon entrée est une liste de noms et de valeurs, formatée comme suit:

name    value
A   0.0000354
B   0.00768
C   0.00309
D   0.000123

Une de mes tentatives infructueuses:

library(ggplot2)
mydataframe < read.delim(mydata)
ggplot(mydataframe, aes(x = value)) +
geom_histogram(aes(x=value,y=..density..))

Cela me donne un histogramme avec la zone 1, mais des hauteurs de 2000 et 1000:

try

et y = .. ncount .. me donne un histogramme avec la barre la plus élevée 1.0, et reste à l'échelle:

try

mais je voudrais que la première barre ait une hauteur de 0,5 et les deux autres 0,25.

R ne reconnaît pas non plus ces utilisations de scale_y_continuous.

scale_y_continuous(formatter="percent")
scale_y_continuous(labels = percent)
scale_y_continuous(expand=c(1/(nrow(mydataframe)-1),0)

Merci pour toute aide.

44
First Last

Notez que ..ncount.. redimensionne à un maximum de 1,0, tandis que ..count.. est le nombre de bacs non mis à l'échelle.

ggplot(mydataframe, aes(x=value)) +
  geom_histogram(aes(y=..count../sum(..count..)))

Qui donne:

enter image description here

62
Andy

Depuis ggplot2 0.9, la plupart des fonctions du formateur ont été déplacées dans le package des échelles, y compris percent_format().

library(ggplot2)
library(scales)

mydataframe <- data.frame(name = c("A", "B", "C", "D"),
                          value = c(0.0000354, 0.00768, 0.00309, 0.000123))

ggplot(mydataframe) + 
  geom_histogram(aes(x = value, y = ..ncount..)) +
  scale_y_continuous(labels = percent_format())
15
aaronwolen

Depuis la dernière et la meilleure version de ggplot2 3.0.0, le format a changé. Vous pouvez maintenant encapsuler la valeur y dans stat() plutôt que de jouer avec .. des trucs.

ggplot(mydataframe, aes(x = value)) +
  geom_histogram(aes(y = stat(count / sum(count))))
13
CephBirk