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

R语言绘图中统计显著性括号重复显示问题求助

R绘图中组间显著性括号重复问题的解决方法

问题描述

绘制乳酸实验数据并将p值整合到图中时,部分组间的统计显著性差异括号重复显示(每组比较仅需显示一次),手动删除无法精准操作,但增大样本量n时重复现象消失。

问题根源

重复括号的核心原因是统计分析的分组逻辑错误:stat_Metabolites.test.exp按Experiment(实验批次)分组执行统计检验,导致同一组比较(相同Oxygen.condition、Day、test、Cell.type组合)在不同实验批次下生成了多条重复的统计结果。绘图时stat_pvalue_manual会将所有重复结果逐一绘制,造成括号叠加。

而样本量增大时重复现象消失,大概率是因为大样本下部分比较的p值变为不显著,被hide.ns=TRUE参数过滤;或者重复结果的y轴位置刚好重合,视觉上看起来只有一条括号。

解决方案

方案1:使用整合所有实验的统计结果(推荐)

如果你的统计目标是分析所有实验合并后的组间差异,直接使用不按Experiment分组的stat_Metabolites.test数据绘图即可:

# 修改绘图代码中的stat_pvalue_manual部分
stat_pvalue_manual(stat_Metabolites.test,  # 替换为不按Experiment分组的统计结果
                   label = "p.adj.signif",
                   size = 5,
                   bracket.size = 0.3,
                   remove.bracket = FALSE,
                   hide.ns = TRUE)

方案2:按比较组汇总实验批次的统计结果

若需保留实验批次的统计维度,但不想重复显示括号,可以对同一比较组的结果进行汇总(比如取最显著的p值、合并显著性标记):

# 对stat_Metabolites.test.exp按比较组汇总
stat_Metabolites.test.exp.summary <- stat_Metabolites.test.exp %>%
  group_by(Oxygen.condition, Day, test, group1, group2) %>%
  summarise(
    p.adj = min(p.adj),  # 保留最显著的p值
    p.adj.signif = case_when(
      any(p.adj.signif == "***") ~ "***",
      any(p.adj.signif == "**") ~ "**",
      any(p.adj.signif == "*") ~ "*",
      TRUE ~ "ns"
    ),  # 保留最高级的显著性标记
    y.position = mean(y.position)  # 取平均位置避免括号偏移
  ) %>%
  ungroup()

# 绘图时使用汇总后的数据
stat_pvalue_manual(stat_Metabolites.test.exp.summary,
                   label = "p.adj.signif",
                   size = 5,
                   bracket.size = 0.3,
                   remove.bracket = FALSE,
                   hide.ns = TRUE)

方案3:直接过滤重复的统计条目

如果不需要汇总,仅需保留每组比较的一条结果,直接用distinct()去重:

# 去除重复的比较条目
stat_Metabolites.test.exp.unique <- stat_Metabolites.test.exp %>%
  distinct(Oxygen.condition, Day, test, group1, group2, .keep_all = TRUE)

# 绘图时使用去重后的数据
stat_pvalue_manual(stat_Metabolites.test.exp.unique,
                   label = "p.adj.signif",
                   size = 5,
                   bracket.size = 0.3,
                   remove.bracket = FALSE,
                   hide.ns = TRUE)

原始代码参考

# Lactate Experiment
## Prepare Dataset
Lactate.data_long <- Lactate.data %>%
  gather(key = "variable", value = "value", -Tube.Nr., -Oxygen.condition, -Cell.type, -Experiment, -Day, -Well, -Label)

Lactate.data_long$variable <- factor(Lactate.data_long$variable, levels = c("Lactate", "Glucose"))

levels(Lactate.data_long$variable) <- c("Lactate", "Glucose")

Lactate.data_long <- Lactate.data_long %>% 
  dplyr::rename(test = variable)

## Statistics Metabolites (all Wells)
stat_Metabolites.test <- Lactate.data_long %>%
  group_by(Oxygen.condition, Day, test) %>%
  dunn_test(value ~ Cell.type) %>%
  add_xy_position(x = "test") %>%
  arrange(p.adj)
stat_Metabolites.test

## Statistics Metabolites (Experiment)
stat_Metabolites.test.exp <- Lactate.data_long %>%
  group_by(Oxygen.condition, Day, test, Experiment) %>%
  dunn_test(value ~ Cell.type) %>%
  add_xy_position(x = "test") %>%
  arrange(p.adj)
stat_Metabolites.test.exp

## Plot
Lactate_plot <- ggplot(Lactate.data_long, aes(x = test, y = value)) +
  geom_boxplot(aes(fill = Cell.type),
               size = 0.8,
               alpha = 0.6,
               color = "black",
               lwd = 0.2,
               outlier.shape = NA,
               position = position_dodge(width = 0.75)) +
  stat_summary(fun = mean,
               geom = "point",
               size = 1.7,
               fill = "white",
               shape = 23,
               color = "black",
               alpha = 1,
               aes(group = Cell.type),
               position = position_dodge(width = 0.75)) +
  # coord_cartesian(ylim = c(0, 50)) +
  # scale_y_continuous(breaks=seq(0,50, 5)) +
  scale_fill_manual(values = colors_Lactate) +
  ylab(expression(bold(paste("concentration")))) +
  facet_grid(Oxygen.condition ~ Day) +
  theme_bw() + 
  stat_pvalue_manual(stat_Metabolites.test.exp,
                     label = "p.adj.signif",
                     size = 5,
                     # y.position = 40,
                     bracket.size = 0.3,
                     remove.bracket = FALSE,
                     hide.ns = TRUE) +
  theme(legend.title = element_blank(),
        legend.position = "top",
        legend.text = element_text(size = 7, face = "bold"),
        legend.text.align = 0,
        legend.background = element_blank(), 
        legend.key = element_blank(),
        panel.border = element_rect(colour = "black", size=.5),
        axis.title.y = element_text(size= 9, face = "bold", colour = "black"),
        axis.title.x = element_blank(),
        axis.ticks = element_line(colour = "black", size = .3),
        panel.grid.minor = element_blank(),
        panel.grid.major = element_line(size=0.2),
        axis.text.y = element_text(size = 7, face = "bold", colour = "black"),
        axis.text.x = element_text(size = 9, face = "bold", colour = "black"),
        axis.ticks.length=unit(.5, "mm"),
        strip.text = element_text(color = "black", size = 9, face = "bold"),
        panel.spacing = unit(1, "mm"))
Lactate_plot

# ggsave(paste0(export.dir, "_Lactate_plot.pdf"), plot = Lactate_plot, height = 4.5, width = 9, units = "cm")

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.14 22:40:53