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

如何用ggpubr的stat_pvalue_manual()斜体化t/p值、显示p值星号及列表应用

用stat_pvalue_manual()实现斜体化t/p值与显著性星号

1. 核心解决方案

1.1 斜体化t和p值

stat_pvalue_manual()支持解析plotmath语法,只需在生成标注文本时用*变量名*的plotmath格式,再开启parse=TRUE参数即可实现斜体:

  • 构造标注文本时,用paste0()拼接plotmath语法字符串,示例:
    label_text <- paste0("*t* = ", round(t_value, 2), ", *p* = ", round(p_value, 4))
    
  • 调用stat_pvalue_manual()时添加parse = TRUE,让ggplot自动解析plotmath语法,实现t和p的斜体显示。

1.2 添加显著性星号

用dplyr::case_when()根据p值区间生成对应星号,再拼接到标注文本中:

sig <- dplyr::case_when(
  p_value < 0.001 ~ "***",
  p_value < 0.01 ~ "**",
  p_value < 0.05 ~ "*",
  TRUE ~ "ns" # 无显著性时显示ns
)
# 拼接星号到标注文本
label_text <- paste0("*t* = ", round(t_value, 2), ", *p* = ", round(p_value, 4), " ", sig)

2. 循环处理配对t检验结果的示例

假设你有长格式配对数据集,需循环对多个变量做配对t检验并绘图:

2.1 准备数据与依赖包

library(tidyverse)
library(ggpubr)

# 模拟配对数据
set.seed(123)
data <- tibble(
  id = rep(1:20, 2),
  group = rep(c("before", "after"), each = 20),
  var1 = c(rnorm(20, 5, 1), rnorm(20, 6, 1)),
  var2 = c(rnorm(20, 10, 2), rnorm(20, 12, 2)),
  var3 = c(rnorm(20, 3, 0.5), rnorm(20, 3.2, 0.5))
)

2.2 循环生成带标注的箱线图

# 定义待分析变量
target_vars <- c("var1", "var2", "var3")

# 存储结果的列表
plot_list <- list()
test_results <- list()

for (var in target_vars) {
  # 提取当前变量数据
  current_data <- data %>% 
    select(id, group, all_of(var)) %>% 
    rename(value = all_of(var))
  
  # 配对t检验
  t_result <- t.test(value ~ group, data = current_data, paired = TRUE)
  
  # 提取t值、p值
  t_val <- round(t_result$statistic[[1]], 2)
  p_val <- t_result$p.value
  
  # 生成显著性星号
  sig_label <- case_when(
    p_val < 0.001 ~ "***",
    p_val < 0.01 ~ "**",
    p_val < 0.05 ~ "*",
    TRUE ~ "ns"
  )
  
  # 构造带斜体的标注文本(plotmath格式)
  anno_label <- paste0("*t* = ", t_val, ", *p* = ", round(p_val, 4), " ", sig_label)
  
  # 整理stat_pvalue_manual需要的数据框
  p_anno_data <- tibble(
    group1 = "before",
    group2 = "after",
    y.position = max(current_data$value) + 0.5, # 调整标注位置,避免超出图范围
    label = anno_label
  )
  
  # 绘制箱线图
  plot <- ggboxplot(current_data, x = "group", y = "value", 
                    fill = "group", palette = "jco") +
    stat_pvalue_manual(p_anno_data, label = "label", parse = TRUE) +
    labs(title = paste("配对t检验:", var), y = var)
  
  # 存入列表
  plot_list[[var]] <- plot
  test_results[[var]] <- p_anno_data
}

# 查看第一个变量的图
print(plot_list[["var1"]])

关键注意事项

  • 必须设置stat_pvalue_manual(parse = TRUE),否则plotmath语法会被当作普通文本显示
  • 调整y.position时,需根据当前变量的最大值设置,避免标注超出图表范围
  • 如果已有预先生成的t检验结果列表,只需遍历列表,按上述方法构造label列即可直接传入stat_pvalue_manual()

内容的提问来源于stack exchange,提问作者Larissa Cury

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.21 18:43:26