2016-01-11 385 views
12

Ich versuche, ein gestapeltes Balkendiagramm mit einer facet_wrap zu erstellen, aber ich möchte, dass die Reihenfolge meiner gestapelten Variablen ("entwickelt") gewendet wird. Ich habe die Faktoren neu geordnet und habe "order = descend()" sowie "scale_fill_manual" ausprobiert und nichts scheint zu funktionieren.ggplot2: Ändern der Reihenfolge der Stapel in einem Balkendiagramm

Hier ist mein Code:

developed=rep(c("developed","available"),6) 
agriculture=rep(c(rep("loi",2), rep("dryland",2), rep("agroforestry",2)),2) 
acres=c(7435,24254,10609,120500,10651,75606,6037,9910,4390,895,9747,46893) 
islands=c(rep("All islands",6), rep("Oahu",6)) 
all_is2=data.frame(developed, agriculture, acres, islands) 
head(all_is2) 
    developed agriculture acres  island 
1 developed   loi 7435 All islands 
2 available   loi 24254 All islands 
3 developed  dryland 10609 All islands 
4 available  dryland 120500 All islands 
5 developed agroforestry 10651 All islands 
6 available agroforestry 75606 All islands 

ändernden Faktor Ebenen der "Landwirtschaft" und "entwickelt"

all_is2$agriculture=factor(all_is2$agriculture,levels=c("loi","dryland","agroforestry")) 
all_is2$developed=factor(all_is2$developed,levels=c("developed","available")) 
levels(all_is2$developed) 
[1] "developed" "available" 

Dann Plotten:

ggplot(all_is2,aes(x=agriculture,y=acres,fill=developed))+ 
    geom_bar(position="stack", stat="identity")+ 
    facet_wrap(~islands)+ scale_fill_grey(start=0.8, end=0.2, name="")+ xlab("")+ylab("Acres")+theme_bw()+ scale_y_continuous(labels=comma) 

The Graph

Ich möchte die "entwickelten" Teile der Stäbe in Grau auf den "verfügbaren" Teilen der Stäbe, die schwarz sind. Und die Legende sollte auch der Reihenfolge der Bars entsprechen.

Auch ist es möglich, die facet_wrap "Alle Inseln" und "Oahu" an die Spitze der Grafik unter "Loi" "Dryland" und "Agroforestry" zu verschieben. Danke für Ihre Hilfe!!

+0

Sie müssen die Reihenfolge der Faktoren umkehren. ('levels = c (" verfügbar "," entwickelt ")'). Und Facetten sind immer oben oder neben dem Plot, wenn Sie Etiketten unter einem Ansatz mit grid.arrange wollen, könnte der Weg sein. – Heroka

+0

Ich habe das ausprobiert, die Faktoren bei levels = c ("available", "developed") belassen, aber was ich bekomme ist die oben aufgestapelte Graue und entwickelte Stacks auf der Unterseite in Schwarz. (http://imgur.com/ne3iNhk) –

+0

Fast scheint wie ein Fehler. –

Antwort

10

Dies könnte eine Lösung sein.

Ich ordnete das Dataset, sodass der Wert, der der x-Achse am nächsten kommen sollte, zuerst im Dataset angezeigt wurde. (Ich habe Ihre Reihenfolge der Faktoren hier verwendet). Dies fixiert die Positionierung der Stäbe.

Dann mussten wir die Farben und Reihenfolge der Legende ändern. Ich konnte meinen Kopf nicht um scale_fill_grey wickeln, also änderte ich ihn stattdessen in scale_fill_manual und setzte sowohl Werte als auch Pausen.

ggplot(all_is2[rev(order(all_is2$developed)),] ,aes(x=agriculture,y=acres,fill=developed))+ 
    geom_bar(position="stack", stat="identity")+theme_bw()+ 
    facet_wrap(~islands)+ 
    scale_fill_manual(values=c(developed="grey80",available="grey20"),name="", 
        breaks=c("developed","available"))+ 
xlab("")+ylab("Acres") 

enter image description here

Ich weiß nicht, ob es ein Bug oder ein Feature ist, und ich denke, das ist auch mit früheren Versionen in ggplot passiert ist, aber es scheint, dass mit stat_identity der ersten Beobachtung aufgetragen ist am nächsten die x-Achse, die zweite auf der Oberseite des usw.

Demonstration:

set.seed(123) 
testdat <- data.frame(x=1,y=sample(5)) 


p1 <- ggplot(testdat, aes(x=x,y=y,fill=factor(y))) +geom_bar(stat="identity")+labs(title="order in dataset") 
p2 <- ggplot(testdat[order(testdat$y),],aes(x=x,y=y,fill=factor(y))) + 
    geom_bar(stat="identity") + labs(title="ordered by y") 
p3 <- ggplot(testdat[rev(order(testdat$y)),],aes(x=x,y=y,fill=factor(y))) + 
    geom_bar(stat="identity") + labs(title="reverse ordered by y") 

enter image description here

+2

Oh, du hast mich geschlagen! Sehen Sie sich 'facet_wrap (~ inslands, switch =" x ")' an, um die darunter liegenden Facetten-Labels zu verschieben. Es ist ein neues Feature von 'ggplot2_2.0.0' – Jota

+0

@Jota Ich wusste das nicht, danke! – Heroka

+0

Die Tatsache, dass Sie das Diagramm durch die Bestellung des Datensatzes steuern müssen, erscheint seltsam. Aber ich dachte, dass es 'dplyr' intern verwendet, also könnte es dasselbe wie meines sein. –

1

FWIW, hier ist eine Lösung mit dplyr, und es verwendet scale_fill_manual über die Farben explizit zu sein:

library(ggplot2) 
library(dplyr) 

developed=rep(c("developed","available"),6) 
agriculture=rep(c(rep("loi",2), rep("dryland",2), rep("agroforestry",2)),2) 
acres=c(7435,24254,10609,120500,10651,75606,6037,9910,4390,895,9747,46893) 
islands=c(rep("All islands",6), rep("Oahu",6)) 
all_is2=data.frame(developed, agriculture, acres, islands) 

all_is2$agriculture=factor(all_is2$agriculture,levels=c("loi","dryland","agroforestry")) 
#all_is2$developed=factor(all_is2$developed,levels=c("available","developed")) 

all_is3 <- all_is2 %>% group_by(islands,agriculture,developed) %>% 
         summarize(acres=sum(acres)) 

ggplot(all_is3,aes(x=agriculture,y=acres,fill=developed))+ 
    geom_bar(position="stack", stat="identity")+ 
    facet_wrap(~islands)+ 
    xlab("")+ylab("Acres")+theme_bw() + 
    scale_fill_manual(name="",values=c("available"="black","developed"="light gray")) 

enter image description here

+1

Danke @mikewise! –

+0

Ihr Willkommen, und ich dachte, es war eine gute Frage von Anfang an. Ich habe etwas daraus gelernt. Freut mich zu sehen, dass du all diese Upvotes auch hast (eins gehört mir), du bist jetzt gut etabliert. –

+0

Ja, das war mein erster Beitrag, weil es so ärgerlich war, und ich konnte wirklich tagelang keine Lösung online finden. Aber es war gut, einen Beitrag zu schreiben, ich habe auch viel gelernt! –