当前位置: 首页 > news >正文

使用python绘制森林图的教程

森林图

森林图(Forest Plot)是一种数据可视化工具,广泛用于医学、流行病学和统计学等领域。直观地展示了多个研究或组别的效应估计值及其不确定性(通常以置信区间的形式),帮助比较和总结多个结果。

森林图特点

横轴表示效应估计值

森林图的横轴通常表示效应量,例如比值比(Odds Ratio)、风险比(Risk Ratio)、平均差(Mean Difference)等。数值可以大于或小于1,具体取决于效应类型。

误差条(置信区间)

每个点代表一个研究或亚组的效应估计值,左右两侧的误差条表示估计值的95%置信区间。置信区间越宽,表示结果的不确定性越大。

垂直线(基线)

图中的垂直线通常是1(或0,视效应量类型而定),用于判断效应是否显著。若置信区间包含此基线,则表明该效应可能不显著。

各组或研究的展示

图中列出多个组别、研究或亚组的名称,每行代表一个单独的估计结果。通过这些结果,可以直观比较不同组或研究的效应。

使用森林图的主要场景

荟萃分析(Meta-Analysis)

森林图是荟萃分析的核心工具,用于汇总多个独立研究的结果,以评估整体效应。每个研究的效应估计值及其置信区间在图中单独显示,最后还可以展示合并效应。

亚组分析(Subgroup Analysis)

当分析不同亚组(如不同年龄、性别、治疗方案等)时,森林图可以清晰展示各亚组的效果,帮助识别哪些人群受益或风险更高。

临床试验

在临床试验中,森林图用于展示不同治疗组或方法之间的比较,帮助判断治疗效果。

观察性研究

森林图可以用于观察性研究,比较不同暴露组(如吸烟 vs. 不吸烟)的效应差异。

森林图的优点

直观性

能够同时展示多个研究或亚组的效应量和不确定性,便于快速比较。

识别一致性和异质性

森林图能帮助识别各研究之间的一致性或变异性。

辅助决策

通过展示综合的效应量,帮助临床和公共卫生决策。

这里提供简单的绘制 python代码

import matplotlib.pyplot as plt
import pandas as pd# 创建数据框,基于提供的图像中的数据
data = {'Group': ['NEO', '', 'Histologic patterns', '', 'MRF/CRM', '', '', 'Clinic high risk', '', 'Age', '', 'Gender', '', 'Differentiation', '', 'Tumor site', '', 'MRI-N', '', '', 'Method of surgery', ''],'Subgroup': ['No', 'Yes', 'Adenocarcinoma', 'Mucinous adenocarcinoma', 'Negative', 'Positive', 'Unknown', 'No', 'Yes', '< 60', '> 60', 'Male', 'Female', 'Well/Moderate', 'Poor/undifferentiated', 'Median', 'Lower', 'N0', 'N1-2', 'Nx', 'Dixon/ISR or Park’s/TaTME', 'Miles or Hartmann'],'Number': [198, 185, 347, 34, 235, 118, 11, 194, 187, 199, 182, 255, 126, 280, 101, 220, 161, 89, 284, 8, 303, 75],'P_value': [0.743, 0.743, 0.32, 0.32, 0.25, 0.25, 0.25, 0.662, 0.662, 0.602, 0.602, 0.891, 0.891, 0.834, 0.834, 0.567, 0.567, 0.149, 0.149, 0.149, 0.874, 0.874],'Estimate': [2.3, 0.4, 0.4, 0.7, 0.3, 0.5, 0.7, 2.3, 0.3, 3.0, 2.3, 2.6, 0.4, 2.4, 0.4, 2.4, 0.3, 2.0, 0.3, 2.2, 2.5, 0.4],'Lower_CI': [1.3, 0.2, 0.3, 0.2, 0.2, 0.3, 0.1, 1.3, 0.2, 1.8, 1.3, 1.6, 0.2, 1.5, 0.2, 1.4, 0.2, 0.9, 0.2, 0.2, 1.6, 0.2],'Upper_CI': [4.0, 0.6, 0.6, 2.5, 0.6, 1.0, 6.7, 4.0, 0.6, 5.1, 4.0, 4.1, 0.8, 3.8, 0.8, 4.0, 0.6, 4.4, 0.5, 24.5, 3.9, 0.9]
}# 将数据字典转换为DataFrame
df = pd.DataFrame(data)# 设置图形的大小
plt.figure(figsize=(12, 10))# 遍历每一行,绘制误差条
for i, row in df.iterrows():plt.errorbar(row['Estimate'], i, xerr=[[row['Estimate'] - row['Lower_CI']], [row['Upper_CI'] - row['Estimate']]],fmt='o', color='black', ecolor='black', capsize=3, markersize=5)# 添加垂直线 x=1 作为参考线
plt.axvline(x=1, color='black', linestyle='--', linewidth=1)# 设置y轴的刻度和标签,将组名和子组名结合显示
plt.yticks(range(len(df)), [f"{group} {subgroup}" if group else subgroup for group, subgroup in zip(df['Group'], df['Subgroup'])])# 设置x轴标签和图表标题
plt.xlabel('Estimate (95% CI)')
plt.title('Forest Plot')# 反转y轴,使得顶部的条目在图中更高
plt.gca().invert_yaxis()# 调整图表布局
plt.tight_layout()# 显示图表
plt.show()

在这里插入图片描述

这幅森林图的目的是展示不同组别或亚组的效应估计值及其95%置信区间。每一行代表一个特定的组别或子组,图中的点表示该组的效应估计值(例如相对风险、比值比等),而误差条表示估计值的置信区间(即估计值的不确定性范围)。

点:每个点表示该组的效应估计值。如果是比值比(如OR、RR),通常大于1表示有增加的风险,小于1表示有降低的风险。
误差条(置信区间):误差条代表估计值的95%置信区间,表明效应估计的统计不确定性。置信区间越窄,估计值越精确;越宽,则不确定性越大。
垂直参考线:通常在x=1的位置(如果是OR、RR)绘制一条虚线。这条线表示“无效效应”(即没有差异)。如果置信区间跨过这条线,说明效应可能不显著。
分组标签:每一行都有相应的分组或亚组名称,表示具体分析的对象,比如不同的治疗方法、风险因素、患者特征等。

如果某个组的效应估计值的置信区间不包含1,且估计值显著偏离1,意味着该组的效应显著。
如果置信区间非常宽,说明该组的结果不够确定,可能需要更多的数据来提高精确性。
组别之间的比较可以帮助评估哪些条件或亚组可能对结果有显著影响。

如果是直接读取csv文件

import pandas as pd
import matplotlib.pyplot as plt# 读取CSV文件
df = pd.read_csv('forest_plot_data.csv')# 绘制森林图
plt.figure(figsize=(12, 10))# 遍历每一行,绘制误差条
for i, row in df.iterrows():plt.errorbar(row['Estimate'], i, xerr=[[row['Estimate'] - row['Lower_CI']], [row['Upper_CI'] - row['Estimate']]],fmt='o', color='black', ecolor='black', capsize=3, markersize=5)# 添加垂直线 x=1
plt.axvline(x=1, color='black', linestyle='--', linewidth=1)# 设置y轴的刻度和标签
plt.yticks(range(len(df)), [f"{group} {subgroup}" if group else subgroup for group, subgroup in zip(df['Group'], df['Subgroup'])])# 设置标签和标题
plt.xlabel('Estimate (95% CI)')
plt.title('Forest Plot')# 反转y轴使得顶部条目在图中更高
plt.gca().invert_yaxis()# 调整布局
plt.tight_layout()# 显示图形
plt.show()

在这里插入图片描述

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • 如何制作Vector Vflash中加载的DLL文件--自动解锁刷写过程中27服务
  • C++类与对象(下)--最后的收尾
  • jmeter依赖jar包找不到类路径
  • SQL入门题
  • 【IPV6从入门到起飞】5-3 IPV6+Home Assistant(ESP32+MQTT+GPIO)远程控制灯
  • Java 抽象类 接口--详解
  • 判断语句有几种写法
  • 【解决】AnimationCurve 运行时丢失数据问题
  • 三十三、Gin的中间件
  • 使用 ECharts 实现响应式图表:优化移动端用户体验
  • QT如何通过QTableWidget控件开发表格功能
  • 默认端口被占用后,如何修改Apache2 端口
  • Vue3 : ref 与 reactive
  • 计算机组成原理——第二章(19)
  • 基于SpringBoot的考研资讯平台设计与实现
  • 3.7、@ResponseBody 和 @RestController
  • Cumulo 的 ClojureScript 模块已经成型
  • JS基础之数据类型、对象、原型、原型链、继承
  • Logstash 参考指南(目录)
  • MySQL的数据类型
  • MySQL几个简单SQL的优化
  • Nodejs和JavaWeb协助开发
  • SpiderData 2019年2月16日 DApp数据排行榜
  • Vim 折腾记
  • Vue学习第二天
  • 前端工程化(Gulp、Webpack)-webpack
  • 深入浅出Node.js
  • MiKTeX could not find the script engine ‘perl.exe‘ which is required to execute ‘latexmk‘.
  • Java数据解析之JSON
  • ​DB-Engines 12月数据库排名: PostgreSQL有望获得「2020年度数据库」荣誉?
  • ​云纳万物 · 数皆有言|2021 七牛云战略发布会启幕,邀您赴约
  • #Linux杂记--将Python3的源码编译为.so文件方法与Linux环境下的交叉编译方法
  • #QT 笔记一
  • #VERDI# 关于如何查看FSM状态机的方法
  • $$$$GB2312-80区位编码表$$$$
  • (1)Android开发优化---------UI优化
  • (Bean工厂的后处理器入门)学习Spring的第七天
  • (Mac上)使用Python进行matplotlib 画图时,中文显示不出来
  • (Redis使用系列) SpringBoot 中对应2.0.x版本的Redis配置 一
  • (分布式缓存)Redis分片集群
  • (附源码)spring boot北京冬奥会志愿者报名系统 毕业设计 150947
  • (附源码)spring boot基于小程序酒店疫情系统 毕业设计 091931
  • (附源码)ssm学生管理系统 毕业设计 141543
  • (接口自动化)Python3操作MySQL数据库
  • (每日一问)计算机网络:浏览器输入一个地址到跳出网页这个过程中发生了哪些事情?(废话少说版)
  • (四)linux文件内容查看
  • (转)平衡树
  • (轉貼) 2008 Altera 亞洲創新大賽 台灣學生成果傲視全球 [照片花絮] (SOC) (News)
  • ./mysql.server: 没有那个文件或目录_Linux下安装MySQL出现“ls: /var/lib/mysql/*.pid: 没有那个文件或目录”...
  • .FileZilla的使用和主动模式被动模式介绍
  • .net core 管理用户机密
  • .Net Redis的秒杀Dome和异步执行
  • .NET 设计模式—适配器模式(Adapter Pattern)
  • .NET下的多线程编程—1-线程机制概述
  • .NET中统一的存储过程调用方法(收藏)