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

如何在R的ggplot箱线图中为不同数据框添加显著性水平?

解决思路

1. 先修正代码语法错误

你的原始代码存在多处语法问题,这是p值无法显示的基础原因:

  • geom_boxplot(data=df1, aes(x=color, y=value_y) 缺少闭合括号,需改为 geom_boxplot(data=df1, aes(x=color, y=value_y))
  • geom_boxplot(data=df2, aes(x=income, y=value_y) 同样缺少闭合括号,需改为 geom_boxplot(data=df2, aes(x=income, y=value_y))
  • geom_signif(comparisons = list(c("black", "blue"), map_signif_level=TRUE) 参数格式错误,map_signif_level 是独立参数,不属于comparisons列表元素,需改为 geom_signif(comparisons = list(c("black", "blue")), map_signif_level=TRUE)

2. 合并数据框,统一分组列(核心解决跨数据框比较问题)

你需要跨数据框比较组别(比如black和high),但当前两个数据框的x轴是不同列(color和income),ggplot无法直接关联这些跨数据框的组别。必须先合并数据框,新增统一分组列,将color和income的取值整合到同一列中:

# 给两个数据框新增统一分组列
df1$group <- df1$color
df2$group <- df2$income
# 合并数据框
combined_df <- rbind(df1, df2)

基于合并后的数据集绘图,所有组别都在同一个group列下,geom_signif才能识别所有需要比较的组合:

ggplot(combined_df, aes(x=group, y=value_y)) +
  geom_boxplot() +
  # 列出所有需要比较的组别组合
  geom_signif(
    comparisons = list(
      c("black", "blue"),
      c("black", "red"),
      c("high", "mid"),
      c("high", "low"),
      c("black", "high"),
      c("blue", "low")
      # 其他需要的组合可继续添加
    ),
    map_signif_level = TRUE,
    test = "t.test" # 可按需指定检验方法,如wilcox.test等
  )

3. 关于stat_compare_means的问题

你提到的stat_comp_means应为stat_compare_means,需确保参数正确,且基于合并后的数据集使用:

ggplot(combined_df, aes(x=group, y=value_y)) +
  geom_boxplot() +
  stat_compare_means(
    comparisons = list(
      c("black", "blue"),
      c("black", "high")
    ),
    method = "t.test",
    label = "p.signif" # 显示显著性水平标识,如***、**等
  )

4. 其他排查点

  • 检查value_y列的样本量,样本量过小可能导致检验无法计算有效p值
  • 确认ggsignif包已正确安装并加载(geom_signif属于该包),未安装则先运行install.packages("ggsignif")再library(ggsignif)
  • 核对组别名称是否完全匹配,ggplot对字符匹配严格,注意大小写、空格等细节

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.27 04:44:53