ggplot2: Modification de l'ordre des piles sur un graphique à barres

j'essaie de faire un graphe à barres empilées avec un facet_wrap, mais je veux que l'ordre de mes variables empilées ("développées") soit inversé. J'ai réorganisé les facteurs, et essayé "order=descendre()," ainsi que "scale_fill_manual" et rien ne semble fonctionner.

Voici mon 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

modification des niveaux de facteur "agriculture" et "développé"

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"

alors, traçage:

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

je veux les parties" développées "des barres en gris sur les parties" disponibles " des barres, qui sont noires. Et la légende devrait correspondre à l'ordre des barreaux aussi.

en outre, est-il possible de déplacer la facet_wrap "All islands" et "Oahu" du haut vers le bas du graphique sous "loi" "dryland" et "agroforesterie."Je vous remercie pour votre aide!!

12
demandé sur Natalie K 2016-01-11 10:32:29

2 réponses

Ce pourrait être une solution.

ce que j'ai fait était de commander l'ensemble de données, de sorte que la valeur que je voulais apparaître la plus proche de l'axe des x apparaissait en premier dans l'ensemble de données. (J'ai utilisé votre ordre de facteurs ici). Cette fixt le positionnement des barres.

Ensuite, nous avons dû changer les couleurs et l'ordre de la légende. Je n'ai pas pu enrouler ma tête autour de scale_fill_grey, donc je l'ai changé en scale_fill_manual à la place, briser.

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

Je ne sais pas si c'est un bug ou une fonctionnalité, et je pense que cela s'est aussi produit avec les versions précédentes de ggplot, mais il semble qu'avec stat_identity la première observation soit tracée la plus proche de l'axe des x, la seconde au-dessus de cela etc.

Démonstration:

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

11
répondu Heroka 2016-01-11 09:20:55

Fwiw, voici une solution avec dplyr et scale_fill_manual pour être explicite sur les couleurs:

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
répondu Mike Wise 2016-01-11 08:41:25