ggplot2:更改条形图上的堆栈顺序 [英] ggplot2: Changing the order of stacks on a bar graph

查看:54
本文介绍了ggplot2:更改条形图上的堆栈顺序的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我正在尝试使用 facet_wrap 制作堆叠条形图,但我希望我的堆叠变量(已开发")的顺序被翻转.我重新排列了因子,并尝试了order=descend()"和scale_fill_manual",但似乎没有任何效果.

I'm trying to make a stacked bar graph with a facet_wrap, but I want the order of my stacked variables ("developed") to be flipped. I've reordered the factors, and tried "order=descend()," as well as "scale_fill_manual" and nothing seems to work.

这是我的代码:

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

不断变化的农业"和发达"要素水平

changing factor levels of "agriculture" and "developed"

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)

我希望在条形的可用"部分(黑色)之上将条形的已开发"部分显示为灰色.并且图例也应与条形图的顺序相匹配.

I want the "developed" parts of the bars in gray on top of the "available" parts of the bars, which are black. And the legend should match the order of the bars as well.

此外,是否可以将顶部的 facet_wrapAll island"和Oahu"移动到loi"、dryland"和agroforestry"下的图表底部.谢谢你的帮助!!

Also, is it possible to move the facet_wrap "All islands" and "Oahu" at the top to the bottom of the graph under "loi" "dryland" and "agroforestry." Thank you for your help!!

推荐答案

这可能是一个解决方案.

This might be a solution.

我所做的是对数据集进行排序,以便我希望最接近 x 轴的值首先出现在数据集中.(我在这里使用了您对因素的排序).这固定了酒吧的位置.

What I did was ordering the dataset, so that the value I wanted to appear closest to the x-axis appeared first in the dataset. (I've used your ordering of factors here). This fixt the positioning of the bars.

然后,我们不得不更改图例的颜色和顺序.我无法理解 scale_fill_grey,所以我将其改为 scale_fill_manual,同时设置值和中断.

Then, we had to change the colors and order of the legend. I could not wrap my head around scale_fill_grey, so I changed it to scale_fill_manual instead, setting both values and breaks.

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 轴,第二个在顶部诸如此类

I don't know if it's a bug or a feature, and I think this also happened with previous versions in ggplot, but it appears that with stat_identity the first observation is plotted closest to the x-axis, the second on top of that etc.

演示:

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

这篇关于ggplot2:更改条形图上的堆栈顺序的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆