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

如何在ggplot2(ggpubr)中仅显示显著p值并移除非显著标注

移除ggpubr中非显著(p≥0.05)的所有标注元素

要彻底移除p值≥0.05的标注(包括竖条和文本),核心是只让ggpubr处理显著的组间比较,而不是先生成所有标注再隐藏文本。具体实现步骤如下:

步骤1:提前计算并筛选显著比较对

先通过compare_means计算所有组间比较的p值,过滤出p<0.05的比较组合,再将这些组合传给标注函数。

完整代码示例

# 加载所需包
library(ggplot2)
library(ggpubr)
library(dplyr)

# 准备示例数据(以iris数据集为例)
data(iris)
df <- iris %>% filter(Species %in% c("setosa", "versicolor", "virginica"))

# 计算所有组间t检验的结果
comp_results <- compare_means(Sepal.Length ~ Species, data = df, method = "t.test")

# 筛选出p值<0.05的比较对(格式为列表)
significant_comparisons <- comp_results %>% 
  filter(p.value < 0.05) %>% 
  pull(comparisons)

# 绘制箱线图并仅添加显著标注
ggboxplot(df, x = "Species", y = "Sepal.Length") +
  stat_compare_means(
    comparisons = significant_comparisons,
    label = "p.signif",  # 可选:显示显著性符号(***, **, *),也可用"p.format"显示具体p值
    hide.ns = TRUE       # 双重保险:即使有漏网的非显著组,也隐藏其文本
  )

针对ANOVA+两两比较的场景

如果你的图表需要先展示ANOVA结果,再添加显著的两两比较标注,代码如下:

# 计算ANOVA结果
anova_result <- compare_means(Sepal.Length ~ Species, data = df, method = "anova")

# 计算两两比较并筛选显著组
pairwise_results <- compare_means(
  Sepal.Length ~ Species, 
  data = df, 
  method = "t.test", 
  p.adjust.method = "bonferroni"  # 根据需求选择校正方法
)
sig_pairwise <- pairwise_results %>% filter(p.value < 0.05) %>% pull(comparisons)

# 绘图
ggboxplot(df, x = "Species", y = "Sepal.Length") +
  # 添加ANOVA的p值(放在图表顶部)
  stat_compare_means(method = "anova", label.y = max(df$Sepal.Length) + 0.6) +
  # 仅添加显著的两两比较标注
  stat_compare_means(comparisons = sig_pairwise, label = "p.signif")

原理说明

之前仅用hide.ns = TRUE只会隐藏非显著标注的文本,但ggpubr仍然会生成对应的竖条。通过提前筛选比较对,只将显著的组传给stat_compare_means的comparisons参数,就能让ggpubr完全跳过非显著组的标注生成,从根源上移除所有非显著元素。

内容的提问来源于stack exchange,提问作者Chris

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.21 14:42:01