You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.19 21:07:07