不要想着要怎么把两张图合并在一起,而是说在这一张图上,你要画的点,横坐标、纵坐标到底是什么?像你参考的这个图,横座标上需要的就是HR和置信区间的上下界,纵坐标需要的,就是把“study”和“性别”这两项依次组合起来(分类变量到数值型的坐标的转换ggplot2
会帮你做好),那么准备一下数据
library(tidyverse)
dat <- tibble::tribble(
~study, ~subgroup, ~hr, ~lower, ~upper,
"study1", "male", 0.69, 0.51, 0.94,
"study1", "female", 0.42, 0.22, 0.81,
"study2", "male", 0.70, 0.50, 0.99,
"study2", "female", 0.29, 0.19, 0.44,
"study3", "male", 0.87, 0.66, 1.15,
"study3", "female", 0.66, 0.46, 0.93
) %>%
# `show_idx`确定好展示的顺序,
# `show_str`作为factor,其内部各取值顺序由我们之前计算的`show_idx`决定
mutate(
show_idx = 1 : n(),
show_str = str_c(study, subgroup, sep = "-"),
show_str = factor(show_str, levels = show_str[show_idx]))
然后画图即可。
ggplot(dat, aes(x = hr, y = show_str)) +
geom_pointrange(aes(xmin = lower, xmax = upper, shape = subgroup)) +
geom_vline(xintercept = 1) +
scale_y_discrete(limits = rev)+
coord_cartesian(xlim = c(0.25, 2))
森林图也有很多现成的包,例如MSD的forestly,可以做交互式,还有之前在ChinaR上介绍过的forestploter,罗氏的tern框架也可以,CRAN上能找到的forestplot。
总之核心在于你想清楚你的数据,和图上的点坐标到底是如何对应的。对应关系想清楚了,图基本就画出来了。