首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >手把手教你学会森林图绘制

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

作者头像
百味科研芝士
发布2019-11-07 14:42:36
7.3K0
发布2019-11-07 14:42:36
举报
文章被收录于专栏:百味科研芝士百味科研芝士

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

下面进入正题。

01

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

install.packages("forestplot")
library(forestplot)
setwd("C:\\Users\\***")

02

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

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

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

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线。

forestplot(txt,
           hr,
           graph.pos = 3, # 图的位置在第几列,如:3代表图在第2列后第几出现。
 zero = 1.5, # zero线位置,可以同时设置多条,如zero = c(0.98, 1.02)
)
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上下。
)

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

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轴范围,

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的类型和大小(颜色可以放在最后统一调节):

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轴的刻度。

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, # 标题
)

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

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可能会不支持设置的字体。
   )
本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2019-11-04,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 百味科研芝士 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档