该内容已被发布者删除 该内容被自由微信恢复。
文章于 3月30日 下午 9:00 被检测为删除。
被用户删除
其他
R语言绘图 | 使用forestploter绘制森林图
准备
# 安装 forestploter 包
install.packages("forestploter")
#加载grid、forestploter包
library(grid)
library(forestploter)
# 读取示例数据文件
dt <- read.csv(system.file("extdata", "example_data.csv", package = "forestploter"))
基本森林图
# 如果安慰剂列中有数字,则缩进亚组
dt$Subgroup <- ifelse(is.na(dt$Placebo),
dt$Subgroup, # 如果 Placebo 列是 NA,则不缩进,否则在亚组名前添加空格
paste0(" ", dt$Subgroup))
# 将 NA 转换为空白
dt$Treatment <- ifelse(is.na(dt$Treatment), "", dt$Treatment) # 将 Treatment 列的 NA 转换为空字符串
dt$Placebo <- ifelse(is.na(dt$Placebo), "", dt$Placebo) # 将 Placebo 列的 NA 转换为空字符串
dt$se <- (log(dt$hi) - log(dt$est))/1.96 # 计算标准误差
# 为森林图添加一个空白列用于显示 CI,使用空格调整列宽
dt$` ` <- paste(rep(" ", 20), collapse = " ") # 在数据框中添加一个名为“ ”的列,用于在森林图中显示空白
# 创建用于显示置信区间的列
dt$`HR (95% CI)` <- ifelse(is.na(dt$se), "", # 如果标准误差为 NA,则为空字符串
sprintf("%.2f (%.2f to %.2f)", # 否则,格式化置信区间
dt$est, dt$low, dt$hi))
# 定义主题
tm <- forest_theme(base_size = 10, # 设置基本字体大小
refline_col = "red", # 设置参考线颜色为红色
arrow_type = "closed", # 设置箭头类型为闭合箭头
footnote_col = "blue") # 设置脚注颜色为蓝色
p <- forest(dt[,c(1:3, 20:21)], # 选择需要绘制的列
est = dt$est, # 效应值
lower = dt$low, # 下限
upper = dt$hi, # 上限
sizes = dt$se, # 点的大小
ci_column = 4, # 置信区间的列索引
ref_line = 1, # 参考线位置
arrow_lab = c("Placebo Better", "Treatment Better"), # 箭头标签
xlim = c(0, 4), # x轴的范围
ticks_at = c(0.5, 1, 2, 3), # 设置刻度位置
footnote = "This is the demo data. Please feel free to change\nanything you want.", # 脚注内容
theme = tm) # 应用主题
plot(p) # 绘制森林图
美化
# 编辑第三行的文本
g <- edit_plot(p, row = 3, gp = gpar(col = "red", fontface = "italic")) # 使用 gpar 函数编辑第三行的文本,设置颜色为红色,字体为斜体
# 加粗分组文本
g <- edit_plot(g,
row = c(2, 5, 8, 11, 15, 18), # 编辑的行号
gp = gpar(fontface = "bold")) # 使用 gpar 函数设置字体为粗体
# 在顶部插入文本
g <- insert_text(g,
text = "Treatment group", # 插入的文本内容
col = 2:3, # 指定列范围
part = "header", # 插入的部分为头部
gp = gpar(fontface = "bold")) # 使用 gpar 函数设置字体为粗体
# 在头部底部添加下划线
g <- add_border(g, part = "header", row = 1, where = "top") # 在头部第一行顶部添加边框
g <- add_border(g, part = "header", row = 2, where = "bottom") # 在头部第二行底部添加边框
g <- add_border(g, part = "header", row = 1, col = 2:3,
gp = gpar(lwd = 2)) # 在头部第一行第二列到第三列添加粗边框
# 编辑第五行的背景
g <- edit_plot(g, row = 5, which = "background", # 编辑第五行的背景
gp = gpar(fill = "darkolivegreen1")) # 使用 gpar 函数设置背景颜色为 darkolivegreen1
# 插入文本
g <- insert_text(g,
text = "This is a long text. Age and gender summarised above.\nBMI is next", # 插入的文本内容
row = 10, # 插入的行号
just = "left", # 文本对齐方式为左对齐
gp = gpar(cex = 0.6, col = "green", fontface = "italic")) # 使用 gpar 函数设置字体大小为0.6,颜色为绿色,字体为斜体
g <- add_border(g, row = 10, col = 1:3, where = "top") # 在第十行第一列到第三列添加顶部边框
plot(g) # 绘制森林图
多组森林图
# 为第二个置信区间列添加一个空白列
dt$` ` <- paste(rep(" ", 20), collapse = " ") # 在数据框中添加一个名为“ ”的列,用于在森林图中显示空白
# 设置主题
tm <- forest_theme(base_size = 10, # 设置基本字体大小
refline_col = "red", # 设置参考线颜色为红色
footnote_col = "blue", # 设置脚注颜色为蓝色
legend_name = "GP", # 设置图例名称
legend_value = c("Trt 1", "Trt 2")) # 设置图例值
p <- forest(dt[,c(1:2, 20, 3, 22)], # 选择需要绘制的列
est = list(dt$est_gp1,
dt$est_gp2,
dt$est_gp3,
dt$est_gp4), # 效应值列表
lower = list(dt$low_gp1,
dt$low_gp2,
dt$low_gp3,
dt$low_gp4), # 下限列表
upper = list(dt$hi_gp1,
dt$hi_gp2,
dt$hi_gp3,
dt$hi_gp4), # 上限列表
ci_column = c(3, 5), # 置信区间的列索引
ref_line = 1, # 参考线位置
arrow_lab = c("Placebo Better", "Treatment Better"), # 箭头标签
nudge_y = 0.2, # 在 y 轴方向上微调箭头位置
x_trans = "log", # 对 x 轴进行对数转换
theme = tm) # 应用主题
plot(p) # 绘制森林图
参考资料:https://github.com/adayim/forestploter