2012-06-04 7 views
6

Voglio una trama come questa eccetto che ogni sfaccettatura si somma al 100%. In questo momento il gruppo M è 0.05 + 0.25 = 0.30 invece di 0.20 + 0.80 = 1.00.ggplot: frequenze relative di due gruppi

df <- rbind(
    data.frame(gender=c(rep('M',5)), outcome=c(rep('1',4),'0')), 
    data.frame(gender=c(rep('F',10)), outcome=c(rep('1',7),rep('0',3))) 
) 

df 

ggplot(df, aes(outcome)) + 
    geom_bar(aes(y = (..count..)/sum(..count..))) + 
    facet_wrap(~gender, nrow=2, ncol=1) 

(Usando y = ..density .. dà risultati peggiori.)

+0

Le risposte fornite qui sono il metodo corretto Il metodo ..density .. fornito in molte altre risposte, http://stackoverflow.com/questions/10064080/plot-relative-frequencies-with-dodged-bar-plots-in-ggplot2, http: // stackoverflow. it/questions/17368223/ggplot2-multi-gruppo-istogramma-con-in-proporzioni-gruppo-piuttosto che-frequenza, http://stackoverflow.com/questions/3695497/ggplot-showing-instead-of-counts- In-charts-of-categorical-variables restituisce valori errati a vari livelli. – russellpierce

risposta

9

Io di solito fare questo semplicemente il ricalcolo dei valori al di fuori della ggplot2 e utilizzando stat = "identity":

df1 <- melt(ddply(df,.(gender),function(x){prop.table(table(x$outcome))}),id.vars = 1) 

ggplot(df1, aes(x = variable,y = value)) + 
    facet_wrap(~gender, nrow=2, ncol=1) + 
    geom_bar(stat = "identity") 
+0

Questo è corretto. Sto sperando in una risposta più semplice per quello che sembra un tipo di grafico relativamente comune. :) – Andrew

+0

@andrew - Lo faccio * alot *. È relativamente facile creare il proprio 'geom', e questa sarebbe una grande aggiunta agli strumenti incorporati per ggplot2. – Chase

+0

@Chase I potrebbe essere sbagliato, ma penso che ci vorrebbe più di una nuova geom perché (penso) l'estetica è mappata alle variabili prima che la sfaccettatura sia fatta. Quindi penso che questa potrebbe essere una caratteristica del design a monte della geom. – joran

16

ecco un altro modo

ggplot(df, aes(outcome)) + 
    geom_bar(aes(y = ..count../sapply(PANEL, FUN=function(x) sum(count[PANEL == x])))) + 
    facet_wrap(~gender, nrow=2, ncol=1) 
+1

Che bel trucco! – joran

+0

Mi piace come sia breve, ma quando provo a passare da facet a position = dodge, l'altezza si somma al 100% su tutti i gruppi (invece che all'interno dei gruppi) – Andrew

+0

Vorrei poter invogliare di più. – Eduardo

Problemi correlati