R 按两个变量之一对柱状图排序
我正在使用ggplot绘制一个条形图,它有两个值与每个名称关联,一个值为正值,另一个值为负值。我想按正数降序排列图表中的条形图,而不是按名称的字母顺序排列 如果名称排序有一个通用的手动覆盖,我也会对此感兴趣 我已经在网上探索了其他ggplot线程,它们在只有一个变量的情况下按降序排列条形图,我知道如何做到这一点。然而,当我尝试这样做的时候,当有两个变量时,我就有了这个问题 下面是我写的数据和绘图函数的类似示例:R 按两个变量之一对柱状图排序,r,ggplot2,R,Ggplot2,我正在使用ggplot绘制一个条形图,它有两个值与每个名称关联,一个值为正值,另一个值为负值。我想按正数降序排列图表中的条形图,而不是按名称的字母顺序排列 如果名称排序有一个通用的手动覆盖,我也会对此感兴趣 我已经在网上探索了其他ggplot线程,它们在只有一个变量的情况下按降序排列条形图,我知道如何做到这一点。然而,当我尝试这样做的时候,当有两个变量时,我就有了这个问题 下面是我写的数据和绘图函数的类似示例: example_data <- data.frame(NAME = rep(c
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'))
我希望结果是将条排序为[C,D,A,E,B],但第一个输出中的名称顺序是[A,B,C,D,E],第二个输出中的名称顺序是[C,A,D,E,B]。您可以根据值列按降序排列数据帧的行,然后使用
forcats
包中的fct\u按第一次出现的顺序对名称重新排序
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'))
这是一个相对简单的案例,但即使您有复杂的排序逻辑,其中涉及到多个变量的排序,同样的方法也会起作用
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'))