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

如何在ggplot2的三因素交互分面图中添加显著性标记

跨分面添加显著性标记的解决方案

针对你的三因素交互GLMM结果可视化需求,以下是实现跨分面红色显著性标记的具体思路和代码示例:

核心思路

  1. 关闭绘图裁剪:ggplot默认会裁剪超出分面范围的元素,需通过coord_cartesian(clip = "off")关闭裁剪,允许元素跨分面显示。
  2. 提取分面布局坐标:从ggplot构建对象中获取各分面的位置坐标,确定标记需要跨越的分面范围。
  3. 构建自定义标注数据:创建包含显著性标记位置(起始/结束坐标、高度)和标签的数据集。
  4. 添加跨分面几何元素:使用geom_segment()绘制跨分面的括号线条,geom_text()添加显著性标签。

代码示例

假设你的三个预测变量为A(分面变量)、B(x轴变量)、C(分组变量),响应变量为Y:

1. 准备数据与模型结果

library(tidyverse)
library(lme4)
library(emmeans)

# 模拟示例数据
set.seed(123)
dat <- expand.grid(A = factor(paste0("A", 1:3)),
                   B = factor(paste0("B", 1:2)),
                   C = factor(paste0("C", 1:2)),
                   Subject = factor(1:20)) %>%
  mutate(Y = rnorm(n(), 
                   mean = case_when(A == "A1" & B == "B1" & C == "C1" ~ 5,
                                    A == "A1" & B == "B1" & C == "C2" ~ 7,
                                    A == "A2" & B == "B1" & C == "C1" ~ 5.5,
                                    A == "A2" & B == "B1" & C == "C2" ~ 7.2,
                                    A == "A3" & B == "B1" & C == "C1" ~ 6,
                                    A == "A3" & B == "B1" & C == "C2" ~ 6.1,
                                    TRUE ~ 4),
                   sd = 1))

# 拟合GLMM并获取lsmeans
model <- lmer(Y ~ A*B*C + (1|Subject), data = dat)
lsmeans_df <- emmeans(model, ~ A*B*C) %>% as.data.frame()

# 事后检验并筛选显著结果
posthoc <- pairs(emmeans(model, ~ C|B|A), adjust = "tukey") %>% as.data.frame()
sig_posthoc <- posthoc %>% filter(p.value < 0.05)

2. 绘制带跨分面标记的图

# 基础分面图
p <- ggplot(lsmeans_df, aes(x = B, y = emmean, color = C, group = C)) +
  geom_point(size = 3) +
  geom_errorbar(aes(ymin = emmean - SE, ymax = emmean + SE), width = 0.2) +
  facet_grid(. ~ A)  # 按A列分面
  theme_bw() +
  coord_cartesian(clip = "off")  # 关闭裁剪

# 提取分面布局坐标
plot_build <- ggplot_build(p)
facet_x_positions <- plot_build$layout$panel_params[[1]]$x$break_positions()

# 构建标注数据集(示例:标记B1组中C1/C2在A1-A2、A2-A3间的显著差异)
annotations <- tibble(
  # A1-A2跨分面标记
  x_start = facet_x_positions[1] - 0.2,
  x_end = facet_x_positions[2] + 0.2,
  y_pos = max(lsmeans_df$emmean[lsmeans_df$B == "B1"]) + 1,
  sig_label = "***"
) %>%
  add_row(
    # A2-A3跨分面标记
    x_start = facet_x_positions[2] - 0.2,
    x_end = facet_x_positions[3] + 0.2,
    y_pos = max(lsmeans_df$emmean[lsmeans_df$B == "B1"]) + 1.5,
    sig_label = "*"
  )

# 添加跨分面显著性标记
final_plot <- p +
  # 绘制水平跨线
  geom_segment(data = annotations, 
               aes(x = x_start, xend = x_end, y = y_pos, yend = y_pos),
               color = "red", size = 1) +
  # 绘制两端竖线
  geom_segment(data = annotations,
               aes(x = x_start, xend = x_start, y = y_pos - 0.2, yend = y_pos),
               color = "red", size = 1) +
  geom_segment(data = annotations,
               aes(x = x_end, xend = x_end, y = y_pos - 0.2, yend = y_pos),
               color = "red", size = 1) +
  # 添加显著性标签
  geom_text(data = annotations,
            aes(x = (x_start + x_end)/2, y = y_pos + 0.1, label = sig_label),
            color = "red", size = 5)

print(final_plot)

关键调整点

  • 坐标校准:根据分面类型(行/列分面)调整facet_x_positions或facet_y_positions,确保标记位置准确。
  • 高度调整:y_pos需设置为高于对应组的最大emmean值,避免与误差杆重叠。
  • 标记样式:可修改geom_segment的linetype、size,或geom_text的fontface来优化标记外观。

内容的提问来源于stack exchange,提问作者Ginevra B

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.16 05:23:19