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

如何在ggplot2中手动添加统计对比自定义括号标签?

自定义ggplot2对比括号(geom_bracket()多组对比修复)

问题说明

运行校正后的多变量线性模型后,需基于data.se数据集在ggplot2绘图中添加自定义统计对比括号,展示模型相关的统计标签(因研究需求调整了统计检验逻辑,无法直接使用stat_compare_means()自动计算)。尝试用ggpubr::geom_bracket()实现时,添加多组对比出现异常。

核心问题

原代码中直接向geom_bracket()传入向量形式的xmin/xmax/label参数,与原数据集的行结构不匹配(原数据集按visit分组,每组一行,而多组对比需要两两组合的多行数据),导致括号渲染异常。

解决方案

创建独立的对比配置数据框,将所有需要展示的对比信息(对比组、标签、括号位置)统一存储,再传递给geom_bracket(),确保数据结构与绘图需求匹配。

步骤1:构建对比配置数据框

根据需要的对比组,手动定义包含xmin(起始组)、xmax(结束组)、label(统计标签)、y.position(括号垂直位置)的数据框:

# 自定义对比配置
comparisons_df <- tibble(
  xmin = c("PreLD", "PostLD"),
  xmax = c("PostLD", "FU6Month"),
  label = c("test1", "test2"), # 替换为你的实际统计标签
  y.position = c(30, 35)
)

步骤2:修改geom_bracket()调用

将原代码中的geom_bracket()部分替换为以下代码,使用独立的对比数据框,并移除与原数据集的映射冲突:

geom_bracket(
  data = comparisons_df,
  aes(xmin = xmin, xmax = xmax, label = label),
  y.position = comparisons_df$y.position,
  vjust = 2.25,
  inherit.aes = FALSE # 关键:不继承主图的映射关系,避免数据结构冲突
)

完整修改后代码

library(tidyverse)
library(ggpubr)
library(Rmisc)
library(ggplot2)

data.se = scaled.data
data.se = summarySE(data.se, groupvars = c("visit", "shunt_decision"), measurevar = "abs_change")

VisitColors <-c("PreLD"="#E69F00",
                "PostLD" = "#56B4E9",
                "FU6Month" =  "#009E73",
                "FU12Month" = "#D55E00")

# 自定义对比配置数据框
comparisons_df <- tibble(
  xmin = c("PreLD", "PostLD"),
  xmax = c("PostLD", "FU6Month"),
  label = c("test1", "test2"), # 替换为你的实际统计标签
  y.position = c(30, 35)
)

data.figure.2AaPoint <- ggplot(
  data= data.se[data.se$shunt_decision %like% "Yes", ], 
  mapping = aes(y =(abs_change*100), x= visit, color=visit, group = visit)
)+
  geom_point(aes(size = 1.5), show.legend = F)+
  geom_line(aes(group = 1), size=1.5)+
  geom_errorbar(aes(ymax=(abs_change*100)+(ci*100),
                    ymin=(abs_change*100)-(ci*100)),
                width = .2,
                size=2)+
  ggtitle(NULL, "Shunt Decision: Yes")+
  labs(x='Visit',
       y="Gait Stride Length Change from Pre LDT (cm)",
       fill= "Shunt Decision",
       tag = "A")+
  theme_classic()+
  geom_hline(yintercept =0)+
  scale_y_continuous(breaks = seq(-50,50, 10), 
                     limits = c(-50,50))+
  scale_x_discrete(labels= c("Pre LDT", "Post LDT","6 Months", "12 Months"))+
  scale_color_manual(values = VisitColors,
                     name= paste("Visit (trials)"), labels= c(
                       "PreLD"= paste("Pre LDT", "(",n.pre.y, ")"),
                       "PostLD"= paste("Post LDT", "(",n.post.y,")"),
                       "FU6Month"= paste("6 Months", "(",n.FU6M.y,")"),
                       "FU12Month"= paste("12 Months", "(",n.FU12M.y,")"),
                       "Control"= paste("Control: ","(",n.control,")",sep = "")
                     ))+
  theme(strip.background = element_rect(color=NA),
        strip.placement = "outside",
        plot.title = element_text(size=11),
        plot.caption = element_text(hjust = 0, face= "italic"),
        legend.position = c(.175,.17),
        plot.tag.position = c(0.2, 0.875),
        plot.tag = element_text(face= "bold", size = 20),
        legend.text = element_text(size = 8),
        legend.key.size = unit(.375, 'cm'), 
        legend.key.height = unit(.375, 'cm'), 
        legend.key.width = unit(.375, 'cm'))+
  guides(fill = guide_legend(nrow = 2))+
  # 修正后的geom_bracket调用
  geom_bracket(
    data = comparisons_df,
    aes(xmin = xmin, xmax = xmax, label = label),
    y.position = comparisons_df$y.position,
    vjust = 2.25,
    inherit.aes = FALSE
  )

print(data.figure.2AaPoint)

额外优化提示

  • 如果需要添加更多对比组,只需在comparisons_df中新增行即可
  • 可通过调整y.position参数设置不同对比括号的垂直位置,避免重叠
  • 若要修改括号样式,可添加tip.length(括号尖端长度)、size(括号线宽)等参数

内容的提问来源于stack exchange,提问作者James Jean IV

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.23 11:24:16