大家好,今天我们来讲一讲用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可能会不支持设置的字体。
)