R语言使用ggpubr的geom_signif报错及ggplot图例显示异常求助
问题排查与解决
1. 图例形状显示异常问题
原因
- 代码重复调用
geom_point():第一次带aes(shape='mean')映射用来生成图例,第二次无映射的geom_point()会绘制所有原始数据点,覆盖之前的形状映射逻辑 geom_boxplot默认绘制离群点,且绘图顺序在均值点图层之后,离群点形状会干扰均值图例的显示scale_shape_manual未明确设置名称和标签,导致图例匹配异常
修复方案
- 删除多余的无映射
geom_point() - 给
geom_boxplot添加outlier.shape = NA参数,关闭箱线图自带的离群点绘制,如需展示离群点可单独调用geom_point()并设置独立的形状映射 - 调整
scale_shape_manual配置,明确关联均值的形状映射
2. stat_signif()计算报错问题
原因
- 分组名称不匹配:
scale_x_discrete中自定义的labels和geom_signif的comparisons参数里的分组名称不一致(例如原分组的Vehicle - Vehicle在labels里被改成了Vehicle- Vehicle,空格位置存在差异),导致函数无法匹配到对应分组 - 未手动指定显著性条的位置:10组比较共用自动计算的y轴位置,容易超出y轴范围导致计算失败
- 部分组间差异检验默认算法(Wilcoxon秩和检验)在组内样本量过小、方差为0时会计算失败
修复方案
- 提前统一分组名称:直接修改原始数据的
Drug列为因子类型,将水平名改为你需要的显示名称,不要仅通过scale_x_discrete修改标签,保证comparisons里的分组名和因子水平完全一致 - 合并多组比较到同一个
geom_signif调用中,通过step_increase参数自动调整显著性条的高度,避免位置溢出 - 如仍存在检验失败问题,可添加
test = "t.test"参数指定检验方法适配你的数据特征
修正后完整代码
library(tidyverse) library(ggplot2) library(ggpubr) # 提前修改分组因子水平,保证名称统一 PhospholipaseA2NOPo1$Drug <- factor(PhospholipaseA2NOPo1$Drug, levels = c("Blank", "Vehicle - Vehicle", "Vehicle - Nicotinic Acid", "SP - Vehicle", "SP - Nicotinic Acid"), labels = c("Blank", "Vehicle- Vehicle", "Vehicle - Nicotinic Acid", "SP - Vehicle", "SP - Nicotinic Acid") ) ggplot(PhospholipaseA2NOPo1, aes( x = Drug, y = Absorbance))+ geom_line(aes(linetype='median'),size=1)+ ggtitle("Comparison of the effect of Blank, Vehicle - Vehicle, Vehicle - Nicotinic Acid, SP - Vehicle, and SP -Nicotinic Acid on microglia - Phospholipase A2 Assay ") + labs(x = "Treatment", y = expression(paste("Absorbance " ~ "(", A[425], " - ", A[600] ~ nm, ")"))) + stat_summary(fun=mean, aes(shape='mean'), colour="black", geom="point", size=3) + geom_boxplot(fill=c("#2171B5","#DEEBF7", "#CC79A7", "#CC79A7", "#CC79A7"), width=0.2,notch = FALSE, outlier.shape = NA)+ stat_compare_means(label.y = 0.50, label.x = 3.25)+ # 合并所有显著性比较,自动调整高度 geom_signif( comparisons = list( c("Blank", "Vehicle- Vehicle"), c("Blank", "Vehicle - Nicotinic Acid"), c("Blank", "SP - Vehicle"), c("Blank", "SP - Nicotinic Acid"), c("Vehicle- Vehicle", "Vehicle - Nicotinic Acid"), c("Vehicle- Vehicle", "SP - Vehicle"), c("Vehicle- Vehicle", "SP - Nicotinic Acid"), c("Vehicle - Nicotinic Acid", "SP - Vehicle"), c("Vehicle - Nicotinic Acid", "SP - Nicotinic Acid"), c("SP - Vehicle", "SP - Nicotinic Acid") ), map_signif_level = TRUE, colour = "#cf1b1b", step_increase = 0.05, na.rm = TRUE )+ theme_bw() + theme(panel.grid.major = element_line(colour = "#d3d3d3"), panel.grid.minor = element_blank(), panel.border = element_blank(), panel.background = element_blank(), plot.title = element_text(size = 14, face = "bold"), axis.text.x = element_text(face="bold", color="#3142b0", size=8.9, angle=0), axis.text.y = element_text(face="bold", color="#3142b0", size=8.9, angle=0), legend.spacing.y = unit(0.01, "cm"))+ scale_linetype_manual('Legend',values='solid')+ scale_shape_manual(' ',values = 18)
内容的提问来源于stack exchange,提问作者Martin
相关产品推荐
相关产品推荐

