ggpubr按分组设置不同升降序、不排序规则的实现方法
ggpubr分组自定义排序规则的最小改动方案
ggpubr的sort.val参数仅支持全局统一排序规则,原生不支持多分组传入不同排序参数。最小改动的替代方案是提前对数据集按分组要求排序后,将x轴变量设置为对应顺序的因子,无需修改原有绘图的样式参数,仅需关闭ggpubr自带的排序逻辑即可。
以下是完整可运行实现代码:
# 加载依赖包 library(ggpubr) library(dplyr) data("mtcars") dfm <- mtcars # 将cyl转换为因子类型 dfm$cyl <- as.factor(dfm$cyl) # 新增车型名列 dfm$name <- rownames(dfm) # --------------------新增的预处理代码:按分组自定义排序-------------------- # 按cyl的因子水平顺序,对应设置每个分组的排序规则:4缸升序、6缸不排序、8缸降序 sort_rules <- setNames(c("asc", "none", "desc"), levels(dfm$cyl)) dfm_sorted <- dfm %>% group_by(cyl) %>% group_modify(~ { cur_rule <- sort_rules[cur_group()$cyl] if (cur_rule == "asc") { arrange(.x, mpg) } else if (cur_rule == "desc") { arrange(.x, desc(mpg)) } else { .x # 不排序直接返回原分组内顺序 } }) %>% ungroup() # 将x轴的name变量设置为按排序后的顺序的因子 dfm_sorted$name <- factor(dfm_sorted$name, levels = dfm_sorted$name) # --------------------预处理代码结束-------------------- # 原有绘图代码仅修改2个排序参数即可,其余样式配置完全保留 ggbarplot(dfm_sorted, x = "name", y = "mpg", fill = "cyl", color = "white", palette = "jco", sort.val = "none", # 关闭ggpubr自带的全局排序 sort.by.groups = FALSE, # 关闭ggpubr自带的组内排序 x.text.angle = 90 )
补充说明:
- 如果不想引入dplyr依赖,也可以用base R的
split+lapply+do.call(rbind)组合完成分组排序,逻辑完全一致 - 排序规则可以灵活调整,只要和cyl的因子水平顺序一一对应即可
内容的提问来源于stack exchange,提问作者Chris T.
相关产品推荐
相关产品推荐

