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

如何在geom_col(position='dodge2')中自定义重排TEST与VERSION顺序

解决geom_col分组排序问题:按组最大值排TEST,组内按VALUE降序排VERSION

核心思路

要实现需求里的两层排序,需要分两步手动设置数据的因子水平:

  1. 全局排序TEST:先计算每个TEST分组的最大值,按该最大值降序确定TEST的排列顺序
  2. 组内排序VERSION:在每个TEST分组内,按VALUE降序确定VERSION的条形展示顺序

具体代码实现

library(tidyverse)

set.seed(123)

dat <- data.frame(TEST = rep(LETTERS[1:5], each = 3),
                  VERSION = paste0(LETTERS[6:8], 1:3),
                  VALUE = round(runif(15, 1, 10), 1))

# 1. 确定TEST的全局排序(按分组最大值降序)
test_order <- dat %>%
  group_by(TEST) %>%
  summarise(max_val = max(VALUE)) %>%
  arrange(desc(max_val)) %>%
  pull(TEST)

# 2. 处理TEST和VERSION的因子水平
dat_sorted <- dat %>%
  # 设置TEST的因子水平,按全局排序结果排列y轴
  mutate(TEST = factor(TEST, levels = test_order)) %>%
  # 按TEST分组,给VERSION设置组内降序的因子水平
  group_by(TEST) %>%
  mutate(VERSION = factor(VERSION, levels = VERSION[order(desc(VALUE))])) %>%
  ungroup()

# 绘制条形图,用position_dodge2保证各组条形宽度一致
dat_sorted %>%
  ggplot(aes(x = VALUE, y = TEST, fill = VERSION)) +
  geom_col(position = position_dodge2(preserve = "single"))

代码说明

  • test_order 通过分组计算最大值、排序后提取TEST名称,直接定义了y轴TEST的全局顺序
  • 把TEST转为因子并指定levels,ggplot会严格按照这个顺序排列y轴的分组
  • 分组处理VERSION的因子水平,确保每个TEST下的条形按VALUE从大到小排列
  • position_dodge2(preserve = "single") 避免不同TEST因数据差异出现条形宽度不均的问题

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.09 16:18:18