2013-06-26 16 views
13

Ho un problema molto fastidioso con un grafico a barre impilato creato utilizzando ggplot2. Ci sono un paio di domande simili precedentemente fatte ma dopo aver esaminato il codice di esempio non riesco a capire cosa sto facendo male.Ordine e colore delle barre nel barplot ggplot2

Vorrei fare il grafico in modo che le barre siano impilate nel seguente ordine in base al loro Biogeographic.affinity: (Dall'alto al basso = Bassiano, Diffuso, Torresiano e Eyrean). I colori delle barre dovrebbero essere: (Bassian = drakgrey, diffuso = lightgrey, Torresian = bianco, e Eyrean = nero).

Questo è ciò che il set di dati appare come:

biogeo 
     Site Biogeographic.affinity Rank Number.of.species Total.Species Percent 
    1  A    Bassian 1     1   121 0.8264463 
    2  A     Eyrean 4    39   121 32.2314050 
    3  A    Torresian 3    62   121 51.2396694 
    4  A    Widespread 2    19   121 15.7024793 
    5 DD    Bassian 1     1   128 0.7812500 
    6 DD     Eyrean 4    46   128 35.9375000 
    7 DD    Torresian 3    63   128 49.2187500 
    8 DD    Widespread 2    18   128 14.0625000 
    9 E_W    Bassian 1     1   136 0.7352941 
    10 E_W     Eyrean 4    54   136 39.7058824 
    11 E_W    Torresian 3    65   136 47.7941176 
    12 E_W    Widespread 2    16   136 11.7647059 
    13 KS    Bassian 1     2   145 1.3793103 
    14 KS     Eyrean 4    63   145 43.4482759 
    15 KS    Torresian 3    62   145 42.7586207 
    16 KS    Widespread 2    18   145 12.4137931 
    17 Z_Ka    Bassian 1     1   110 0.9090909 
    18 Z_Ka     Eyrean 4    64   110 58.1818182 
    19 Z_Ka    Torresian 3    31   110 28.1818182 
    20 Z_Ka    Widespread 2    14   110 12.7272727 

Questo è il codice che ho scritto finora (tra cui alcuni dei miei tentativi falliti di risolvere il problema).

ggplot(data=biogeo, aes(x=Site, y=Percent, fill=Biogeographic.affinity)) + geom_bar(stat="identity", colour="black")+ 
    scale_fill_grey() + ylab("Percent") + xlab("Location") +  
    theme_bw()+ theme(panel.grid.minor = element_blank()) 

Fornisce il grafico di base ma i colori e l'ordine sono ancora errati. Per correggere l'ordine ho provato, ma questo non ha cambiato nulla (FRUSTRATO) !:

newone <- transform(biogeo, Biogeographic.affinity = factor(Biogeographic.affinity), Rank = factor(Rank, levels = 1:4)) 

quanto riguarda il colore che cambia ho provato e sembra funzionare, ma il tutto sembra che l'ordine è ancora sbagliata!

cols<- c("Bassian"="darkgrey","Widespread"="lightgrey", "Torresian"="white", "Eyrean"="black") #designates the colors of the bars 
ggplot(data=newone, aes(x=Site, y=Percent, fill=Biogeographic.affinity)) + geom_bar(stat="identity", colour="black")+ 
    scale_fill_manual(values = cols) + ylab("Percent") + xlab("Location") +  
    theme_bw()+ theme(panel.grid.minor = element_blank()) 

please help.

risposta

14

L'ordine in cui le barre sono disegnate (dal basso verso l'alto) in un barattolo impilato in ggplot2 si basa sull'ordinamento del fattore che definisce i gruppi. Quindi il fattore Biogeographic.affinity deve essere riordinato. Generalmente usiamo reorder (se vogliamo ordinare il fattore secondo un livello continuo) ma qui creerò solo un nuovo fattore ordinato simile a quello che hai provato a fare.

biogeo <- transform(biogeo, 
       Biog.aff.ord = factor(
        Biogeographic.affinity , 
        levels=c('Bassian','Widespread','Torresian', 'Eyrean'), 
        ordered =TRUE)) 

Ora, se si compila il tuo barplot utilizzando Biog.aff.ord piuttosto che il fattore originale e ignorando l'ordine di raggruppamento di default, definendo aes_group_order come Biog.aff.ord fine si ottiene il risultato atteso:

cols <- c(Bassian="darkgrey",Widespread="lightgrey", 
      Torresian="white", Eyrean="black") 
ggplot(data=biogeo, aes(x=Site, y=Percent, 
     order=Biog.aff.ord)) + ##!! aes_group_order 
    geom_bar(stat="identity", colour="black", 
     aes(fill=Biog.aff.ord)) + 
    scale_fill_manual(values = cols) 

enter image description here

+0

@IDelToro l'ordine dei livelli? Perché? – agstudy

+9

Nella versione corrente di ggplot2, i livelli dei fattori di ordine non funzionano più nel caso specifico di diagrammi a barre con 'stat =" identity "' e 'position =" stack "' o 'position =" fill "'. (Inoltre, credo che l'estetica 'order' sia andata via.) Invece, ora devi effettivamente ordinare il frame stesso nell'ordine" corretto ". Vedi [qui] (https://github.com/hadley/ggplot2/issues/1593). – joran

Problemi correlati