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

