按ggplot中的特定因子重新排序,同时由另一个

时间:2016-01-29 21:35:51

标签: r ggplot2

问题:

如何在ggplot中创建一个降序条形图(如下所示),并根据最近一年的值(蓝色,2015)进行重新排序?我已经尝试改变重新排序的“FUN”选项,但没有成功。我确实用括号找到了一些成功,但是当我将它们应用到ggplot函数时,它们不再起作用。

Example

代码:

library(ggplot2)

df <- read.table(text = '
             facility  year value
             a  2012    5.066719095
             a  2013    6.199471839
             a  2014    4.522300089
             a  2015    4.92689046
             b  2012    4.165211821
             b  2013    3.542013367
             b  2014    3.323008647
             b  2015    2.775883861
             c  2012    6.68507118
             c  2013    7.590574237
             c  2014    8.035296346
             c  2015    6.248734117
             d  2012    7.318596505
             d  2013    5.556040733
             d  2014    4.706814181
             d  2015    3.395899009
             e  2012    7.032686869
             e  2013    6.714919
             e  2014    5.309100168
             e  2015    3.262501451
             f  2012    6.03334622
             f  2013    5.516842841
             f  2014    5.756024789
             f  2015    4.863173625
             g  2012    11.55785552
             g  2013    9.822368474
             g  2014    10.59960277
             g  2015    8.578816937
             h  2012    11.13759047
             h  2013    11.21849677
             h  2014    14.42275412
             h  2015    10.84418671
             i  2012    5.654301344
             i  2013    5.763859937
             i  2014    4.756596478
             i  2015    6.146759985
             j  2012    7.613800532
             j  2013    7.208221812
             j  2014    7.252485205
             j  2015    6.628703296
             k  2012    7.582829055
             k  2013    6.891288622
             k  2014    12.77089132
             k  2015    8.766426727
             l  2012    23.20319709
             l  2013    24.85267598
             l  2014    22.25478583
             l  2015    22.35339446
             m  2012    7.965939563
             m  2013    7.483046394
             m  2014    6.137859229
             m  2015    4.79897225
             n  2012    9.386677667
             n  2013    7.132884824
             n  2014    5.360270766
             n  2015    3.52531513
             ', header=T)

ggplot(df) + 
  geom_bar(aes(reorder(facility, -value), value, fill=factor(year)),
           stat="identity", position="dodge", color="black") +
  scale_fill_manual(values=c("grey", "grey", "grey", "dodgerblue"))

我尝试了什么:

我在ggplot函数之外尝试了以下两种方法(工作)...

with(df, reorder(facility[year==2015], -value[year==2015])

subset(df[order(-df$value),], year==2015 )

...但是,当我在函数中尝试它们时它不起作用,因为x和y最终会有不同的长度(这是有意义的)。

我确实在SO上查找了类似的问题,但我发现没有一个解决了子集化和重新排序因子的具体问题,同时填充了ggplot中使用的另一个因素。

我也意识到,在不同年份进行分析而不是按照我的方式展示它们可能是更好的做法,但这就是我老板指定的方式。恕我直言我认为平均值很好(重新排序时默认为FUN),因为在这种情况下对年份进行聚类视觉上意味着年度变化不一定与因子之间的差异一样重要(否则他会指定分面版本),但是他坚持在最近一年订购酒吧集团。

我确信我可以手动破解某些东西,但它需要足够强大才能在一个大得多的数据集上使用,这个数据集重复这个过程大约60次,这就是为什么我来到SO。

1 个答案:

答案 0 :(得分:1)

我们可以重构facility,以便按year == 2015的值排序其级别:

df$facility <- factor(df$facility,levels=unique(df$facility)[order(df$value[df$year == 2015],decreasing = TRUE)])

然后我们使用x=facility

进行绘图
ggplot(df) + 
  geom_bar(aes(facility, value, fill=factor(year)),
           stat="identity", position="dodge", color="black") +
  scale_fill_manual(values=c("grey", "grey", "grey", "dodgerblue"))

输出

enter image description here