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
相关产品推荐
相关产品推荐

