Ggplot2: изменение порядка стеков на гистограмме

Я пытаюсь сделать сложенную гистограмму с facet_wrap, но я хочу, чтобы список моих сложенных переменных ( "разработанных" ) был перевернут. Я переупорядочил факторы и попытался "order = descend()", а также "scale_fill_manual", и ничего не работает.

Вот мой код:

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

изменение уровней факторов "сельского хозяйства" и "развитых"

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"

Затем построим:

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)

Граф

Я хочу, чтобы "развитые" части стержней были серыми поверх "доступных" частей стержней, которые являются черными. И легенда должна соответствовать порядку баров.

Кроме того, можно ли перенести facet_wrap "Все острова" и "Оаху" вверху внизу графика под "loi" "dryland" и "agroforestry". Благодарим вас за помощь!

Ответ 1

Это может быть решение.

То, что я сделал, это упорядочить набор данных, так что значение, которое я хотел бы видеть ближе всего к оси x, появилось сначала в наборе данных. (Я использовал ваш порядок факторов здесь). Это fixt позиционирование баров.

Затем нам пришлось изменить цвета и порядок легенды. Я не мог обернуть голову вокруг scale_fill_grey, поэтому вместо этого изменил его на scale_fill_manual, установив оба значения и разрывы.

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

введите описание изображения здесь

Я не знаю, является ли это ошибкой или функцией, и я думаю, что это также произошло с предыдущими версиями в ggplot, но похоже, что при stat_identity первое наблюдение построено ближе всего к оси x, второе сверху и т.д.

Демонстрация:

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

введите описание изображения здесь

Ответ 2

Fwiw, вот решение с dplyr, и оно использует scale_fill_manual, чтобы быть явным о цветах:

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

введите описание изображения здесь