更改ggplot2中条形图的绘制顺序

时间:2018-02-16 16:54:44

标签: r ggplot2 bar-chart pie-chart r-factor

我正在准备修订稿件的附录图,我需要提供年份和地点之间几个变量的年内范围(可变性)的信息。

我认为最简单的方法(我有7个站点,21年和5个变量......)将使用coord_polar使用玫瑰图。然而,我偶然发现了一些让我一直对ggplot感到沮丧的事情 - 默认的排序假设。虽然基于某些价值可以轻松地重新排序因素,但这似乎只能以固定的方式运作:据我所知,订单需要在整个数据框中应用。

在此图中,排序需要依赖于年份之间变化的值,因此colourfill值需要在面板内的绘图顺序中更改。

为了证明,我已经创建了一个可重复的示例,编码如下(图中的方式不应该工作)example of wrong ordering

基本上,我总是需要首先(在中心)绘制给定年份内具有最小值的网站,然后按原始值的顺序向外增加其他网站的价值(参见{{数据框的1}}和order列)。换句话说,有些年份,网站a将位于中心,有些年份网站c将位于中心,等等。

任何帮助都会受到大力赞赏。

diff

2 个答案:

答案 0 :(得分:2)

只要您不使用堆叠条形图(position = "stack",这是geom_bar的默认值),ggplot2实际上将use the order of the rows in your data for the plotting order。所以你需要做的就是使用y轴的原始值(而不是累积不同的值)和position = "identity",并且将数据从最大到最小value排序作图

ordered_data <- vartest[order(-vartest$value), ]

ggplot(ordered_data, aes(factor(Year), value)) +
  geom_col(aes(fill = Site), position = "identity", width = 1) +
  coord_polar() +
  facet_wrap(~ variable)

reprex package(v0.2.0)创建于2018-02-17。

PS。在为示例生成随机数据时,请考虑使用set.seed,以便可以准确地再现结果。

答案 1 :(得分:1)

您可以从最大网站的单个图表开始,然后将最小的网站放在最上面,如下所示:

a <- ggplot(vartest[vartest$variable=="var1"& vartest$order==4,], aes(x=factor(Year), y=value,group=order)) +
  theme_bw() +
  geom_hline(yintercept = seq(0,max1, by=1), size=0.3, col="grey60",lty=3) +
  geom_vline(xintercept=seq(1,yearlength,1), size=0.3, col='grey30', lty=2) +
  geom_bar(stat='identity', width=1, size=0.5, aes(col=Site, fill=Site)) +
  scale_x_discrete() +
  coord_polar() +
  theme(panel.grid.major = element_blank(), panel.grid.minor = element_blank())

b <- a + geom_bar(data = vartest[vartest$variable=="var1"& vartest$order==3,],
            stat='identity', width=1, size=0.5, aes(x=factor(Year), y=value,col=Site, fill=Site))

c <- b + geom_bar(data = vartest[vartest$variable=="var1"& vartest$order==2,],
            stat='identity', width=1, size=0.5, aes(x=factor(Year), y=value,col=Site, fill=Site))

c + geom_bar(data = vartest[vartest$variable=="var1"& vartest$order==1,],
            stat='identity', width=1, size=0.5, aes(x=factor(Year), y=value,col=Site, fill=Site))

这会产生以下结果: stacked plot

这就是你想要的吗?