今天要分享的是,如何在R语言中实现基于OR值/HR值的单组及多组森林图的绘制
(本次数据用到的是OR值,换成HR值是一样的道理)
软件:RStudio最新版(2023.06.01更新)
一、绘制过程一览
第一步:加载相应的R包
第二步:加载并整理数据集
第三步:绘制单组森林图/绘制两组森林图
二、单组森林图绘制
接下来进入超详细的单组森林图绘制环节:
第一步:加载R包
在整个过程中,我们一共会用到一下两个R包
library(grid)
install.packages("forestploter")
library(forestploter)
第二步:导入数据
本次所用到的数据均为虚拟数据,并不存在任何实际意义。
#导入数据
data<-read.table("C:/Users/paddi/Desktop/forestplot.csv",header=T,sep=",")
数据整理
接下来对数据进行整理:
#整理数据:添加缩进,为每个亚组组别前面添加空格
data$Characteristic <- ifelse(is.na(data$OR_grp1),
data$Characteristic,
paste0(" ", data$Characteristic))
#设置正确显示森林图中文字内容
data$` Group 1\nadjusted OR (95% CI)*` <- ifelse(is.na(data$OR_grp1),
data$or_ci1,
paste0(data$or_ci1))
由于本次应用的数据中存在哑变量,因此,我们直接提前定义好两组OR值,并没有使用R来合并OR值及其95% CI,如果所使用的数据没有reference组,那么可以参考下面的代码,直接在R中进行数据整理:
绘图准备
再创建一个用于存放森林图的空列:
#创建两个用来放森林图的位置
data$` ` <- paste(rep(" ", 20), collapse = " ")
并设置森林图中效应值的大小(即森林图中小方块的大小):
#设置森林图中的方块大小
data$'se_grp1'<- (log(data$highCI_grp1) - log(data$OR_grp1))/1.96
整理好后的数据展示:
第三步:绘制单组森林图
#绘制森林图
fp<-forest(data[,c(1,10,11)], #这里选中的三列就是森林图上会展示的内容,这里是可选的,比如加上魅族的样本量,cases number,p值等等
est = data$OR_grp1,
lower = data$lowCI_grp1,
upper = data$highCI_grp1,
ci_column = 2, #这里表示在第2列绘制森林图(哪一列是空的就选哪一列)
ref_line = 1, #这里设置参考线为1(图中的虚线),可选
xlim = c(0,3), #这里是设定的森林图x轴范围,可选的
ticks_at = c(0.5,1,2,3)) #这里是设置x轴的刻度,可选的
fp
森林图展示:
细节优化:加粗文本
接下来对森林图进行细节优化:
#将分组变量名称设置为黑体加粗
fp1<-edit_plot(fp,
row = c(1, 5, 10, 15),
gp = gpar(fontface = "bold"))
fp1
图片展示:
可以看到每个大的类别变量名都被加粗显示了
细节优化:改变颜色
由于我们每个亚组中存在哑变量,即reference组,该组实际上效应值应该是为0,但是图中仍然会显示一个小方块,因此我们接下来将这个小方块进行透明处理
#将每组中reference的效应大小的方块变成透明
fp2<-edit_plot(fp1,
row = c(6, 11, 16), #这里代表对第6、11、16行进行处理
col = 2, #这里代表对第二列进行操作,即我们的森林图部分
which = "ci", #这里代表要编辑的对象,可以是"text","background"或"ci"(confidence interval),由于我们想要使小方块透明,因此要处理的是ci,所有我们这里选择which = "ci"
gp = gpar(col = NA)) #这里col=NA,即没有颜色
fp2
图片展示:可以看到,图中reference组的小方块都消失啦。当然,我们可以对某一行进行透明处理,就也可以将改行换成别的颜色,只需要改变以上代码中“which = ”选项(修改相应的位置)以及“col = ”选项(修改相应的颜色)即可。
单组森林图成片展示
以上就是我们绘制单组森林图的全部过程啦。接下来介绍两组森林图的绘制。
对于两组森林图的绘制,前面的数据导入、数据整理都是一样的。
三、两组森林图的绘制
绘图准备
由于我们需要绘制两个森林图,因此需要相应的创建两个空列用于存放森林图。(这里我们想要每个森林图都在每组相应的文本之后展示,因此我们通过每设置一次展示文本内容之后就创建一个空列用于存放森林图,实际过程中也可以根据自己的需要进行修改)
#设置正确显示森林图中文字内容
data$` Group 1\nadjusted OR (95% CI)*` <- ifelse(is.na(data$OR_grp1),
data$or_ci1,
paste0(data$or_ci1))
#创建用来放森林图的位置
data$` ` <- paste(rep(" ", 20), collapse = " ")
#设置正确显示森林图中文字内容
data$` Group 2\nadjusted OR (95% CI)*` <- ifelse(is.na(data$OR_grp1),
data$or_ci2,
paste0(data$or_ci2))
#创建用来放森林图的位置
data$` ` <- paste(rep(" ", 20), collapse = " ")
数据展示:
森林图绘制
#绘制森林图
fp_groups<-forest(data[,c(1,10,11,12,13)],
est = list(data$OR_grp1, #这里需要注意的是,est\lower\upper三组里面的值需要一一对应
data$OR_grp2),
lower = list(data$lowCI_grp1,
data$lowCI_grp2),
upper = list(data$highCI_grp1,
data$highCI_grp2),
ci_column = c(3,5),
ref_line = 1,
xlim = c(0,2),
ticks_at = c(0.5,1,2))
plot(fp_groups)
森林图展示:
同样的,我们对森林图进行细节优化(加粗文本、修改颜色)
#将分组变量名称设置为黑体加粗
fpp <- edit_plot(fp_groups,
row = c(1, 6, 11, 16),
gp = gpar(fontface = "bold"))
fpp
#将每组中reference的效应大小的方块变成透明
fppp<-edit_plot(fpp,
row = c(2, 7, 12, 17),
col = c(3,5),
which = "ci",
gp = gpar(col = NA))
fppp
两组森林图成片展示
最终,我们绘制好的森林图就是这样啦!(如发现代码有误,恳请大家批评指正)
本文参考了该网站其他博主的文章,最终整合而成,在此非常感谢大家!
今天的分享就到此结束啦!欢迎大家莅临我的另外一个草稿箱(公众号:统计小菜椒)
(ps:每天进步一点)