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

在ggplot中基于双条件排序条形图:分组且组内数值升序排列

问题原因说明

你的代码存在3个核心错误导致无法得到预期效果:

  1. 管道排序后的数据未被ggplot正确调用,你在aes中使用df$xxx的写法直接读取了未排序的原始数据,前面的arrange操作完全未生效
  2. 因子排序逻辑错误,你需要控制顺序的是X轴的站点,而非分组,应该将站点列按排序后的结果设置为因子水平
  3. 颜色映射配置错误,填充属性对应fill参数,你用了控制描边的scale_color_manual,且没有将分组颜色映射放入aes中

修正后可直接运行的代码

# 加载依赖包
library(dplyr)
library(ggplot2)

# 原始数据
df <- data.frame(
  stringsAsFactors = FALSE,
             Sites = c("Site 1","Site 2","Site 3",
                       "Site 4","Site 5","Site 6","Site 7","Site 8","Site 9",
                       "Site 10","Site 11"),
            Values = c(184.7955548,171.1466314,
                       245.5952181,188.3072784,259.9438698,210.3448318,
                       173.7977541,182.5497301,198.7985429,188.0458496,215.5709303),
            Groups = c(1, 1, 3, 3, 2, 3, 1, 3, 3, 2, 2))

# 绘图代码
df %>% 
  arrange(Groups, Values) %>% # 先按分组排序,组内按数值从小到大排序
  mutate(Sites = factor(Sites, levels = Sites)) %>% # 固定X轴顺序为当前排序结果
  ggplot(aes(x = Sites, y = Values, fill = as.factor(Groups)))+ # 映射填充色为分组
  geom_col()+ # 等价于geom_bar(stat = "identity"),语法更简洁
  scale_fill_manual(values = c('royalblue1', 'slategray2', 'yellow1'))+ # 对应fill属性设置颜色
  ylab("Values")+
  xlab("")+
  theme(axis.text.x = element_text(angle = 90, hjust = 1))

核心修改点说明

  • 移除了所有df$写法,管道处理后的排序数据会直接传递给ggplot,保证排序生效
  • 将Sites转为因子,水平设置为arrange后的顺序,X轴就会按照「分组聚集+组内升序」的逻辑排列
  • 把填充色映射放入aes内,将Groups转为因子对应离散色值
  • 将scale_color_manual替换为scale_fill_manual,和填充属性对应,颜色才能正常渲染

内容的提问来源于stack exchange,提问作者Drop

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.16 11:54:07