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

使用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 in FUN():
! object 'strains' not found
Run rlang::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存在重复的美学参数设置。以下是修正步骤:

关键修正点

  1. 在主ggplot的aes中添加group = strains:明确分组信息,让stat_pvalue_manual能正确读取strains变量。
  2. 统一geom_point的大小参数:删除重复的size=2或cex=3,推荐使用标准参数size。
  3. 提前转换因子水平:在计算统计量前就将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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.10 05:49:52