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"))
![введите описание изображения здесь]()