如何在ggplot2中按指定字符列分组重排图表?
解决方法:按分组排列X轴类别(ggplot2)
要实现X轴单个样本按分组(诊断结果/car_model)排列,核心是将X轴的因子列(car)的水平顺序设置为「分组优先、组内排序」,具体步骤如下:
1. 预处理数据(以mtcars为例)
首先确保数据包含car(样本/车型)和car_model(分组/品牌)列,然后重新定义car的因子水平:
library(tidyverse) # 给mtcars添加car列(行名)和car_model列(提取品牌) mtcars <- mtcars %>% mutate(car = rownames(.), # 提取车型名称的第一个单词作为品牌(模拟你的分组列) car_model = str_extract(car, "^\\w+")) # 关键步骤:先按分组(car_model)排序,组内按样本名(car)字母排序,再把car转为因子 mtcars <- mtcars %>% arrange(car_model, car) %>% mutate(car = factor(car, levels = car))
如果需要指定某组(比如Toyota)排在最前面,可以先调整car_model的因子顺序,再排序:
# 让Toyota组优先,其他组按字母顺序排列 mtcars <- mtcars %>% mutate(car_model = factor(car_model, levels = c("Toyota", sort(setdiff(unique(car_model), "Toyota"))))) %>% arrange(car_model, car) %>% mutate(car = factor(car, levels = car))
2. 绘制柱状图
用调整好因子顺序的数据绘图,此时X轴会自动按分组排列:
ggplot(mtcars, aes(x = car, y = wt, fill = car_model)) + geom_col(stat = "identity") + # geom_col是geom_bar(stat='identity')的简写 theme_bw() + theme(axis.text.x = element_text(angle = 90, hjust = 1, vjust = 0.5)) + # 优化旋转后的文字对齐 labs(x = "车型", y = "重量", title = "按品牌分组的车型重量") + scale_fill_discrete(name = "品牌") # 自定义图例标题
为什么你之前的尝试没成功?
你之前的排序代码是order(mtcars$car, mtcars$car_model),这是先按样本名排序,再按分组排序,完全颠倒了优先级,导致分组被打乱。正确的顺序应该是先按分组,再按组内样本排序,然后把样本列转为因子(固定顺序),ggplot才会遵循这个顺序绘图。
内容的提问来源于stack exchange,提问作者Farah
相关产品推荐
相关产品推荐

