R ggplot2多组分面箱线图添加Kruskal-Wallis及成对Wilcoxon检验标注方法
R语言多级分组分面箱线图显著性检验优化方案
以下是针对三个需求的完整实现代码,修改点对应你的优化目标:
rm(list=ls(all=TRUE)); cat('\014') library(tidyverse) library(ggplot2) library(viridis) library(rstatix) library(ggpubr) # 预设统一配色,和变量一一绑定 var_levels <- c("Sepal.Length","Sepal.Width","Petal.Length","Petal.Width") var_colors <- viridis(4, discrete = T) names(var_colors) <- var_levels # 数据预处理 data(iris) iris$treatment <- rep(c("A","B","C"), length(iris$Species)/3) mydf <- gather(iris,Variable,value,Sepal.Length:Petal.Width) %>% mutate(Variable = factor(Variable, levels = var_levels)) mydf[mydf$treatment=="B",]$value <- mydf[mydf$treatment=="B",]$value*1.2 # --- 1. 预处理Kruskal检验结果,仅保留显著项并生成标注文本 df_kw <- compare_means(value ~ treatment, mydf, group.by = c("Species","Variable"), method="kruskal") %>% filter(p < 0.05) %>% # 仅保留显著结果 mutate(label = paste0("KW(",Variable,") p = ", signif(p,3))) # 给KW标注分配y轴位置,避免和Wilcoxon线重叠 y_max <- mydf %>% group_by(Species) %>% summarise(max_val = max(value)*1.1) df_kw <- df_kw %>% left_join(y_max, by = "Species") %>% group_by(Species) %>% mutate(y_pos = max_val + 0.15 * (row_number()-1)) # 行距统一0.15 # --- 2. 预处理Wilcoxon检验结果,分层设置位置避免交叉 df_wilcox <- mydf %>% group_by(Species,Variable) %>% pairwise_wilcox_test(value ~ treatment) %>% # 按变量分组设置y位置,每个变量的检验线放在独立区间 add_y_position(step.increase = 0.12, group = Variable, scales = "free_y") %>% # 可选:隐藏不显著结果 filter(p < 0.05) # --- 绘图 P <- ggplot(data=mydf, aes(x=treatment, y=value, fill=Variable))+ stat_boxplot(geom = "errorbar")+ geom_boxplot(outlier.shape = NA)+ # 添加Wilcoxon显著性线,颜色和变量绑定 stat_pvalue_manual(df_wilcox, aes(color = Variable), step.group.by = "Variable", tip.length = 0, step.increase = 0.03, inherit.aes = F)+ # 添加Kruskal显著结果标注 geom_text(data = df_kw, aes(x = 2, y = y_pos, label = label, color = Variable), inherit.aes = F, size = 3.5, hjust = 0.5)+ facet_wrap(~Species,nrow=1, scales = "free_y")+ theme_bw()+ theme(axis.text=element_text(size=12), axis.title=element_text(size=16), plot.title=element_text(size=20), strip.text = element_text(size=14), legend.position = "bottom")+ # --- 3. 统一箱线和显著性线配色,避免过滤后颜色错位 scale_fill_manual(values = var_colors, limits = var_levels)+ scale_color_manual(values = var_colors, limits = var_levels)+ labs(fill = "变量", color = "显著性检验") P
优化点说明
- Kruskal检验标注:自动过滤p<0.05的结果,按分面分配统一行距的展示位置,格式匹配需求
- Wilcoxon连线布局:通过
add_y_position的group参数按变量分层分配位置,所有连线均位于箱线上方,行距固定无交叉 - 颜色统一:预先给每个变量绑定固定颜色,fill和color映射使用同一套配色规则,
limits参数强制绑定所有变量水平,隐藏不显著结果后也不会出现颜色错位
内容的提问来源于stack exchange,提问作者dolphin
相关产品推荐
相关产品推荐

