我正在使用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]。
答案 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'))
这是一个相对简单的情况,但是即使您具有涉及按多个变量进行排序的复杂排序逻辑,也可以使用相同的方法。