2012-08-01 22 views
31

Ho una domanda molto semplice che mi fa sbattere la testa contro il muro.Normalizzazione dell'asse y negli istogrammi in R ggplot in proporzione

Vorrei ridimensionare l'asse y del mio istogramma in modo che rifletta la proporzione (da 0 a 1) che ogni scomparto compila, invece di avere l'area delle barre sommata a 1, come usando y = .. densità .. fa, o avendo la barra più alta essere 1, come y = .. ncount .. fa.

mio input è una lista di nomi e valori, formattato in questo modo:

name value 
A 0.0000354 
B 0.00768 
C 0.00309 
D 0.00

Uno dei miei tentativi falliti:

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

Questo mi dà un istogramma con zona 1, ma altezze di 2000 e 1000:

try

e y = .. nCount. . Mi dà un istogramma con bar più alto 1.0 e resto scalato ad esso:

try

ma desidero avere la prima barra hanno un'altezza di 0,5, e gli altri due 0,25.

R non riconosce questi usi di scale_y_continuous.

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

Grazie per qualsiasi aiuto.

risposta

46

Si noti che il numero di copie da ..ncount.. a un massimo di 1,0, mentre ..count.. è il conteggio del contenitore non ridimensionato.

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

che dà:

enter image description here

+1

Questo è esattamente quello che stavo cercando. Mi fai sentire un idiota e ti sono davvero grato! –

+6

Non avevo idea che fosse possibile fare qualcosa del genere. Grazie a questo suggerimento sono in grado di produrre un istogramma di sopravvivenza/affidabilità (cioè 1-CDF) usando 'aes (y = 1-cumsum (.. count ..)/sum (.. count ..))'. – dnlbrky

11

A partire dal ggplot2 0.9, molte delle funzioni di formattazione sono stati spostati al pacchetto scale, tra cui 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()) 
+0

Grazie per il chiarimento! Mi stavo chiedendo cosa c'era di sbagliato nel mio formato ... –

Problemi correlati