2013-07-15 10 views
5

Come è possibile tracciare le proporzioni relative di due gruppi utilizzando un riempimento estetico in ggplot2?Come posso tracciare le proporzioni relative di due gruppi usando un riempimento estetico in ggplot2?

Chiedo a questa domanda qui perché diverse altre risposte su questo argomento sembrano non corretta (ex1, ex2, e ex3), ma Croce Validated sembra avere domande specifiche funzionalmente vietato R (CV meta). ..density.. è concettualmente correlato a, ma distinto dalle proporzioni (ex4 e ex5). Quindi la risposta corretta non sembra implicare la densità.

Esempio:

set.seed(1200) 
test <- data.frame(
    test1 = factor(sample(letters[1:2], 100, replace = TRUE,prob=c(.25,.75)),ordered=TRUE,levels=letters[1:2]), 
    test2 = factor(sample(letters[3:8], 100, replace = TRUE),ordered=TRUE,levels=letters[3:8]) 
) 
ggplot(test, aes(test2)) + geom_bar(aes(y = ..density.., group=test1, fill=test1) ,position="dodge") 
#For example, the plotted data shows level a x c as being slightly in excess of .15, but a manual calculation shows a value of .138 
counts <- with(test,table(test1,test2)) 
counts/matrix(rowSums(counts),nrow=2,ncol=6) 

La risposta che sembra produrre un output che è correct località di una soluzione che non utilizza ggplot2 (calcolando fuori di ggplot2) oppure richiede che un pannello utilizzare anziché un riempimento estetico.

Modifica: L'inserimento in stat_bin produce che la funzione alla fine chiamata è bin, ma bin ottiene solo i valori in x aes. Senza riscrivere stat_bin (o eseguendo un'altra stat_) l'hack applicato nella risposta referenziata sopra può essere generalizzato al fill aes in assenza del gruppo aes con il seguente codice per le azioni: y = ..count../sapply(fill, FUN=function(x) sum(count[fill == x])). Questo sostituisce semplicemente PANEL (la colonna nascosta che è presente alla fine di StatBin) con riempimento). Presumibilmente altre variabili nascoste potrebbero ottenere lo stesso trattamento.

+0

Come funziona questo generalizzare i casi in cui ho, diciamo, una trama divisa in gruppi e poi sfaccettato in pannelli? – RoyalTS

+0

@RoyalTS: Credo che lo stesso problema si applichi perché il problema è che non c'è (o almeno non c'era) una funzione stat_ appropriata in ggplot2. Ho scritto una bozza di soluzione che funziona come un drop-in con ggplot2 ... ma non sono sicuro di quanto sia solido, quindi non l'ho postato. – russellpierce

risposta

5

Questo è un trucco pessima, ma sembra di fare quello che vuoi ...

ggplot(test, aes(test2)) + geom_bar(aes(y = ..count../rep(c(sum(..count..[1:6]), sum(..count..[7:12])), each=6), 
            group=test1, fill=test1) ,position="dodge") + 
             scale_y_continuous(name="proportion") 
+4

+1 anche se è un modesto scalpore. Come hai determinato la struttura dati sottostante di ..count .. per arrivare a questo? Sapere che è la chiave per inventare qualcosa che assomigli a una soluzione generale. – russellpierce

Problemi correlati