2013-06-26 13 views
13

Mam bardzo irytujący problem z ułożonymi wykresami słupkowymi utworzonymi przy użyciu ggplot2. Jest kilka podobnych pytań zadanych wcześniej, ale po przejściu przez przykładowy kod nie mogę zrozumieć, co robię źle.Porządek i kolor prętów w ggplot2 barplot

Chciałbym utworzyć wykres tak, aby paski były układane w następującej kolejności na podstawie ich Biogeographic.affinity: (od góry do dołu = basian, rozpowszechniony, torresowski i Eyrean). Kolory pasków powinny być następujące: (Bassian = drakgrey, Widespread = lightgrey, Torresian = biały i Eyrean = czarny).

To właśnie zbiór danych wygląda następująco:

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 

Jest to kod Pisałem tak daleko (w tym niektóre z moich nieudanych prób rozwiązania problemu).

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()) 

Daje to podstawowy wykres, ale kolory i kolejność są nadal nieprawidłowe. Aby skorygować kolejność próbowałem, ale to niczego nie zmienia (sfrustrowany) !:

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

Co do zmiany kolorów próbowałem i wydaje się działać, ale to wszystko wygląda kolejność nadal jest zły!

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()) 

proszę o pomoc.

Odpowiedz

14

Kolejność, w której pręty są rysowane (od dołu do góry) w ułożonym prętem w ggplot2, opiera się na uporządkowaniu czynnika, który definiuje grupy. Tak więc współczynnik Biogeographic.affinity musi zostać ponownie uporządkowany. Generalnie używamy reorder (jeśli chcemy zamówić czynnik zgodnie z ciągłymi poziomami), ale tutaj po prostu utworzę nowy uporządkowany czynnik podobny do tego, co próbowałeś zrobić.

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

Teraz, jeśli wypełni barplot korzystając Biog.aff.ord zamiast pierwotnego czynnika i przesłanianie domyślny porządek grupowania definiując aes_group_order jako Biog.aff.ord celu osiągnięcia oczekiwanego rezultatu:

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 rzędu poziomach? Czemu? – agstudy

+9

W bieżącej wersji ggplot2, poziomy czynników zamówienia nie działają już w konkretnym przypadku wykresów słupkowych z 'stat =" tożsamością "' i 'position =" stack "' lub 'position =" fill "'. (Sądzę też, że estetyka "porządek" zniknęła). Zamiast tego, musisz teraz sam posortować ramkę danych do "właściwej" kolejności. Zobacz [tutaj] (https://github.com/hadley/ggplot2/issues/1593). – joran