通过两个变量之一对ggplot条形图排序

时间:2019-10-30 10:18:41

标签: r ggplot2

我正在使用ggplot绘制条形图,该条形图具有与每个名称关联的两个值,一个值为正,另一个为负。我想按正值以降序而不是名称的字母顺序对图表中的条形进行排序。

如果对名称的排序有一个通用的手动替代,我也对此感兴趣。

我已经在线研究了其他ggplot线程,这些线程在只有一个变量的情况下会按降序对条形进行排序,而且我知道该怎么做。但是,当我尝试这样做的时候有两个变量时,就会遇到这个问题。

这是我的数据和我编写的绘图函数的类似示例:

example_data <- data.frame(NAME = rep(c('C', 'D', 'A', 'E', 'B'),2), 
                           Variable = c(rep('S', 5), rep('L', 5)), 
                           Values = c(-39,-21,-19,-11,-9,30,16,13,7,6))

ggplot(data = example_data, 
       aes(x = NAME, y = Values, fill = Variable)) + 
  geom_bar(stat = "identity", alpha=1) + 
  geom_text(aes(label=round(Values,1))) + 
  ylab("Unit of measurement") + 
  scale_fill_manual(values=c('#AED6F1','#F5B7B1'))

我考虑过尝试以下方法,但未产生预期结果:

ggplot(data = example_data,
       aes(x = reorder(NAME, Values), y = Values, fill = Variable)) + 
  geom_bar(stat = "identity", alpha=1) + 
  geom_text(aes(label=round(Values,1))) + 
  ylab("Unit of measurement") + 
  scale_fill_manual(values=c('#AED6F1','#F5B7B1'))

我希望结果将小节排序为[C,D,A,E,B],但第一个输出中名称的顺序是[A,B,C,D,E],第二个中输出为[C,A,D,E,B]。

1 个答案:

答案 0 :(得分:1)

您可以根据“值”列按降序对数据框的行进行排序,然后使用fct_inorder包中的forcats通过首次出现对NAME重新排序。

library(dplyr)


example_data %>%
  arrange(desc(Values)) %>%
  mutate(NAME = forcats::fct_inorder(NAME)) %>%
  ggplot(aes(NAME, Values, fill = Variable)) +
  geom_col() + # identical to geom_bar(stat = "identity"), with less typing
  geom_text(aes(label = Values)) + 
  ylab("Unit of measurement") + 
  scale_fill_manual(values=c('#AED6F1', '#F5B7B1'))

plot

这是一个相对简单的情况,但是即使您具有涉及按多个变量进行排序的复杂排序逻辑,也可以使用相同的方法。