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