如何在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
相关产品推荐
相关产品推荐

