查看原文
其他

R语言统计与绘图:forestplot包绘制森林图

段小麻 R语言统计与绘图 2023-01-01

森林图是以统计指标和统计分析方法为基础,用数值运算结果绘制出的图型。

它在平面直角坐标系中,以一条垂直的无效线(横坐标刻度为1或0)为中心,用平行于横轴的多条线段描述了每个被纳入研究的效应量和可信区间(CI),用一个棱形(或其它图形)描述了多个研究合并的效应量及可信区间。

它非常简单和直观地描述了Meta分析的统计结果,是Meta分析中最常用的结果表达形式。

论文中常见的森林图就如下面这种:

今天就来学习下怎么在R中绘制上面这张森林图。


目  录

  • 1. 安装和加载R包

  • 2. 读取数据

  • 3. 数据处理

    • 3.1 定义亚组

    • 3.2 转换数据格式

  • 4. 绘制简易森林图

  • 5. 自定义森林图参数

    • 5.1 修改无效线

    • 5.2 修改坐标轴

    • 5.3 修改森林图置信区间

    • 5.4 设置字体格式

  • 6. forestplot()函数

    • 6.1 基本参数

    • 6.2 无效线

    • 6.3 水平线

    • 6.4 辅助线

    • 6.5 置信区间

    • 6.6 Box形状

    • 6.7 坐标轴

    • 6.8 图形外观

    • 6.9 图形字体格式

    • 6.10 图形元素颜色

  • End


1. 安装和加载R包

在R中绘制森林图的包有forestplot包,其是基于rmeta包的forestplot函数创建的,解决了forestplot函数的一些限制,比如可以添加表达式,对同一标签添加多个置信区间、自定义文本元素、自定义置信区间等。

install.packages("forestplot")  #安装forestplot包
library(forestplot)  # 加载包

2. 读取数据

以上图的数据为例,将数据录入到Excel中(示例数据在文末获取),录入数据格式如下图所示:

library(readxl) # 使用RStudio软件的导入数据功能
forest <- read_excel("forest.xlsx")
View(forest) # 预览数据

3. 数据处理

3.1 定义亚组

在论文图片中,为了区分以及显示的更清楚,亚组一般会向前缩进两个空格。

subgps <- c(3,4,7,8,11,12,15,16,19,20,23,24,25,26
# 指定要缩进的亚组,此处向量中的数字表示亚组的行数
forest$Variable[subgps] <- paste("    ",forest$Variable[subgps])  
# 亚组前添加两空格
View(forest) # 预览数据看看有没有添加空格

3.2 转换数据格式

attach(forest)  # 绑定数据框
labeltext <- as.matrix(forest[,1:2])   
# 将forest数据框的前两列转换为矩阵
# 以矩阵形式将文本数据导入函数

4. 绘制简易森林图

forestplot(labeltext,  # 图形文本部分            
           mean = HR,  # 图形 HR 部分(mean)            
           lower = LowerCI, # 95%CI下限(lower)            
           upper = UpperCI) # 95%CI上限(upper)

和原图相比,还有几个部分需要调整:

  1. 修改无效线位置
  2. 修改坐标轴标签、刻度、范围
  3. 修改森林图置信区间
  4. 设置字体格式

下面一一进行修改。

5. 自定义森林图参数

5.1 修改无效线

在森林图中,设置无效线的参数为zerolwd.zero,分别表示设置无效线的位置和线条宽度。

forestplot(labeltext, # 图形文本部分            
           mean = HR, # 图形 HR 部分           
           lower = LowerCI, # 95%CI下限           
           upper = UpperCI, # 95%CI上限
           zero = 1.0# 设置无效线的横坐标
           lwd.zero = 2# 设置无效线的线条宽度

5.2 修改坐标轴

设置坐标轴的参数为xlablwd.xaxisxticks,分别表示设置x轴标签、x轴宽度和x轴刻度。

forestplot(labeltext,  # 图形文本部分            
           mean = HR,  # 图形 HR 部分           
           lower = LowerCI, # 95%CI下限           
           upper = UpperCI, # 95%CI上限
           zero = 1.0, lwd.zero = 2# 设置无效线的横坐标和线条宽度
           xlab = "<---favor usual care--  --favor alert--->"# 设置x轴标题   
           xticks = c(0,1.0,2,3), # 设置x轴刻度ticks
           lwd.xaxis = 2)  # 设置x轴的线条宽度

5.3 修改森林图置信区间

设置置信区间的参数为lty.cilwd.cici.verticesci.vertices.height,分别表示森林图置信区间的线条类型、宽度、是否显示两端形状以及设置竖线高度等。

forestplot(labeltext, # 图形文本部分            
           mean = HR, # 图形 HR 部分           
           lower = LowerCI, # 95%CI下限           
           upper = UpperCI, # 95%CI上限
           zero = 1.0, lwd.zero = 2# 设置无效线的横坐标和线条宽度
           xlab = "<---favor usual care--  --favor alert--->"# 设置x轴标题   
           xticks = c(0,1.0,2,3),  # 设置x轴刻度ticks
           lwd.xaxis = 2# 设置x轴的宽度
           lty.ci = 1, lwd.ci = 2# 森林图置信区间的线条类型和宽度            
           ci.vertices = TRUE,  # 森林图置信区间两端添加小竖线,默认FALSE           
           ci.vertices.height = 0.2# 设置森林图置信区间两端小竖线的高度,默认0.1

5.4 设置字体格式

大多数期刊一般要求Times New Roman字体或者Arial字体。

另外,在上面的图形中,Box的大小是不一样的,这并不美观,而且Box的大小也不是表示HR的大小,可以使用boxsize参数来调整。

# 先调用windows的Times New Roman字体
windowsFonts(myFont1 = windowsFont("Times New Roman")) 
forestplot(labeltext,  # 图形文本部分 
           mean = HR,  # 图形 HR 部分 
           lower = LowerCI, # 95%CI下限           
           upper = UpperCI, # 95%CI上限
           zero = 1.0, lwd.zero = 2# 设置无效线的横坐标和线条宽度
           xlab = "<---favor usual care--  --favor alert--->"# 设置x轴标题 
           xticks = c(0,1.0,2,3),  # 设置x轴刻度ticks
           lwd.xaxis = 2# 设置x轴的宽度
           boxsize = 0.5# 设置Box的大小,保持大小一样
           lty.ci = 1, lwd.ci = 2# 森林图置信区间的线条类型和宽度
           ci.vertices = TRUE,  # 森林图置信区间两端添加小竖线,默认FALSE
           ci.vertices.height = 0.2# 设置森林图置信区间两端小竖线的高度,默认0.1
           align = "l",  # 文字对齐方式,"l"、"r"和"c"分别为左对齐,右对齐和居中对齐
           is.summary= c(T,T,F,F,F,T,F,F,F,T,F,F,F,T,F,F,F,T,F,F,F,T,F,F,F,F),  
           # 向量长度等于图表行数,TRUE为行加粗,且该行下添加一条直线,但在未设置颜色时不显示。
           txt_gp = fpTxtGp(label = gpar(cex = 1.15, fontfamily="myFont1"), # 设置文本字体大小
                            ticks = gpar(cex = 1.20), # 设置坐标轴刻度大小
                            xlab = gpar(cex = 1.45))) # 设置坐标轴标题大小

6. forestplot()函数

forestplot(labeltext, mean, lower, upper, align,
           is.summary = FALSE, graph.pos = "right", hrzl_lines, clip = c(-Inf,Inf), 
           xlab = "", zero = ifelse(xlog, 10), graphwidth = "auto",
           colgap, lineheight = "auto", line.margin, col = fpColors(),
           txt_gp = fpTxtGp(), xlog = FALSE, xticks, xticks.digits = 2,
           grid = FALSE, lwd.xaxis, lwd.zero, lwd.ci, lty.ci = 1, ci.vertices,
           ci.vertices.height = 0.1, boxsize, mar = unit(rep(5, times = 4),"mm"), 
           title, legend, legend_args = fpLegend(),
           new_page = getOption("forestplot_new_page"TRUE),
           fn.ci_norm = fpDrawNormalCI, fn.ci_sum = fpDrawSummaryCI, fn.legend,
           ...)

6.1 基本参数

labeltext  # 图形文本部分
HR  # 图形数据 HR 部分(mean)
LowerCI  # 95%CI下限(lower)
UpperCI  # 95%CI上限(upper)

graph.pos  # 森林图中图形元素所在的位置;
# 可以为graph.pos = 3,其中3表示图形元素在第3列;
# 也可以将位置设为"left"或"right"。
is.summary  # 一个向量,用FALSE/TRUE指定该行是否为summary行,该行可以指定不同的字体样式 
align = "l"# 文字对齐方式,“l”、“r"和“c"分别为左对齐,右对齐和居中对齐。

6.2 无效线

无效线一般放在x轴上1.0的位置,表示在HR=1处画一条线,根据变量在无效线的左边还是右边来判断是保护因素还是危险因素。

下面为修改森林图参数的解释说明,具体内容见目录,请理性购买;付费模式下代码不能复制,文末可查看关键词,获取本文示例数据和代码。

您可能也对以下帖子感兴趣

文章有问题?点此查看未经处理的缓存