2013-03-06 11 views
24

sto chiamando la funzione ggplotCome si ordina il fill-colori all'interno ggplot2 geom_bar

ggplot(data,aes(x,y,fill=category)+geom_bar(stat="identity") 

Il risultato è un barplot con barre piene da vari colori corrispondenti alla categoria. Tuttavia, l'ordine dei colori non è coerente da barra a barra. Diciamo che c'è rosa, verde e blu. Alcune barre diventano rosa, verde, blu dal basso verso l'alto e alcune diventano verdi, rosa, blu. Non vedo alcun modello ovvio.

Come vengono scelti questi ordini? Come posso cambiarlo? Per lo meno, come posso fare in modo che ggplot scelga un ordinamento coerente?

La classe di (x, y e categoria) sono rispettivamente (numero intero, numerico e fattore). Se faccio della categoria un fattore ordinato, non cambia questo comportamento.

Qualcuno sa come risolvere questo problema?

esempio riproducibile:

dput(data) 

structure(list(mon = c(9L, 10L, 11L, 10L, 8L, 7L, 7L, 11L, 9L, 
10L, 12L, 11L, 7L, 12L, 8L, 12L, 9L, 7L, 9L, 10L, 10L, 8L, 12L, 
7L, 11L, 10L, 8L, 7L, 11L, 12L, 12L, 9L, 9L, 7L, 7L, 12L, 12L, 
9L, 9L, 8L), gclass = structure(c(9L, 1L, 8L, 6L, 4L, 4L, 3L, 
6L, 2L, 4L, 1L, 1L, 5L, 7L, 1L, 6L, 8L, 6L, 4L, 7L, 8L, 7L, 9L, 
8L, 3L, 5L, 9L, 2L, 7L, 3L, 5L, 5L, 7L, 7L, 9L, 2L, 4L, 1L, 3L, 
8L), .Label = c("Down-Down", "Down-Stable", "Down-Up", "Stable-Down", 
"Stable-Stable", "Stable-Up", "Up-Down", "Up-Stable", "Up-Up" 
), class = c("ordered", "factor")), NG = c(222614.67, 9998.17, 
351162.2, 37357.95, 4140.48, 1878.57, 553.86, 40012.25, 766.52, 
15733.36, 90676.2, 45000.29, 0, 375699.84, 2424.21, 93094.21, 
120547.69, 291.33, 1536.38, 167352.21, 160347.01, 26851.47, 725689.06, 
4500.55, 10644.54, 75132.98, 42676.41, 267.65, 392277.64, 33854.26, 
384754.67, 7195.93, 88974.2, 20665.79, 7185.69, 45059.64, 60576.96, 
3564.53, 1262.39, 9394.15)), .Names = c("mon", "gclass", "NG" 
), row.names = c(NA, -40L), class = "data.frame") 

ggplot(data,aes(mon,NG,fill=gclass))+geom_bar(stat="identity") 
+2

esempio riproducibile per favore? –

+0

BTW: Brian ha confermato per me che questo è in effetti un bug (un po 'vecchio). – joran

+0

Attenzione lettore: questo comportamento è sfortunatamente cambiato più volte nella cronologia recente di ggplot2 e alcuni degli esempi nelle risposte non funzionano più. –

risposta

21

È necessario specificare anche l'estetica order.

ggplot(data,aes(mon,NG,fill=gclass,order=gclass))+ 
    geom_bar(stat="identity") 

enter image description here

Questo può o non può essere un bug.

+2

Fantastico. Questo lo fa – Dave31415

4

È possibile modificare il colore utilizzando i scale_fill_ funzioni. Per esempio:

ggplot(dd,aes(mon,NG,fill=gclass)) + 
    geom_bar(stat="identity") + 
    scale_fill_brewer(palette="blues") 

Per ottenere ordinamento consistente nel bars, allora avete bisogno di ordinare il frame di dati:

dd = dd[with(dd, order(gclass, -NG)), ] 

Al fine di modificare l'ordinamento della leggenda, alterare il fattore gclass. Quindi, qualcosa di simile a:

dd$gclass= factor(dd$gclass,levels=sort(levels(dd$gclass), TRUE)) 

enter image description here

+1

Ti sembra un ordinamento coerente per te? Sto avendo lo stesso problema che l'OP è con i suoi dati. Qualcosa di strano sta succedendo qui. – joran

+0

@joran Ahh, ora vedo il problema! – csgillespie

+0

@ Dave31415 Penso di aver risposto alla domanda, tuttavia, la mia comprensione del ** perché ** questo lavoro è un po 'ropey. – csgillespie

1

Per ordinare, è necessario utilizzare il parametro levels e informare l'ordine. In questo modo:

data$gclass 
(data$gclass2 <- factor(data$gclass,levels=sample(levels(data$gclass)))) # Look the difference in the factors order 
ggplot(data,aes(mon,NG,fill=gclass2))+geom_bar(stat="identity") 
38

A partire da ggplot2_2.0.0, l'estetica order non è più disponibile. Per ottenere un grafico con gli stack ordinati per colore di riempimento, è possibile ordinare semplicemente il set di dati in base alla variabile di raggruppamento che si desidera ordinare.

Io uso spesso arrange da dplyr per questo. Qui sto ordinando il set di dati tramite il fattore fill all'interno della chiamata ggplot anziché creare un set di dati ordinato ma funzionerà correttamente.

library(dplyr) 

ggplot(arrange(data, gclass), aes(mon, NG, fill = gclass)) + 
    geom_bar(stat = "identity") 

Questo è fatto facilmente nella base di R, ovviamente, utilizzando il classico order con le staffe estratto:

ggplot(data[order(data$gclass), ], aes(mon, NG, fill = gclass)) + 
    geom_bar(stat = "identity") 

con la trama risulta in entrambi i casi ora nell'ordine desiderato: enter image description here

aggiornamento ggplot2_2.2.0

In ggplot_2.2.0, l'ordine di riempimento si basa sull'ordine dei livelli dei fattori. L'ordine predefinito trarrà il primo livello allo in cima allo anziché al fondo.

Se si desidera il primo livello nella parte inferiore della pila, è possibile utilizzare reverse = TRUE in position_stack. Nota puoi anche usare geom_col come scorciatoia per geom_bar(stat = "identity").

ggplot(data, aes(mon, NG, fill = gclass)) + 
    geom_col(position = position_stack(reverse = TRUE)) 
+0

Sembra funzionare bene con stat = "identità", ma fallisce con geom_bar (stat = "summary", fun.y = mediana). In questo caso ho dovuto riepilogare i dati e usare stat = "identità" per ottenere un ordine appropriato. Credo che questo sia nuovo dal 2.0 –

+0

@ EtienneLow-Décarie Potrebbe essere che 'stat_summary_bin' sia lo strumento appropriato per questo. Hai provato a usare 'stat =" summary_bin "' invece di 'stat =" summary "'? – aosmith

+0

Ugh, questo era abbastanza fastidioso. Qualcuno può commentare perché l'estetica 'order' è stata rimossa? Per riferimento: https://github.com/hadley/ggplot2/issues/1593 – fanli

Problemi correlati