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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.01 22:05:18