如何在ggplot中按Y轴值而非fill分组值对条形图排序?
解决ggplot分组内条形按Y值排序的问题
ggplot默认按fill变量的字母顺序排列条形,和数据框的行顺序无关。要实现x轴每个分组内的条形按Y轴值排序,核心是重新设置fill变量的因子水平顺序,让其对应分组内的Y值排序结果。
方法一:用fct_reorder2自动按分组内Y值排序
forcats包的fct_reorder2函数可以直接根据x(分组变量)和y(数值变量)调整因子水平,适合批量处理所有分组:
library(tidyverse) # 调整trans的因子水平,按每个class分组内的hwy降序排列 mpg_sorted <- mpg %>% mutate(trans = fct_reorder2(trans, class, hwy, .desc = TRUE)) # 绘制图表 ggplot(mpg_sorted, aes(class, hwy, fill = trans)) + geom_col(position = "dodge")
方法二:分组排序后用fct_inorder设置因子水平
如果需要更灵活的排序逻辑,可先对数据分组排序,再用fct_inorder按数据框中的出现顺序锁定因子水平:
library(tidyverse) # 按class分组,每组内按hwy降序排列 mpg_sorted <- mpg %>% group_by(class) %>% arrange(desc(hwy), .by_group = TRUE) %>% ungroup() %>% # 按数据框中trans的出现顺序设置因子水平 mutate(trans = fct_inorder(trans)) # 绘制图表 ggplot(mpg_sorted, aes(class, hwy, fill = trans)) + geom_col(position = "dodge")
关键说明
- 之前整理数据后图表仍按字母排序,是因为ggplot只识别
fill变量的因子水平顺序,不读取数据框的行顺序。 - 如果需要指定某组的特定顺序(比如2seater组要
manual(m6)→auto(s6)→auto(i4)),可以手动修改该组的因子水平后,再结合上述方法调整其他组。
内容的提问来源于stack exchange,提问作者Nuria
相关产品推荐
相关产品推荐

