我正在准备修订稿件的附录图,我需要提供年份和地点之间几个变量的年内范围(可变性)的信息。
我认为最简单的方法(我有7个站点,21年和5个变量......)将使用coord_polar
使用玫瑰图。然而,我偶然发现了一些让我一直对ggplot感到沮丧的事情 - 默认的排序假设。虽然基于某些价值可以轻松地重新排序因素,但这似乎只能以固定的方式运作:据我所知,订单需要在整个数据框中应用。
在此图中,排序需要依赖于年份之间变化的值,因此colour
和fill
值需要在面板内的绘图顺序中更改。
为了证明,我已经创建了一个可重复的示例,编码如下(图中的方式不应该工作)
基本上,我总是需要首先(在中心)绘制给定年份内具有最小值的网站,然后按原始值的顺序向外增加其他网站的价值(参见{{数据框的1}}和order
列)。换句话说,有些年份,网站a将位于中心,有些年份网站c将位于中心,等等。
任何帮助都会受到大力赞赏。
diff
答案 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))
这就是你想要的吗?