🎄Forestplot in R

type
status
date
slug
summary
tags
category
icon
password
comment

引言

森林图(Forest plot)是生物医学、流行病学和统计学研究中常用的可视化工具,主要用于展示多变量回归分析(如OR/HR及其置信区间)或Meta分析的结果。一个清晰、美观的森林图不仅有助于直观呈现数据结论,也是论文和报告中重要的图表类型。
R语言中已经有不少用于绘制森林图的工具包,但实际使用中,许多默认样式并不能完全满足论文发表或正式汇报对美观性和信息表达的需求。因此,如何高效地绘制格式规范、内容充实、风格美观的森林图,成为科研工作者和数据分析人员常常遇到的问题。
本篇文章将简要梳理R中常用的森林图绘制方法,比较不同工具包的优缺点,并以forestploter为例,介绍如何从基础用法到进一步定制,实现更高质量的图形展示。最后,也会分享一份便于复用的自定义绘图函数,以期为有类似需求的同仁提供一些参考。

1. 森林图的原理与R语言常规实现

什么是森林图?

森林图(Forest plot)是一种用于展示多个变量效应量及其置信区间的统计图表。最早广泛应用于Meta分析,近年来在多变量回归、组间比较等医学和生物统计分析中也成为常见的可视化方式。
通过森林图,可以直观地比较不同变量或亚组的效应大小,同时展示估计值的不确定性。这类图表有助于揭示哪些因素具有统计学意义或实际意义。

主要应用场景

  • 回归分析(如Logistic回归、Cox回归等):用于展示各变量的OR、HR等及其95%置信区间。
  • Meta分析:用于合并多个研究结果,直观显示各研究及总体效应。
  • 组间比较/亚组分析:快速比较不同组别下指标的影响。

森林图的基本结构

一张标准的森林图通常包含如下元素:
  • 变量名(Variables):如性别、年龄、吸烟等
  • 点估计值(Estimate / OR / HR):每个变量的效应量
  • 置信区间(95% CI):评估估计值的可信范围
  • p值/显著性标注(P value):用于区分统计显著与否
  • 参考线(Reference line):一般为OR=1或HR=1,作为无效应参考
这种结构使森林图能够兼顾信息量和可读性,成为医学和生信论文中极为常用的统计图表之一。
notion image
notion image
 

2. R语言画森林图的主流工具

R有多种绘制森林图的包,最常用的包括:
  • forestplot —— 经典、简单表格式展示。
    • notion image
      通过自定义参数设置,也可以绘制出更美观、个性化的图形:
      notion image
  • forestploter —— 新一代美化神器,适合定制化发表级别森林图,支持自定义样式、批量修改、美观对齐等。
    • notion image
  • 其他如 ggplot2(灵活性极高,但代码较繁琐),meta(专注于Meta分析,可直接绘制合并效应森林图)等,也可用于特定场景下的森林图绘制。
本教程将重点介绍 forestploter 包的用法,因为它在美观度、灵活性和扩展性方面明显优于传统方法,更适合需要高质量、可定制的科研图表。

3. 用forestploter绘制基础森林图

安装与加载

准备数据

准备一个数据框(data.frame),包含绘图所需的主要字段:
  • variable:变量名
  • estimate:点估计(如 OR、HR)
  • conf.low:置信区间下界
  • conf.high:置信区间上界
  • p.value:P 值

最小可运行代码(Hello Forest Plot)

这样就能画出一张最基础的森林图。如果你追求更美观和实用,还可以自定义配色、标签、显著性等,后面会详细讲解。

4. 进阶美化与批量处理

自定义主题

森林图的“美观度”很大程度上取决于主题(forest_theme()),可以通过主题参数快速定制点线样式、字体、颜色、底色等,满足不同杂志或会议风格需求。

自定义箱体颜色与显著性高亮

在实际科研/投稿场景中,除了整体主题美化,我们常希望不同变量分组使用不同颜色的CI箱体(比如区分人群/风险方向),以及对显著性变量(如P < 0.05)自动加粗或突出显示,让结果一目了然。
forestploter 的最大优势之一就是支持批量自定义每一行的箱体颜色和显著性自动高亮。实现思路如下:
  • 箱体颜色:你可以提前设置一个颜色向量(如分组配色、渐变、强调某些变量),然后用 edit_plot() 逐行修改每一行CI箱体的颜色,轻松实现“多彩森林图”。
  • 显著性高亮:自动检测P值,显著性变量(如 P < 0.05)自动加粗对应的表格内容(比如“p.value”那一列),高效且直观。

使用场景举例

  • 分层变量对比:比如男性/女性、暴露组/对照组,各自用不同箱体色,更直观区分分组。
  • 多因子联动展示:强调高风险/低风险变量或亚组,结果展示更清晰。
  • 投稿/报告美观度提升:显著性一目了然,杂志级别可视化。

实现方法与代码示例

设置好你需要的箱体颜色显著性阈值后,只需几行代码即可自动实现批量美化(可与上一节主题代码无缝衔接):

温馨提示

  • 只要提前定义好颜色向量和显著性逻辑,即可灵活批量美化森林图,不必手动调整每一行。
  • 如果想同时加粗并变色,可设定 gpar(fontface = "bold", col = "red") 等复合样式。
  • 你也可以进一步扩展,比如根据其他变量分组动态着色,或为高风险组用深色强调。

表格列对齐美化(进阶)

在美化森林图表格时,不同信息列常有不同的最佳对齐方式:
  • 变量名/描述(如 variable)左对齐更自然,便于浏览。
  • p值、数值结果等通常右对齐,方便比对数字位数。
forestploter 提供了灵活的 edit_plot() 功能,可以逐列设置对齐方式,让整个表格观感与SCI期刊、医学报告一致。

对齐实现思路

  1. 先设定每一类列的对齐目标(左、中、右)。
  1. edit_plot() 对 body(内容)和 header(表头)分别调整对齐参数。
  1. 批量自动处理所有相关列,保证效率和一致性。

实现代码(带详细中文注释)

场景说明

  • 如果你的表格结构不同(比如只展示2列),可根据实际调整align_leftalign_centeralign_right的列号。
  • 这种批量调整方式适合任何自定义格式的森林图,能让“混合型表格”完美对齐,无需一列一列手动调。

使用 ggsave() 导出森林图(适用于 ggplot2 对象)

ggsave()ggplot2 的专用导出函数,支持多种图片格式。 典型写法如下:
  • filename(或file)指定保存文件名和格式
  • plot 指定要保存的 ggplot2 对象
  • width/height/units 控制图片物理尺寸(建议单位用 "cm" 便于期刊/幻灯片排版)
  • dpi 决定分辨率,300适合论文,600适合医学核心或细节要求高的场合

5. 一键式发表级森林图函数:plot_forest() (evanverse 包)

这一节介绍个人 R 包 evanverse(GitHub:@evanbio)中集成的森林图整合函数 plot_forest()
该函数充分吸收了前文所有美化、批量处理和自动对齐经验,面向实际科研与数据分析需求设计,一行代码即可生成美观、可定制的出版级森林图

核心特点

  • 支持自动检测数据列名,灵活兼容各种结果表结构
  • 内置高美观主题、分组配色、显著性高亮与对齐,开箱即用
  • 可自定义每一项参数,兼容复杂批量绘图/流程脚本

参数说明(完整注释,包文档标准)

🚩完整函数源码已收录于 evanverse R 包,欢迎 star 交流或 PR。

典型用法(最小例子)

补充说明
  • 如果你的列名就是默认值(如上),可省略后面这些参数,直接 plot_forest(data) 也行,但建议总是“写明每一列”更稳健。
  • 如果列名不同(比如 or, lci, uci, p),你就要这样写:

    总结

    • 森林图是医学和生信统计分析中不可或缺的可视化工具,适用于回归、分组、Meta分析等多场景。
    • R语言的 forestploter 包支持美观且高度定制的森林图输出。
    • 通过前文介绍,从数据整理、主题美化到批量出图与个性化定制,你可以轻松实现论文级、发表级的森林图可视化,显著提升结果呈现的专业性。

    相关阅读/扩展

     
    Prev
    科学上网指南:信息时代的通行证
    Next
    NFC读写器操作流程
    Loading...
    Article List
    Evan の Logbook
    ✨ Updates
    🎨 Style Guide
    🧠 Creative Resources
    🗒️ Mind Notes
    🧭 Knowbase
    📘 SOPs
    🩺 Medical Research
    🛠️ Tech Chronicles
    💰 Fortune Blueprint
    📈 R Visionary
    📊 Statistics
    🖼️ BioVis