ggplot2: cambiar el orden de las stacks en un gráfico de barras

Estoy tratando de hacer un gráfico de barras astackdas con facet_wrap, pero quiero que se cambie el orden de mis variables astackdas (“desarrolladas”). Reordené los factores y probé “order = descender ()”, así como “scale_fill_manual” y nada parece funcionar.

Aquí está mi código:

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 

cambiando los niveles de los factores de “agricultura” y “desarrollo”

 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" 

Entonces, ttwigndo:

 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) 

La gráfica

Quiero que las partes “desarrolladas” de las barras estén en gris encima de las partes “disponibles” de las barras, que son negras. Y la leyenda debe coincidir con el orden de las barras también.

Además, ¿es posible mover facet_wrap “All islands” y “Oahu” en la parte superior a la parte inferior del gráfico en “loi” “tierras secas” y “agroforestería”. ¡¡Gracias por tu ayuda!!

Esta podría ser una solución.

Lo que hice fue ordenar el conjunto de datos, por lo que el valor que quería que aparezca más cercano al eje x apareció primero en el conjunto de datos. (He utilizado su orden de factores aquí). Este fixt el posicionamiento de las barras.

Luego, tuvimos que cambiar los colores y el orden de la leyenda. No podía entenderme con scale_fill_grey, así que lo cambié a scale_fill_manual, estableciendo valores y saltos.

 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

No sé si es un error o una característica, y creo que esto también sucedió con versiones anteriores en ggplot, pero parece que con stat_identity la primera observación se traza más cerca del eje x, la segunda encima de eso, etc. .

Demostración:

 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

Fwiw, aquí hay una solución con dplyr , y usa scale_fill_manual para ser explícito sobre los colores:

 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

Intereting Posts