R ggplot分组箱线图按属聚类并按属内du中位数升序排序实现方法
解决思路
核心是手动指定x轴变量gen_spe的因子水平,按「属优先级排序→属内物种按du中位数升序排序」的规则定义水平顺序,即可同时满足两个需求。
1. 数据预处理(调整因子水平)
使用dplyr对原数据做如下处理:
library(dplyr) library(ggplot2) df <- df %>% # 按属+物种分组,计算每个物种的du中位数 group_by(gen, spe) %>% mutate(med_du = median(du, na.rm = TRUE)) %>% ungroup() %>% # 先按属排序保证同属物种相邻,再按属内中位数升序排列 arrange(gen, med_du) %>% # 将gen_spe转为因子,水平指定为排序后的唯一值,直接控制x轴顺序 mutate(gen_spe = factor(gen_spe, levels = unique(gen_spe)))
2. 绘图代码
处理后的数据直接套用你原来的绘图逻辑即可,仅需注意修正图例设置的冲突:
ggplot(df, aes(gen_spe, du)) + theme_classic(base_size = 10) + geom_boxplot( aes(color = gen, color = after_scale( colorspace::desaturate(color, .2) )), size = 0.75 ) + ggsci::scale_color_npg() + # 移除原guide="none"参数,避免和下方图例设置冲突 guides(color = "legend")
你当前的效果参考:
内容的提问来源于stack exchange,提问作者Marine
相关产品推荐
相关产品推荐

