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

如何在ggplot森林图绘图区外添加与分组对齐的多组文本块

ggplot2森林图右侧对齐添加多列统计值解决方案

核心思路是关闭绘图区域裁剪,直接将文本和亚组的坐标轴位置绑定,无需依赖额外包,图片缩放不会出现偏移。

完整可运行代码

library(ggplot2)
library(dplyr)

set.seed(123)

mydata <- data.frame(
  subgroup = c("age < 60", "age > 60", "male", "female"),
  n =      c(76, 37, 55, 58), 
  HR =      c(-2.12, 2.88, -0.91, 3.83), 
  CIlower = c(-5.64, 0.48, -2.78, 2.57), 
  CIupper = c(-0.37, 4.38, 0.47, 4.28), 
  pvalue =  c(0.083, 0.438, 0.237, 0.683))

# 先固定亚组顺序,避免坐标错乱
mydata$subgroup <- factor(mydata$subgroup, levels = c("age < 60", "age > 60", "male", "female"))
# 拼接要显示的HR+CI文本
mydata <- mydata %>% mutate(hr_ci = paste0(sprintf("%.2f", HR), " (", sprintf("%.2f", CIlower), "-", sprintf("%.2f", CIupper), ")"))

mydata %>%
ggplot(aes(x = subgroup, y = HR, ymin = CIlower, ymax = CIupper)) +
  geom_pointrange() +
  geom_hline(yintercept = 1, lty = 2) +
  xlab("group") + 
  ylab("HR") +
  # 关键:关闭裁剪,允许绘图区外显示元素
  coord_flip(clip = "off") +
  theme_light() +
  # 右侧留足够边距放文本
  theme(plot.margin = unit(c(2, 8, 1, 1), "lines")) +
  # 第一列:样本量n,y坐标设为5(可根据你的HR范围调整位置)
  geom_text(aes(x = subgroup, y = 5, label = n), hjust = 0) +
  # 第二列:HR(CI),y坐标设为7
  geom_text(aes(x = subgroup, y = 7, label = hr_ci), hjust = 0) +
  # 第三列:p值,y坐标设为10
  geom_text(aes(x = subgroup, y = 10, label = pvalue), hjust = 0) +
  # 加表头,x=4.5对应最顶部亚组的上方位置
  annotate("text", x = 4.5, y = 5, label = "n", hjust = 0, fontface = "bold") +
  annotate("text", x = 4.5, y = 7, label = "HR (95% CI)", hjust = 0, fontface = "bold") +
  annotate("text", x = 4.5, y = 10, label = "P值", hjust = 0, fontface = "bold")

关键说明

  • 你可以根据自己的HR取值范围调整各列文本的y参数,控制列之间的间距
  • 如果需要在绘图区左侧添加文本,只需要把y设为小于最小CIlower的数值即可
  • 所有文本和亚组的x坐标直接绑定,无论图片如何缩放、导出尺寸怎么调整,都会和对应行完美对齐
  • 如果亚组数量变化,只需调整表头的x坐标即可(亚组数量为k时,表头x设为k+0.5即可显示在最顶部)

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.28 22:24:05