R ggplot水平躲避条形图顺序

时间:2017-10-11 13:36:36

标签: r ggplot2

我想创建一个带有躲避条的简单水平条形图,但我对(水平)条的排序感到困惑。当我进行正常的条形图(堆叠或躲闪)时,我可以通过设置有用的因子级别并根据相应的变量对数据帧进行排序来轻松控制条形的顺序。但是,对数据框进行排序似乎对水平图中条形的顺序没有任何影响。 我发现了一些类似的问题,但我不确定它们是否符合我的问题(情节看起来有点不同)。

df1 <- data.frame (year = as.factor(c(rep(2015,3),rep(2016,3),rep(2017,3))),
value = c(50,30,20,60,70,40,20,50,80),
set = rep(c("A","B","C"),3) )

ggplot() + geom_bar(data= df1, aes(y=value, x=set, fill=year), 
stat="identity", position="dodge" ) +
coord_flip()

我想要的是一个水平图,显示2015年的酒吧在顶部和2017年的酒吧在底部。有趣的是,当我省略coord_flip()时,条形顺序排序,但我需要绘图是水平的。 以这种方式排序数据不会改变情节:

df1 <- df1[rev(order(df1$year)),]

我很感激任何暗示:)

1 个答案:

答案 0 :(得分:4)

你已经遇到了一个ggplot2的特性 - coord_flip之后的条形排序有点不直观。要更改它,您必须在df1$year中反转因子级别的顺序,而不仅仅是值本身。见下文:

library(ggplot2)

df1 <- data.frame (year = as.factor(c(rep(2015,3),rep(2016,3),rep(2017,3))),
                   value = c(50,30,20,60,70,40,20,50,80),
                   set = rep(c("A","B","C"),3) )

levels(df1$year)
#> [1] "2015" "2016" "2017"

df1$year <- factor(df1$year, levels = rev(levels(df1$year)))

ggplot(df1) +
  geom_bar(aes(y=value, x=set, fill=year), 
           stat="identity", position="dodge" ) +
  coord_flip()

如果您希望按原始顺序保留图例,可以使用guide_legend

进行访问
ggplot(df1) +
  geom_bar(aes(y=value, x=set, fill=year), 
           stat="identity", position="dodge" ) +
  guides(fill = guide_legend(reverse = TRUE)) +
  coord_flip()