手把手教你学会森林图绘制

2019-11-07 14:42:36 浏览数 (1)

大家好,今天我们来讲一讲用R做森林的方法。森林图在R中最方便的实现方法是使用“forestplot”包。

下面进入正题。

01

安装加载包,设置工作路径

代码语言:javascript复制
install.packages("forestplot")
library(forestplot)
setwd("C:\Users\***")

02

使用无意义的数据集认识forestplot函数

Forestplot函数需要传入两个数据,第一个数据是显示在图片上的所有文本,包括标签和数字;第二个数据是置信区间的数据,包括均值、左右置信区间坐标。这部分数据必须是数值格式,他们不会以文字出现,只是用来“定位”置信区间的。

下面以测试数据“ceshi0.csv”为例演示一个最原始的森林图。

代码语言:javascript复制
data <- read.csv("ceshi0.csv",header = TRUE) # 读入数据文件
txt <- data[,c(1:3)] # 将数据文件的1-3列设置为“txt”数据框,即文本部分
hr <- data[,c(4:6)] # 将数据文件的4-6列设置为“hr”数据框,即HR数据部分。置信区间数据顺序为:mean、lower、upper,别搞错了。
forestplot(txt,hr) # 作图。至少传入两个参数,前者为文本,后者为HR数据。

03

下面我们使用正式的数据集一步步完成森林图

读入数据和数据的拆分部分同上。

forestplot(txt,hr) #作图,输出如下图。

我们把置信区间图(以下称图)的位置挪到中间来,顺便增加一条zero线。

代码语言:javascript复制
forestplot(txt,
           hr,
           graph.pos = 3, # 图的位置在第几列,如:3代表图在第2列后第几出现。
 zero = 1.5, # zero线位置,可以同时设置多条,如zero = c(0.98, 1.02)
)
代码语言:javascript复制
forestplot(txt,
           hr,
           graph.pos = 3, # 图的位置在第几列,如:3代表图在第2列后第几出现。
 zero = 1.5, # zero线位置.可以同时设置多条,如zero = c(0.98, 1.02),
 is.summary=c(TRUE,rep(FALSE,14),TRUE), #是否突出显示。传入一个长度等于图表行数的向量,下标为TRUE的行会被加粗,且该行上下会添加一条直线,但在未设置颜色时不显示。
 hrzl_lines = gpar(col="red"), #线的颜色。默认作用于summary上下。
)

也可以任意指定某行是否有横线,指定线占哪几列,并指定线的主题(线型、粗细、颜色)。

代码语言:javascript复制
forestplot(txt,
           hr,
           graph.pos = 3, # 图的位置在第几列,如:3代表图在第2列后第几出现。
  zero = 1.5, # zero线位置.可以同时设置多条,如zero = c(0.98, 1.02),
  is.summary=c(TRUE,rep(FALSE,14),TRUE), #是否突出显示。传入一个长度等于图表行数的向量,下标为TRUE的行会被加粗,且该行上下会添加一条直线,但在未设置颜色时不显示。
#  hrzl_lines = gpar(col="red"), #线的颜色。默认作用于summary上下。
hrzl_lines = list("4" = gpar(lty=2),
"5" = gpar(lty=2),
"14" = gpar(lwd=1, columns=c(1,4), col = "red"),
"16" = gpar(lwd=1, columns=2:4, col = "red")), # 可以对每条线设置位置、宽度占几列、颜色线型等。颜色也可以在颜色集中统一设置。注意引号内的数字是指定有直线的行号,不要担心引号,R可以识别的。

接下来增加两条辅助线,并且设置x轴范围,

代码语言:javascript复制
forestplot(txt,
           hr,
           graph.pos = 3, # 图的位置在第几列,如:3代表图在第2列后第几出现。
 zero = 1.5, # zero线位置.可以同时设置多条,如zero = c(0.98, 1.02),
  is.summary=c(TRUE,rep(FALSE,14),TRUE), #是否突出显示。传入一个长度等于图表行数的向量,下标为TRUE的行会被加粗,且该行上下会添加一条直线,但在未设置颜色时不显示。
   hrzl_lines = gpar(col="red"), #线的颜色。默认作用于summary上下。
   grid = structure(c(0.5,2.5), gp = gpar(col = "black", lty=2)), #增加一条或=/多条辅助线,并设置辅助线的颜色、线型、粗细
  lty.ci = 1, # HR线(穿过box的直线)的线型,默认为1(实直线)
 clip=c(0,5), # 设置x轴的范围,若置信区间落在设定的范围外,则用箭头表示
  ci.vertices = TRUE, # 穿过box的线段两端是否带下垂线,默认FALSE。
 ci.vertices.height = 0.1, #可是设置线段两端垂线的长度。

可以设置box的类型和大小(颜色可以放在最后统一调节):

代码语言:javascript复制
forestplot(txt,
           hr,
           graph.pos = 3, # 图的位置在第几列,如:3代表图在第2列后第几出现。
  zero = 1.5, # zero线位置.可以同时设置多条,如zero = c(0.98, 1.02),
   is.summary=c(TRUE,rep(FALSE,14),TRUE), #是否突出显示。传入一个长度等于图表行数的向量,下标为TRUE的行会被加粗,且该行上下会添加一条直线,但在未设置颜色时不显示。
 hrzl_lines = gpar(col="red"), #线的颜色。默认作用于summary上下。
           # hrzl_lines = list("4" = gpar(lty=2),
           # "5" = gpar(lty=2),
           # "14" = gpar(lwd=1, columns=c(1,4), col = "red"),
           # "16" = gpar(lwd=1, columns=2:4, col = "red")), # 可以对每条线设置位置、宽度占几列、颜色线型等。颜色也可以在颜色集中统一设置。注意引号内的数字是指定有直线的行号,不要担心引号,R可以识别的。
 grid = structure(c(0.5,2.5), gp = gpar(col = "black", lty=2)), #增加一条或=/多条辅助线,并设置辅助线的颜色、线型、粗细
   lty.ci = 1, # HR线(穿过box的直线)的线型,默认为1(实直线)
 clip=c(0,5), # 设置x轴的范围,若置信区间落在设定的范围外,则用箭头表示
  ci.vertices = TRUE, # 穿过box的线段两端是否带下垂线,默认FALSE。
 ci.vertices.height = 0.1, #可是设置线段两端垂线的长度。
  fn.ci_norm = fpDrawCircleCI, # box的样式,默认为方块fpDrawCircleCI,summary默认为菱形fpDrawDiamondCI.可选项:fpDrawNormalCI、fpDrawDiamondCI、fpDrawCircleCI、fpDrawPointCI、fpDrawSummaryCI、fpDrawBarCI。
 boxsize = 0.5, # 设置box的大小
)

然后我们为x轴和整个图标增加标题,再手工标记一下x轴的刻度。

代码语言:javascript复制
forestplot(txt,
           hr,
           graph.pos = 3, # 图的位置在第几列,如:3代表图在第2列后第几出现。
  zero = 1.5, # zero线位置.可以同时设置多条,如zero = c(0.98, 1.02),
  is.summary=c(TRUE,rep(FALSE,14),TRUE), #是否突出显示。传入一个长度等于图表行数的向量,下标为TRUE的行会被加粗,且该行上下会添加一条直线,但在未设置颜色时不显示。
 hrzl_lines = gpar(col="red"), #线的颜色。默认作用于summary上下。
           # hrzl_lines = list("4" = gpar(lty=2),
           # "5" = gpar(lty=2),
           # "14" = gpar(lwd=1, columns=c(1,4), col = "red"),
         # "16" = gpar(lwd=1, columns=2:4, col = "red")), # 可以对每条线设置位置、宽度占几列、颜色线型等。颜色也可以在颜色集中统一设置。注意引号内的数字是指定有直线的行号,不要担心引号,R可以识别的。
 grid = structure(c(0.5,2.5), gp = gpar(col = "black", lty=2)), #增加一条或=/多条辅助线,并设置辅助线的颜色、线型、粗细
  lty.ci = 1, # HR线(穿过box的直线)的线型,默认为1(实直线)
 clip=c(0,5), # 设置x轴的范围,若置信区间落在设定的范围外,则用箭头表示
  ci.vertices = TRUE, # 穿过box的线段两端是否带下垂线,默认FALSE。
 ci.vertices.height = 0.1, #可是设置线段两端垂线的长度。
  fn.ci_norm = fpDrawCircleCI, # box的样式,默认为方块fpDrawCircleCI,summary默认为菱形fpDrawDiamondCI.可选项:fpDrawNormalCI、fpDrawDiamondCI、fpDrawCircleCI、fpDrawPointCI、fpDrawSummaryCI、fpDrawBarCI。
 boxsize = 0.5, # 设置box的大小
  xlog=FALSE, # 是否设置x轴为对数坐标轴,默认否。
 xlab = "Lab axis txt", # x轴标题
 xticks = c(1,2,3,4,4.5,4.75,5), #设置x轴ticks, # 标题
)

最后设置一下七七八八的主题,就完工了。

代码语言:javascript复制
forestplot(txt,
           hr,
           graph.pos = 3, # 图的位置在第几列,如:3代表图在第2列后第几出现。
 zero = 1.5, # zero线位置.可以同时设置多条,如zero = c(0.98, 1.02),
  is.summary=c(TRUE,rep(FALSE,14),TRUE), #是否突出显示。传入一个长度等于图表行数的向量,下标为TRUE的行会被加粗,且该行上下会添加一条直线,但在未设置颜色时不显示。
 hrzl_lines = gpar(col="red"), #线的颜色。默认作用于summary上下。
           # hrzl_lines = list("4" = gpar(lty=2),
           #  "5" = gpar(lty=2),
           #  "14" = gpar(lwd=1, columns=c(1,4), col = "red"),
           #  "16" = gpar(lwd=1, columns=2:4, col = "red")), # 可以对每条线设置位置、宽度占几列、颜色线型等。颜色也可以在颜色集中统一设置。注意引号内的数字是指定有直线的行号,不要担心引号,R可以识别的。
 grid = structure(c(0.5,2.5), gp = gpar(col = "black", lty=2)), #增加一条或=/多条辅助线,并设置辅助线的颜色、线型、粗细
   lty.ci = 1, # HR线(穿过box的直线)的线型,默认为1(实直线)
 clip=c(0,5), # 设置x轴的范围,若置信区间落在设定的范围外,则用箭头表示
 ci.vertices = TRUE, # 穿过box的线段两端是否带下垂线,默认FALSE。
 ci.vertices.height = 0.1, #可是设置线段两端垂线的长度。
 fn.ci_norm = fpDrawCircleCI, # box的样式,默认为方块fpDrawCircleCI,summary默认为菱形fpDrawDiamondCI.可选项:fpDrawNormalCI、fpDrawDiamondCI、fpDrawCircleCI、fpDrawPointCI、fpDrawSummaryCI、fpDrawBarCI。
  boxsize = 0.5, # 设置box的大小
  xlog=FALSE, # 是否设置x轴为对数坐标轴,默认否。
  xlab = "Lab axis txt", # x轴标题
 xticks = c(0,1,2,3,4,4.5,4.75,5), #设置x轴ticks
           , # 标题
  lwd.xaxis = 2, # 设置x轴宽度
 lwd.zero = 2,# 设置zero线宽度
 lwd.ci = 2,# 设置HR线宽度
 lineheight = unit(0.05, "npc"), # 设置行高。默认为"auto"
  graphwidth = unit(0.4, "npc"),  # 图形宽度,默认自动调节.注意这里的宽度是HR图的宽度,不是整个图的宽度。
 colgap = unit(0.01,"npc"), #列之间的间距,0-1之间的数值,npc表示“占视窗的比例”
  col=fpColors(box="royalblue",line="darkblue", summary="royalblue"), # 集中设定颜色
         #  txt_gp = fpTxtGp(label = gpar(fontfamily = "Hershey")), # 设置字体.建议不要在此处设置字体,因为此处调用的device可能会不支持设置的字体。
   )

0 人点赞