ggplot2多分面图中geom_text添加组间比较的结果重复问题
解决分面图中组间比较结果重复的问题
问题根源
原代码的统计比较仅按MMT_TIMEPOINT分组,未将disease_group纳入分组维度,导致两个分面共享同一套统计结果,而非针对每个疾病组独立计算组间差异。
修正后的完整代码
library(ggpubr) library(tidyverse) # 创建数据集 set.seed(123) num_participants <- 60 timepoints <- c(0, 30, 60, 120, 180) meal_test_data <- data.frame( id = rep(1:num_participants, each = length(timepoints)), disease_group = as.factor(rep(c("0", "2"), each = num_participants / 2)), MMT_TIMEPOINT = rep(c(0, 30, 60, 120, 180), times = 60), Metabolite = pmax(rnorm(num_participants * length(timepoints), mean = 30, sd = 20), 0) ) %>% group_by(id, disease_group) %>% mutate( steatosis_percent = ifelse(disease_group == "2", runif(1, 2, 30), runif(1, 0, 10)), steatosis = if_else(steatosis_percent < 5.6, "no_Steatosis", "Steatosis") ) %>% ungroup() # 计算y轴相关最大值(避免原代码报错) max_metabolite <- max(meal_test_data$Metabolite) maximum_plus3 <- max_metabolite + 3 maximum_plus5 <- max_metabolite + 5 # 绘制分面图并添加正确的组间比较 meal_test_data %>% ggline(x="MMT_TIMEPOINT", y="Metabolite", facet.by = "disease_group", add=c("mean_sd"), add.params = list(width=3), color="steatosis", numeric.x.axis = TRUE, pal="npc") + geom_jitter(aes(color = steatosis), alpha=0.2, width=6) + ylim(0, maximum_plus5) + scale_x_continuous(breaks = c(0,30,60,120,180)) + geom_text(aes(x = MMT_TIMEPOINT, y = maximum_plus3, label = p.signif), color = "black", inherit.aes = FALSE, data = meal_test_data %>% # 关键修改:同时按disease_group和MMT_TIMEPOINT分组嵌套 nest(data = -c(disease_group, MMT_TIMEPOINT)) %>% mutate(data2 = map(data, ~ compare_means(Metabolite ~ steatosis, .x, ref.group = "no_Steatosis", method = "wilcox.test", symnum.args = list(cutpoints = c(0, 0.0001, 0.001, 0.01, 0.05, 0.1, Inf), symbols = c("****", "***", "**", "*", ".", "ns"))))) %>% unnest(data2))
关键修改说明
- 补全了
maximum_plus3和maximum_plus5的计算逻辑,避免原代码因变量未定义报错 - 将统计分组从仅按
MMT_TIMEPOINT改为同时按disease_group和MMT_TIMEPOINT,确保每个疾病组的每个时间点都独立执行steatosis组间比较 - 处理后的统计数据包含
disease_group信息,geom_text会配合分面逻辑自动匹配对应组的结果,每个分面显示各自的统计显著性标记
内容的提问来源于stack exchange,提问作者c_dinosaur
相关产品推荐
相关产品推荐

