首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >森林图(Forest Plot)绘制技巧大汇总!!

森林图(Forest Plot)绘制技巧大汇总!!

作者头像
DataCharm
发布于 2021-12-09 06:52:21
发布于 2021-12-09 06:52:21
9.2K00
代码可运行
举报
运行总次数:0
代码可运行

今天这篇推文,小编就带大家了解一下森林图(Forest Plot) 的绘制方法,主要内容如下:

  • 森林图(Forest Plot)的简单介绍
  • R-森林图(Forest Plot)绘制方法
  • Python-森林图(Forest Plot)绘制方法

森林图(Forest Plot)的简单介绍

森林图(Forest Plot) 常用于Meta分析结果展示使用。森林图(可以将观察到的效果、置信区间以及每个研究对象的权重等信息全部表示出来,是一种简单直观地展示单一研究和汇总研究的可视化图表。下面,小编再附上森林图各个绘图元素间关系的解释图:

Key Elements of the Forest plot

注:这里小编简单介绍一下,感兴趣的同学可以自行查阅资料哈。

下面小编就介绍下如何使用R和Python绘制森林图(Forest Plot),可视化结果可能会有所不同。

R-森林图(Forest Plot)绘制方法

使用R绘制森林图(Forest Plot)的方法比较多,这里重点介绍R-forestplot包和R-ggforestplot包绘制。

「注意」:安装R-ggforestplot包之前,确保broom包已安装,否则可能会安装出错。

R-forestplot包绘制

这一部分我们直接使用提供的数据进行绘制,重点在于展示forestplot包中一些绘图参数的设置。

「样例一」:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
library(tidyverse)
library(forestplot)
library(meta)
# 构建数据集
cochrane_from_rmeta <- 
  structure(list(
    mean  = c(NA, NA, 0.578, 0.165, 0.246, 0.700, 0.348, 0.139, 1.017, NA, 0.531), 
    lower = c(NA, NA, 0.372, 0.018, 0.072, 0.333, 0.083, 0.016, 0.365, NA, 0.386),
    upper = c(NA, NA, 0.898, 1.517, 0.833, 1.474, 1.455, 1.209, 2.831, NA, 0.731)),
    .Names = c("mean", "lower", "upper"), 
    row.names = c(NA, -11L), 
    class = "data.frame")
# 可视化绘制
forestplot(tabletext, 
           graph.pos = 4,
           # 修改label,ticks 字体和大小
           txt_gp = fpTxtGp(label = gpar(fontfamily = "Roboto Condensed"),
                            ticks = gpar(fontfamily = "Roboto Condensed", cex = .8)),
           
           hrzl_lines = gpar(col = "#444444"),
           cochrane_from_rmeta,new_page = TRUE,
           is.summary = c(TRUE,TRUE,rep(FALSE,8),TRUE),
           clip = c(0.1,2.5), 
           xlog = TRUE, 
           col = fpColors(box = "#BC3C28",
                          line = "black",
                          summary = "#BC3C28"),
           vertices = TRUE,
           title = "The Example Of forestplot::forestplot()")

The Example Of forestplot::forestplot()

注意:这里设置了graph.pos=4 参数用于改变图表元素位置。

「样例二」:针对多个置信区间时

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
# 构建数据
data(HRQoL)
clrs <- fpColors(box = "royalblue",line = "darkblue", summary = "royalblue")
tabletext <- 
  list(c(NA, rownames(HRQoL$Sweden)),
       append(list(expression(beta)), sprintf("%.2f", HRQoL$Sweden[,"coef"])))

tabletext <- cbind(rownames(HRQoL$Sweden),
                   sprintf("%.2f", HRQoL$Sweden[,"coef"]))
tabletext02 <- tabletext[,1]
#可视化绘制
forestplot(tabletext02, 
           legend = c("Sweden", "Denmark"),
           fn.ci_norm = c(fpDrawNormalCI, fpDrawCircleCI),
           
           txt_gp = fpTxtGp(label = gpar(fontfamily = "Roboto Condensed"),
                            ticks = gpar(fontfamily = "Roboto Condensed", cex = .8),
                            xlab  = gpar(fontfamily = "Roboto Condensed", cex = 1)),
           
           boxsize = .25, # 设置box 大小
           line.margin = .1, # 设置该参数,避免拥挤
           mean = cbind(HRQoL$Sweden[, "coef"], HRQoL$Denmark[, "coef"]),
           lower = cbind(HRQoL$Sweden[, "lower"], HRQoL$Denmark[, "lower"]),
           upper = cbind(HRQoL$Sweden[, "upper"], HRQoL$Denmark[, "upper"]),
           clip = c(-.125, 0.075),
           xticks = c(-.1, -0.05, 0, .05),
           lty.ci = c(1, 2),
           col = fpColors(box = c("#BC3C28", "#0972B5")),
           xlab = "EQ-5D index",vertices = TRUE,
           title = "The Example02 Of forestplot::forestplot()")

The Example02 Of forestplot::forestplot()

以上就简单介绍了forestplot包绘制森林图(Forest Plot),更多详细参数设置和例子,小伙伴们参考forestplot介绍[1]

R-ggforestplot包绘制

ggforestplot包符合ggplot2绘图语法,熟悉ggplot2的小伙伴可能更加适应一下,接下来,小编举几个例子具体介绍下~

「样例一:」 forestplot()函数绘制

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
library(ggforestplot)
library(tidyverse)
df_linear <-
  ggforestplot::df_linear_associations %>%
  dplyr::arrange(name) %>%
  dplyr::filter(dplyr::row_number() <= 30)

# 可视化绘制
ggforestplot::forestplot(
                         df = df_linear,
                         estimate = beta,
                         logodds = FALSE,
                         colour = trait,
                         title = "Associations to metabolic traits",
                         xlab = "1-SD increment in cardiometabolic trait
  per 1-SD increment in biomarker concentration"
) 

The Example01 Of ggforestplot::forestplot()

「样例二」:geom_effect()绘制

这个方法和平时使用ggplot2绘制类似,也可以实现更加方便的定制化操作,如下:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
df <-df_linear_associations %>%
  # 数据处理
  dplyr::arrange(name) %>%
  dplyr::mutate(
    xmin = beta - qnorm(1 - (1 - 0.95) / 2) * se,
    xmax = beta + qnorm(1 - (1 - 0.95) / 2) * se
  ) %>%

  dplyr::filter(dplyr::row_number() <= 30) %>%
  dplyr::mutate(filled = pvalue < 0.001)
  # 可视化绘制
  ggplot(data = df, aes(x = beta, y = name)) +
  geom_effect(
    ggplot2::aes(
      xmin = xmin,
      xmax = xmax,
      colour = trait,
      shape = trait,
      filled = filled
    ),
    size=1.2,
    position = ggstance::position_dodgev(height = 0.5)
  ) +
  scale_colour_nejm() +
  labs(
        title = "Example of <span style='color:#D20F26'>ggforestplot::geom_effect function</span>",
        subtitle = "processed charts with <span style='color:#1A73E8'>geom_effect()</span>",
        caption = "Visualization by <span style='color:#0057FF'>DataCharm</span>") +
  theme_forest() +
  # Add striped background
  geom_stripes() +
  # Add vertical line at null point
  geom_vline(
    xintercept = 0,
    linetype = "solid",
    size = 0.4,
    colour = "black"
  ) +
 theme(text = element_text(family = "Roboto Condensed"),
       plot.title = element_markdown(hjust = 0.5,vjust = .5,color = "black",face = 'bold',
                                  size = 20, margin = margin(t = 10, b = 12)),
       plot.subtitle = element_markdown(hjust = 0,vjust = .5,size=15),
       plot.caption = element_markdown(face = 'bold',size = 12))

The Example01 Of ggforestplot::geom_effect()

以上,小编就简单介绍了使用R-ggforestplot()绘制森林图(Forest Plot)的绘制方法,更多绘图函数和图形参数,小伙伴们可参考R-ggforestplot包介绍[2]。

R-survminer包绘制

最后,小编再介绍使用survminer::ggforest()函数绘制制森林图(Forest Plot),详细如下:

「样例一」:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
library(survminer)
library(survival)
model <- coxph( Surv(time, status) ~ sex + rx + adhere,
                data = colon )
plot01 <- ggforest(model) + 
     labs(
        title = "Example of <span style='color:#D20F26'>survival::ggforest function</span>",
        subtitle = "processed charts with <span style='color:#1A73E8'>ggforest()</span>",
        caption = "Visualization by <span style='color:#0057FF'>DataCharm</span>") +
     theme(text = element_text(family = "Roboto Condensed"),
       plot.title = element_markdown(hjust = 0.5,vjust = .5,color = "black",face = 'bold',
                                  size = 20, margin = margin(t = 10, b = 12)),
       plot.subtitle = element_markdown(hjust = 0.5,vjust = .5,size=15),
       plot.caption = element_markdown(hjust = 1,face = 'bold',size = 11,margin = margin(b = 5,r = 5)))

The Example01 Of survminer::ggforest()

「样例二」:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
colon <- within(colon, {
  sex <- factor(sex, labels = c("female", "male"))
  differ <- factor(differ, labels = c("well", "moderate", "poor"))
  extent <- factor(extent, labels = c("submuc.", "muscle", "serosa", "contig."))
})
bigmodel <-
  coxph(Surv(time, status) ~ sex + rx + adhere + differ + extent + node4,
    data = colon )

plot02 <- ggforest(bigmodel) + 
     labs(
        title = "Example of <span style='color:#D20F26'>survival::ggforest function</span>",
        subtitle = "processed charts with <span style='color:#1A73E8'>ggforest()</span>",
        caption = "Visualization by <span style='color:#0057FF'>DataCharm</span>") +
     theme(text = element_text(family = "Roboto Condensed"),
       plot.title = element_markdown(hjust = 0.5,vjust = .5,color = "black",face = 'bold',
                                  size = 20, margin = margin(t = 10, b = 12)),
       plot.subtitle = element_markdown(hjust = 0.5,vjust = .5,size=15),
       plot.caption = element_markdown(hjust = 1,face = 'bold',size = 11,margin = margin(b = 5,r = 5)))

The Example02 Of survminer::ggforest()

更多详细例子可参考R-survminer[3]

Python-森林图(Forest Plot)绘制方法

Python在绘制森林图(Forest Plot)时可能没R这么方便,但小编也是找到一个可快速绘制的库-zepid。感兴趣的小伙伴可自行搜索,这里小编就接单介绍一下其EffectMeasurePlot()绘图函数,如下:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
import matplotlib.image as mpimg
import numpy as np
import matplotlib.pyplot as plt
import zepid
from zepid.graphics import EffectMeasurePlot
plt.rcParams['font.family'] = ['Times New Roman']


labs = ["ACA(Isq=41.37% Tausq=0.146 pvalue=0.039 )",
        "ICA0(Isq=25.75% Tausq=0.092 pvalue=0.16 )",
        "ICA1(Isq=60.34% Tausq=0.121 pvalue=0.00 )",
        "ICAb(Isq=25.94% Tausq=0.083 pvalue=0.16 )",
        "ICAw(Isq=74.22% Tausq=0.465 pvalue=0.00 )"]
measure = [2.09,2.24,1.79,2.71,1.97]
lower = [1.49,1.63,1.33,2.00,1.25]
upper = [2.92,3.07,2.42,3.66,3.11]
p = EffectMeasurePlot(label=labs, effect_measure=measure, lcl=lower, ucl=upper)
p.labels(effectmeasure='RR')
p.colors(pointshape="D")
ax=p.plot(figsize=(8,4), t_adjuster=0.09, max_value=4, min_value=0.35)
plt.title("Random Effect Model(Risk Ratio)",loc="right",x=1, y=1.045)
plt.suptitle("Missing Data Imputation Method",x=-0.1,y=0.98)
ax.set_xlabel("Favours Control      Favours Haloperidol       ", fontsize=10)
ax.spines['top'].set_visible(False)
ax.spines['right'].set_visible(False)
ax.spines['bottom'].set_visible(True)
ax.spines['left'].set_visible(False)
plt.savefig(r"forest_plot02_python.png",width=8,height=6,
          dpi=900,bbox_inches='tight',facecolor='white')

Example Of EffectMeasurePlot() in Python

此外,zepid库还提供了其他绘图函数,感兴趣的小伙伴可阅读Python-zepid[4]

总结

今天这篇推文,小编汇总了如何使用R和Python绘制森林图(Forest Plot)。使用的方法也较为简单,希望可以给小伙伴们带来绘图便利,当然,更多绘图函数和参数,还需自行探索哈~~

参考资料

[1]forestplot包介绍: https://cran.r-project.org/web/packages/forestplot/vignettes/forestplot.html。

[2]ggforestplot包官网: https://nightingalehealth.github.io/ggforestplot/articles/ggforestplot.html。

[3]survminer官网: https://rpkgs.datanovia.com/survminer/index.html。

[4]zepid官方文档: https://zepid.readthedocs.io/en/latest/index.html。

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2021-12-04,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 DataCharm 微信公众号,前往查看

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

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

评论
登录后参与评论
暂无评论
推荐阅读
【一步步一起学DApp开发】(四)web3.js 基本使用 | 连接geth | 创建web客户端
web3.js内部使用JSONRPC与geth通信。它把所有JSON-RPC API当作JavaScript API,也就是说,它不仅支持所有与以太坊相关的API,还支持与Whisper和Swarm相关的API。
前端修罗场
2023/10/07
1.2K0
web3.fromWei
如果你希望马上开始学习以太坊DApp开发,可以访问汇智网提供的出色的在线互动教程: 以太坊DApp实战开发入门 去中心化电商DApp实战开发 以太坊货币单位之间的转换。将以wei为单位的资金,转换为指定单位的数值: 调用: web3.fromWei(number, unit) 参数: number:. Number|String|BigNumber - 数字或BigNumber。 unit:. String - 单位字符串 货币单位可取值如下 kwei/ada mwei/babbage gwei/shan
用户1408045
2018/05/17
7470
以太坊开发指南 #1
你应该听说过了以太坊[4]了,准备进入以太坊的世界冒险了吗?这篇文章将快速介绍一些区块链基础知识,然后让了解与模拟的以太坊节点进行交互--读取区块数据,检查账户余额并发送交易。在这个过程中,我们将理解传统的应用程序与这种新的去中心化应用之间的差异。
Tiny熊
2021/02/25
1.3K0
以太坊开发指南 #1
web3.toWei
如果你希望马上开始学习以太坊DApp开发,可以访问汇智网提供的出色的在线互动教程: 以太坊DApp实战开发入门 去中心化电商DApp实战开发 将给定资金转换为以wei为单位的数值。 调用: web3.toWei(number, unit) 参数: number:Number|String|BigNumber - 数字或BigNumber unit : String - 字符串单位 可选择的单位如下: kwei/ada mwei/babbage gwei/shannon szabo finney ether
用户1408045
2018/05/17
7640
搭建以太坊私有链
区块链技术正在逐渐走向成熟,以太坊作为区块链领域的重要代表被广泛应用于智能合约、去中心化应用等领域,然而公有链上的交易需要消耗大量的手续费,且数据的公开性也限制了其在某些场景下的应用。因此搭建以太坊私有链成为了一种更加灵活、高效、安全的解决方案,本文将介绍如何搭建以太坊私有链帮助读者更好地理解和应用区块链技术
Al1ex
2023/09/07
1.8K1
搭建以太坊私有链
以太坊介绍和使用
以太坊是一个能够在区块链上实现智能合约、开源的底层系统。换言之,以太坊是可编程的区块链,它并不是给用户一系列预先设定好的操作(例如比特币交易),而是允许用户按照自己的意愿创建复杂的操作。这样一来,以太坊是就可以作为多种类型去中心化区块链应用的平台,这些应用比如包括之前很火的各种代币但并不仅限于此,我们可以做很多除了代币之外的东西,比如你可以输出一行代表自己不是外行身份的hello world,或者在上面做一个简单的计算器,总之你可以在上面实现你想要的任何功能。
fnatic
2022/07/15
37.4K0
第三课 以太坊术语说明及开发者资源列表
也称钱包,提供账户管理、挖矿、转账、智能合约的部署和执行等等功能,以太坊节点利用以太坊客户端接入到以太坊网络。 现在以太坊客户端主要有:Wallent/ist , Geth, Parity, Harmony,
辉哥
2018/08/10
8050
第三课 以太坊术语说明及开发者资源列表
第十一课 从宠物商店案例看DAPP架构和WEB3.JS交互接口
【本文目标】 了解ETH生态下DAPP去中心化应用程序的框架和交互流程,了解WEB3.JS的作用和接口函数。 【前置条件】 完成了《第六课 技术小白如何开发一个DAPP区块链应用(以宠物商店为例)》的学习实践,对智能合约了解。 【技术收获】 1). DAPP架构 2). ETH节点框架 3).宠物商店的APP.js文件的业务处理流程图和函数介绍 4).web3.js接口
辉哥
2018/08/10
2.7K0
第十一课 从宠物商店案例看DAPP架构和WEB3.JS交互接口
web3.py简介
与web3.py库交互的共同入口是web3对象。web3对象提供API,用于python开发的应用与以太坊区块链进行交互,通常是通过连接JSON-RPC服务器进行。
笔阁
2018/09/04
1.3K0
【手把手】如何在10分钟内搭建一个以太坊私有链?
在开发以太坊时,很多时候需要搭建一条以太坊私有链,这篇来自作者熊丽兵的文章,手把手教你10分钟内如何在Mac上进行搭建。 作者 | 熊丽兵 整理 | 科科 阅读本文前,你应该对以太坊语言有所了解,如果你还不了解,建议你先看以太坊是什么。 go-ethereum客户端安装 Go-ethereum客户端通常被称为Geth,它是个命令行界面,执行在Go上实现的完整以太坊节点。Geth得益于Go语言的多平台特性,支持在多个平台上使用(比如Windows、Linux、Mac)。Geth是以太坊协议的具体落地实现,通过
区块链大本营
2018/06/19
2.5K0
以太坊私链入门
中国广东省深圳市龙华新区民治街道溪山美地 518131 +86 13113668890 <netkiller@msn.com>
netkiller old
2018/02/02
5.1K2
快速学习-Geth 控制台命令
Geth Console 是一个交互式的 JavaScript 执行环境,里面内置了一些用来操作以太坊的 JavaScript 对象,我们可以直接调用这些对象来获取区块链上的相关信息。这些对象主要包括: eth:主要包含对区块链进行访问和交互相关的方法; net:主要包含查看 p2p 网络状态的方法; admin:主要包含与管理节点相关的方法; miner:主要包含挖矿相关的一些方法; personal:包含账户管理的方法; txpool:包含查看交易内存池的方法; web3:包含以上所有对象,还包含一些通用方法。 常用命令有: personal.newAccount():创建账户; personal.unlockAccount():解锁账户; eth.accounts:列出系统中的账户; eth.getBalance():查看账户余额,返回值的单位是 Wei; eth.blockNumber:列出当前区块高度; eth.getTransaction():获取交易信息; eth.getBlock():获取区块信息; miner.start():开始挖矿; miner.stop():停止挖矿; web3.fromWei():Wei 换算成以太币; web3.toWei():以太币换算成 Wei; txpool.status:交易池中的状态;
cwl_java
2020/04/10
2.1K0
以太坊查看账户余额
如果你希望马上开始学习以太坊DApp开发,可以访问汇智网提供的出色的在线互动教程: 以太坊DApp实战入门教程 以太坊去中心化电商应用开发实战 使用web3获取账户余额 可以使用JavaScript API来获取以太坊账户余额,例如在JavaScript代码中: web3.fromWei(web3.eth.getBalance(web3.eth.coinbase)); 如果你在geth控制台里,可以将web3.eth使用其eth别名代替: > web3.fromWei(eth.getBalance(et
用户1408045
2018/05/17
3.1K0
智能合约:介绍、geth、Ethereum Wallet
从看雪论坛换了一本《智能合约安全分析和审计指南》,看了一些智能合约相关的内容,因为我之前对于区块链的了解仅仅是只知道世界上有一种叫做比特币的东西,所以对于这些概念的理解还是比较困难的
yichen
2020/05/04
1.9K0
以太坊开发入门 - 基本概念
本质上是一个去中心的数据库,区块链包含一串数据块,每个数据块中包含若干交易数据、时间戳等信息,可用于验证交易的有效性。
寒星
2018/06/19
6500
以太坊的安装、私有链创世区块搭建以及智能合约的部署
官方下载地址:https://geth.ethereum.org/downloads/ 下载相应系统版本的geth,安装成功后可以查看版本信息:
梦飞
2022/06/23
1.6K0
以太坊的安装、私有链创世区块搭建以及智能合约的部署
web3js 实战基本操作
这个篇文章的总结是在学习 b站web3.js的一个基础教程课 的课程总结,方便后续在文章中查找API。
六个周
2023/02/16
1.8K0
从零构建以太坊(Ethereum)智能合约到项目实战——第22章 玩转truffle framework 、Web3.js 框架
P84 、1-玩转truffle framework、Web3、js 框架 内容介绍
墨文
2020/02/28
5480
探路以太坊
关键字:以太坊,加密货币,crowdsale,geth,console,web3.js 以太坊简介 一句话简介:以太坊是一个基于功能齐全的编程语言构建的众多去中心化区块链应用的平台。 下面来解读一下这句话: 平台:首先以太坊是一个平台,这个平台上面有很多应用。 应用:这些应用是是去中心化的,基于区块链技术。所以这些应用可以实现永不停歇,因为它是分布式的,去中心化的,基于P2P网络的,这些应用被管理在以太坊钱包上面。 钱包:以太坊钱包,本质上以太坊钱包也是其中一个应用,它是一个网关,可以管理所有基
文彬
2018/05/03
2K0
CentOS7 搭建以太坊私有链
这里要注意下 最新的golang 1.10 和go-ethereum-1.7.3 不太兼容
王小明_HIT
2019/08/13
1.2K0
相关推荐
【一步步一起学DApp开发】(四)web3.js 基本使用 | 连接geth | 创建web客户端
更多 >
LV.1
这个人很懒,什么都没有留下~
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验