如何在geom_col(position='dodge2')中自定义重排TEST与VERSION顺序
解决geom_col分组排序问题:按组最大值排TEST,组内按VALUE降序排VERSION
核心思路
要实现需求里的两层排序,需要分两步手动设置数据的因子水平:
- 全局排序TEST:先计算每个TEST分组的最大值,按该最大值降序确定TEST的排列顺序
- 组内排序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
相关产品推荐
相关产品推荐

