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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.16 03:54:04