ggplot2: modifica dell’ordine delle pile su un grafico a barre

Sto cercando di creare un grafico a barre in pila con un facet_wrap, ma voglio che l’ordine delle mie variabili impilate (“sviluppato”) venga capovolto. Ho riordinato i fattori e ho provato “order = descend (),” e “scale_fill_manual” e niente sembra funzionare.

Ecco il mio codice:

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 

cambiamento dei livelli di fattore “agricoltura” e “sviluppo”

 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" 

Quindi, tracciare:

 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) 

Il grafo

Voglio che le parti “sviluppate” delle barre siano in grigio sopra alle parti “disponibili” delle barre, che sono nere. E la leggenda dovrebbe corrispondere anche all’ordine delle barre.

Inoltre, è ansible spostare le facet_wrap “Tutte le isole” e “Oahu” nella parte superiore del grafico sotto “loi” “terra asciutta” e “agroforestale”. Grazie per l’aiuto!!

Questa potrebbe essere una soluzione.

Quello che ho fatto è stato ordinare il set di dati, in modo che il valore che volevo apparire più vicino all’asse x apparisse per primo nel set di dati. (Ho usato il tuo ordine di fattori qui). Questo fixt il posizionamento delle barre.

Quindi, abbiamo dovuto cambiare i colors e l’ordine della legenda. Non potevo girare la testa su scale_fill_grey, quindi l’ho cambiato in scale_fill_manual, invece, impostando entrambi i valori e le interruzioni.

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

inserisci la descrizione dell'immagine qui

Non so se si tratta di un bug o di una funzionalità, e penso che questo sia successo anche con le versioni precedenti in ggplot, ma sembra che con stat_identity la prima osservazione sia tracciata più vicina all’asse x, la seconda in cima a quella ecc. .

Dimostrazione:

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

inserisci la descrizione dell'immagine qui

Fwiw, ecco una soluzione con dplyr , e usa scale_fill_manual per essere espliciti sui colors:

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

inserisci la descrizione dell'immagine qui