如何用ggplot2实现单暴露对应双结果的上下排布森林图
解决ggplot2森林图同一暴露多结果纵向排布问题
要实现同一暴露下两个结果上下排布,核心是给同一暴露的不同结果设置y轴位置偏移,具体步骤如下:
1. 预处理数据
首先把数据中字符型的数值列转成数值类型,同时为每个暴露的不同结果生成带偏移的y轴位置:
library(ggplot2) library(dplyr) # 转换数值列并生成偏移后的y轴位置 df <- df %>% mutate( across(c(b, cidown, ciup), as.numeric), # 将暴露分组转为数值,再根据data类型添加偏移 y_pos = as.numeric(factor(exposure)) + case_when( data == "d" ~ -0.2, data == "r" ~ 0.2 ) )
2. 绘制森林图
用新生成的y_pos作为y轴映射,再自定义y轴刻度显示原暴露名称:
ggplot(df, aes(x = b, y = y_pos, xmin = cidown, xmax = ciup)) + geom_point(size = 4, aes(shape = data)) + geom_pointrange(shape = 1, show.legend = TRUE) + # 替换y轴刻度为原暴露名称 scale_y_continuous( breaks = as.numeric(factor(unique(df$exposure))), labels = unique(df$exposure) ) + theme(text = element_text(family = "short"))
关键说明
- 数值列转换:原数据中
b、cidown、ciup为字符型,必须转成数值才能正确绘制置信区间。 - y轴偏移:±0.2的偏移量可根据需求调整,只要保证同一暴露的两个结果在视觉上区分开且不重叠即可。
- 刻度自定义:通过
scale_y_continuous将数值型的y轴刻度替换为原暴露名称,保证y轴显示清晰直观。
内容的提问来源于stack exchange,提问作者ayeepi
相关产品推荐
相关产品推荐

