使用stat_pvalue_manual为ggplot添加p值时遇错误求助
问题描述
使用stat_pvalue_manual函数为ggplot添加校正后p值时持续报错,尝试过stat_compare_means但该函数的p.adj值存在问题,因此必须使用stat_pvalue_manual。
报错信息
! Problem while computing aesthetics.
ℹ Error occurred in the 4th layer.
Caused by error inFUN():
! object 'strains' not found
Runrlang::last_trace()to see where the error occurred.
Warning message:
Duplicated aesthetics after name standardisation: size
数据与代码
示例数据生成代码
# Create vectors for each variable medium <- c( "MM", "MM", "MM", "MM", "MM", "MM", "MM", "MM", "MM", "MM", "MM", "MM", "MM", "MM", "MM", "MM", "MMGA", "MMGA", "MMGA", "MMGA", "MMGA", "MMGA", "MMGA", "MMGA", "MMGA", "MMGA", "MMGA" ) strains <- c( "A", "A", "A", "A", "A", "A", "B", "B", "B", "B", "B", "C", "C", "C", "C", "C", "A", "A", "A", "A", "A", "A", "B", "B", "B", "B", "B" ) value <- c( 0.642396224, 0.642973791, 0.560378425, 0.844780865, 1.202418689, 2.107052006, 0.286002062, 0.207255769, 0.121489854, 0.149735456, 0.292497354, 0.188256332, 0.181433285, 0.407696852, 0.37862504, 0.891960999, 0.465748762, 1.003103112, 1.000750442, 1.001402757, 1.006722153, 0.996919936, 0.991101601, 0.997623183, 0.994042211, 0.999101239, 0.996893329, 1.000764356 ) # Create a dataframe ggdat <- data.frame(medium, strains, value)
绘图与统计分析代码
##################### library(ggprism) library(readxl) library(ggplot2) library(RColorBrewer) library(ggpubr) library(rstatix) ggdat <- read.csv("ggdat_demo.csv") #calculate p-val stat.test <- ggdat %>% group_by(medium) %>% t_test(value ~ strains) %>% adjust_pvalue(method = "bonferroni") %>% add_significance() %>% add_xy_position(x = "strains", dodge = 0.8) #data for mean and sd df.summary <- ggdat %>% group_by(strains, medium) %>% summarise(sd = sd(value), value = mean(value)) # generate mean and sd for col plot ggdat$strains <- factor(ggdat$strains, levels = c("A","B", "C", "D")) df.summary$strains <- factor(df.summary$strains, levels = c("A","B", "C", "D")) #graph eror when I add p value ggplot(ggdat, aes(strains, value, fill=strains)) + facet_grid(. ~ medium) + geom_col(data = df.summary, position = position_dodge(0.8), width = 0.7, alpha=1) + geom_errorbar(data = df.summary, aes(ymin = value-sd, ymax = value+sd), color="#282828",width = 0.4, position = position_dodge(0.8)) + geom_point(size=2, position = position_jitterdodge(jitter.width = .5, dodge.width = .8), cex = 3, alpha=.8, color="#282828", shape=21, stroke = .75) + # add_pvalue(stat.test, label = "p.adj") + stat_pvalue_manual(stat.test, label = "p.adj", tip.length = 0) + theme(legend.text = element_text(size = 12), legend.title = element_text(size = 12), legend.position = "top", axis.title.y = element_text(face = "plain", size = 12, color = "black", margin = margin(0,0,0,0,"cm")), axis.title.x = element_text(face = "plain", size = 12, color = "black", margin = margin(0,0,0,0,"cm")), axis.text.x = element_text(face = "plain", size = 12, color = "black", angle = 35, vjust = 1, hjust = 1, margin = margin(0,0,0.2,0,"cm")),# axis.text.y = element_text(face = "plain", size = 12, color = "black", angle = 0, margin = margin(0,0,0,0.2,"cm"))) + scale_y_continuous(limits = c(0,3), breaks = c(0, 0.5,1, 1.5, 2, 2.5))+ scale_color_manual(name= "Strains",values = c("#E6A226", "#BABBBB", "#21BDC2", "#7AD1ED"),labels=c("A","B", "C", "D")) + scale_fill_manual(name= "Strains",values = c("#E6A226", "#BABBBB", "#21BDC2", "#7AD1ED"), labels=c("A","B", "C", "D")) + guides(fill=guide_legend(nrow=1,byrow=TRUE), color=guide_legend(nrow=1, byrow=TRUE))+ theme_bw()
解决方案
报错核心原因是stat_pvalue_manual无法识别主图层的分组变量strains,同时geom_point存在重复的美学参数设置。以下是修正步骤:
关键修正点
- 在主ggplot的
aes中添加group = strains:明确分组信息,让stat_pvalue_manual能正确读取strains变量。 - 统一
geom_point的大小参数:删除重复的size=2或cex=3,推荐使用标准参数size。 - 提前转换因子水平:在计算统计量前就将
strains转为指定因子水平,避免分组错位。
修正后的完整代码
library(ggprism) library(readxl) library(ggplot2) library(RColorBrewer) library(ggpubr) library(rstatix) # 读取数据(或使用生成的示例数据) # ggdat <- read.csv("ggdat_demo.csv") # 提前转换因子水平 ggdat$strains <- factor(ggdat$strains, levels = c("A","B", "C", "D")) # 计算校正后p值 stat.test <- ggdat %>% group_by(medium) %>% t_test(value ~ strains) %>% adjust_pvalue(method = "bonferroni") %>% add_significance() %>% add_xy_position(x = "strains", dodge = 0.8) # 生成均值和标准差数据 df.summary <- ggdat %>% group_by(strains, medium) %>% summarise(sd = sd(value), value = mean(value)) %>% ungroup() df.summary$strains <- factor(df.summary$strains, levels = c("A","B", "C", "D")) # 绘图 ggplot(ggdat, aes(strains, value, fill=strains, group = strains)) + # 添加group参数 facet_grid(. ~ medium) + geom_col(data = df.summary, position = position_dodge(0.8), width = 0.7, alpha=1) + geom_errorbar(data = df.summary, aes(ymin = value-sd, ymax = value+sd), color="#282828", width = 0.4, position = position_dodge(0.8)) + geom_point(position = position_jitterdodge(jitter.width = .5, dodge.width = .8), size = 3, alpha=.8, color="#282828", shape=21, stroke = .75) + # 统一size参数 stat_pvalue_manual(stat.test, label = "p.adj", tip.length = 0) + theme(legend.text = element_text(size = 12), legend.title = element_text(size = 12), legend.position = "top", axis.title.y = element_text(face = "plain", size = 12, color = "black", margin = margin(0,0,0,0,"cm")), axis.title.x = element_text(face = "plain", size = 12, color = "black", margin = margin(0,0,0,0,"cm")), axis.text.x = element_text(face = "plain", size = 12, color = "black", angle = 35, vjust = 1, hjust = 1, margin = margin(0,0,0.2,0,"cm")), axis.text.y = element_text(face = "plain", size = 12, color = "black", angle = 0, margin = margin(0,0,0,0.2,"cm"))) + scale_y_continuous(limits = c(0,3), breaks = c(0, 0.5,1, 1.5, 2, 2.5))+ scale_color_manual(name= "Strains",values = c("#E6A226", "#BABBBB", "#21BDC2", "#7AD1ED"),labels=c("A","B", "C", "D")) + scale_fill_manual(name= "Strains",values = c("#E6A226", "#BABBBB", "#21BDC2", "#7AD1ED"), labels=c("A","B", "C", "D")) + guides(fill=guide_legend(nrow=1,byrow=TRUE), color=guide_legend(nrow=1, byrow=TRUE))+ theme_bw()
额外说明
- 若你的数据中没有
D菌株,可删除因子水平中的"D",避免空分组干扰绘图。 add_xy_position的dodge参数需与geom_col、geom_errorbar的position_dodge值保持一致,确保p值标注位置与柱状图对齐。
内容的提问来源于stack exchange,提问作者Trinh Phan-Canh
相关产品推荐
相关产品推荐

