2010-09-01 31 views
20

Sono un principiante con ggplot2 e ho una domanda sulla generazione di un grafico a barre impilato. Ho controllato il libro e la pagina web dedicata, ma non posso risolvere il problema. Ho due fattori, uno dei quali ha 2 livelli (presenza-assenza), gli altri 10 livelli. Chiamiamo questi due "variabili" e "frutto".Grafico a barre in pila in R (ggplot2) con asse y barre in percentuale dei conteggi

Vorrei creare un grafico a barre impilate in cui ogni barra riflette un tipo di frutto e il numero di osservazioni di presenza e assenza in "variabile" sono impilati uno sopra l'altro. Questo è relativamente facile (vedere il codice per la trama 1 di seguito), ma vorrei anche che le barre e l'asse y esprimessero il numero di conteggi di presenza-assenza in "variabile" come percentuale. In altre parole, tutte le barre dovrebbero avere la stessa altezza (che riflette un totale di 100%) e i conteggi delle osservazioni di presenza e assenza dovrebbero essere convertiti in percentuali.

Posso cambiare la scala dell'asse y in una percentuale utilizzando .. conto .. * 100/sum (.. count ..) ma non riesco a capire come convertire le barre effettive. Ho creato un'altra trama con sfaccettatura (codice per la trama 2 di seguito) che realizza ciò che voglio in termini di percentuali, ma preferirei le due barre una sopra l'altra. Qualcuno ha un'idea di come ottenere questo? Ho fornito dati fittizi e esempi riproducibili. Grazie per qualsiasi aiuto.

Steve

dat <- data.frame(fruit=c("Apple", "Apple", "Orange", "Orange", "Orange", "Orange", 
        "Orange", "Pear", "Pear", "Pear"), variable=c("Present", "Absent", 
        "Present", "Present", "Present", "Present", "Absent", "Absent", 
        "Absent", "Present")) 

# stacked bar plot 
ggplot(dat, aes(x = fruit, fill = variable)) + 
    geom_bar(aes(y = ..count..*100/sum(..count..))) + 
    xlab("Fruit") + 
    ylab("Would like this to be percentage") + 
    scale_fill_manual("Condition", values = alpha(c("firebrick", "dodgerblue4"), 1)) 

enter image description here

# with faceting 
ggplot(dat, aes(x = variable, fill = variable)) + 
    geom_bar(aes(y = ..count..*100/sum(..count..))) + 
    facet_grid(. ~ fruit) + 
    xlab("Fruit") + 
    ylab("Would like this to be percentage") + 
    scale_fill_manual("Condition", values = alpha(c("firebrick", "dodgerblue4"), 1)) 

enter image description here

risposta

24

Per il primo grafico, è sufficiente aggiungere la posizione = 'riempimento' alla linea geom_bar!. In realtà non è necessario ridimensionare i conteggi poiché ggplot ha un modo per farlo automaticamente.

ggplot(dat, aes(x = fruit)) + geom_bar(aes(fill = variable), position = 'fill') 
+0

Grazie Ramnath, è esattamente ciò di cui ho bisogno per le barre. Quando lo faccio, tuttavia, le etichette dell'asse y tornano a una scala da 0 a 1. Mi piacerebbe che fossero da 0 a 100. Includendo y = .. accounts .. * 100 o y = ..density .. * 100 in "aes" non sembra funzionare. Qualche idea? – Steve

+4

'+ scale_y_continuous (" ", formatter =" percent ")'. L'iniziale "" "elimina l'etichetta" count ", ma è possibile includere qualsiasi etichetta desiderata. – James

+0

Grazie mille James, che funziona perfettamente. – Steve

Problemi correlati