Python绘图——生存曲线

news2025/1/4 18:47:46

今天我们将一起学习如何利用Python中____lifelines包_____建模和分析生存数据并用plot_绘制生存曲线,以及更改其样式如标题字号大小,坐标轴及图例设置等,使用Python即可绘制出SCI论文图!___

lifelines包

lifelines 是一个 Python 生存分析库,用于建模和分析生存数据。它提供了许多用于生存分析的工具,包括 Kaplan-Meier 生存曲线、Cox 比例风险模型、Aalen 加法风险模型等。下面是一些 lifelines 中常用的功能和概念的详解:

  • Kaplan-Meier 生存曲线:

  • Kaplan-Meier 生存曲线是一种用于估计生存概率的非参数方法。它可用于分析生存数据,例如患者的存活时间。KaplanMeierFitter 类用于拟合 Kaplan-Meier 生存曲线。可以使用 fit 方法拟合数据,然后使用 plot 方法绘制生存曲线图。

  • Cox 比例风险模型:

  • Cox 比例风险模型是一种用于分析生存数据的半参数方法。它可以用来研究不同因素对生存时间的影响。CoxPHFitter 类用于拟合 Cox 比例风险模型。可以使用 fit 方法拟合模型,然后进行参数估计和假设检验。

  • Aalen 加法风险模型:

  • Aalen 加法风险模型是一种用于考虑时间依赖性的生存分析方法。它适用于具有时间相关危险率的数据。AalenAdditiveFitter 类用于拟合 Aalen 加法风险模型。可以使用 fit 方法拟合模型,然后进行参数估计和假设检验。

  • 生存数据格式:lifelines 通常使用 Pandas 数据框(DataFrame)来表示生存数据。数据框包括观察时间(时间至事件发生或截尾)和事件状态(1 表示事件发生,0 表示事件未发生)。

  • 生存曲线绘制:

    使用 plot 方法可以绘制 Kaplan-Meier 生存曲线。您可以自定义图表的颜色、标签、置信区间等参数。

  • 生存分析统计量:

lifelines 提供了一系列生存分析统计量,如中位生存时间、生存概率、累积危险函数等,用于描述生存数据的特征。

lifelines 提供了强大的工具来处理和分析生存数据,使研究人员能够更好地理解和解释生存时间数据中的模式和趋势。可以根据具体的研究问题选择合适的方法和模型来进行生存分析。

接下来我们简单演示一下:

import pandas as pd``from lifelines import KaplanMeierFitter``import matplotlib.pyplot as plt``   ``# 示例数据,包括观察时间和事件状态(1表示事件发生,0表示事件未发生)``data_group1 = pd.DataFrame({`    `'time': [5, 10, 15, 20, 25, 30, 35, 40, 45, 50],`    `'event': [1, 1, 0, 1, 0, 1, 1, 0, 1, 0]``})``   ``   ``# 创建 Kaplan-Meier 生存曲线对象``kmf = KaplanMeierFitter()``   ``# 拟合第一组数据并绘制曲线(使用红色线条)``kmf.fit(data_group1['time'], event_observed=data_group1['event'])``kmf.plot(label='Group 1', color='red')``   ``# 添加图例``plt.legend()``   ``# 添加图表标题和标签``plt.title('Kaplan-Meier Survival Curve')``plt.xlabel('Time')``plt.ylabel('Survival Probability')``   ``# 显示图表``plt.show()``   

输出:

我们使用KM函数拟合生存曲线并绘制,首先我们创建一组生存数据(DataFrame格式),并用KM函数进行拟合,plot进行绘图,绘制出的曲线即为生存曲线,阴影部分代表95%置信区间。

plot绘图参数设置

我们可以与seaborn结合绘制更美观的曲线图,并可以利用plt.annotate()函数为其添加注释:

import pandas as pd``import matplotlib.pyplot as plt``import seaborn as sns``from lifelines import KaplanMeierFitter``   ``# 示例数据``data = pd.DataFrame({`    `'time': [5, 10, 15, 20, 25, 30, 35, 40, 45, 50],`    `'event': [1, 1, 0, 1, 0, 1, 1, 0, 1, 0]``})``   ``# 创建 Kaplan-Meier 生存曲线对象``kmf = KaplanMeierFitter()``   ``# 拟合生存曲线``kmf.fit(data['time'], event_observed=data['event'], label='Overall Survival')``   ``# 创建图表``fig, ax = plt.subplots(figsize=(10, 6))``sns.set_style("white")``   ``# 绘制生存曲线``kmf.plot(ci_show=False, color='blue', lw=2, label='Overall Survival', ax=ax)``   ``# 添加标签和标题``plt.title('Kaplan-Meier Survival Curve')``plt.xlabel('Time (Months)')``plt.ylabel('Survival Probability')``   ``# 添加自定义文本注释``plt.annotate('Median Survival: 35 months', xy=(35, 0.5), xytext=(40, 0.65),`             `arrowprops=dict(facecolor='black', shrink=0.05),`             `fontsize=12, color='black')``   ``# 自定义 x 轴刻度``plt.xticks(np.arange(0, 40, 5))``   ``# 添加图例``plt.legend()``   ``# 去掉上边框和右边框线``ax.spines['top'].set_visible(False)``ax.spines['right'].set_visible(False)``   ``# 显示图表``plt.show()

输出:

在这里我们使用seaborn中的图像样式进行绘制,可以更改图表的背景和轴线的外观。seaborn 提供了以下几种主要的样式:

  • “whitegrid”:白色背景,带有网格线。

  • “darkgrid”:深色背景,带有网格线。

  • “white”:白色背景,无网格线。

  • “dark”:深色背景,无网格线。

  • “ticks”:白色背景,带有刻度线但无网格线。

  • “poster”:适用于大尺寸图表,字号较大的样式。

  • “notebook”:默认样式,适用于 Jupyter Notebook 等交互式环境。

我们在plot函数中通过设置ci_show=False去掉了置信区间,color参数设置曲线的颜色,lw参数设置曲线的线宽,label设置曲线的标签,下面我们详细介绍一下plot函数中各参数的意义:

KaplanMeierFitter.plot(ax=None, ci_alpha=0.95, show_censors=False, censor_styles=None, ci_force_lines=False, ci_show=True, title=None, xlabel=None, ylabel=None, **kwargs)
  • ax:可选参数,指定要绘制生存曲线的 Matplotlib Axes 对象。如果未提供此参数,将创建一个新的图表。

  • ci_alpha:可选参数,表示置信区间的置信水平。默认为 0.95,表示计算 95% 置信区间。

  • show_censors:可选参数,表示是否显示截尾标记。如果为 True,则显示截尾标记(默认为 False)。

  • censor_styles:可选参数,用于自定义截尾标记的样式。可以提供一个字典,指定不同样式的标记。

  • ci_force_lines:可选参数,表示是否强制绘制置信区间的线条。默认为 False,表示绘制阶梯状的置信区间区域。

  • ci_show:可选参数,表示是否显示置信区间。默认为 True,表示显示置信区间区域或线条。

  • title:可选参数,用于设置图表的标题。

  • xlabel:可选参数,用于设置 x 轴的标签。

  • ylabel:可选参数,用于设置 y 轴的标签。

  • **kwargs:其他可选参数,用于传递给 Matplotlib 的绘图函数。

添加刻度线及更改字号

上述图像还有一些小缺点就是各个标题字号太小,而且没有刻度线,下面我们来改善一下:

import pandas as pd``import matplotlib.pyplot as plt``import seaborn as sns``from lifelines import KaplanMeierFitter``   ``# 示例数据``data = pd.DataFrame({`    `'time': [5, 10, 15, 20, 25, 30, 35, 40, 45, 50],`    `'event': [1, 1, 0, 1, 0, 1, 1, 0, 1, 0]``})``   ``# 创建 Kaplan-Meier 生存曲线对象``kmf = KaplanMeierFitter()``   ``# 拟合生存曲线``kmf.fit(data['time'], event_observed=data['event'], label='Overall Survival')``   ``# 创建图表``fig, ax = plt.subplots(figsize=(10, 6))``sns.set_style("white")``   ``# 绘制生存曲线``kmf.plot(ci_show=False, color='blue', lw=2, label='Overall Survival', ax=ax)``   ``# 添加标签和标题``plt.title('Kaplan-Meier Survival Curve', fontsize=18)``plt.xlabel('Time (Months)', fontsize=15)``plt.ylabel('Survival Probability', fontsize=15)``   ``# 添加自定义文本注释``plt.annotate('Median Survival: 35 months', xy=(35, 0.5), xytext=(40, 0.65),`             `arrowprops=dict(facecolor='black', shrink=0.05),`             `fontsize=14, color='black')``   ``# 自定义 x 轴刻度``plt.xticks(np.arange(0, 55, 5),fontsize=12)``plt.yticks(fontsize=12)  # 调整 y 轴刻度的字号``   ``# 添加图例``plt.legend(fontsize=14)``   ``# 去掉上边框和右边框线``ax.spines['top'].set_visible(False)``ax.spines['right'].set_visible(False)``   ``# 设置刻度线``ax.tick_params(axis='both', which='both', bottom=True, left=True)``   ``# 显示图表``plt.show()

输出:

我们通过设置ax.tick_params函数设置刻度线,fontsize调整字号大小,这样看起来顺眼多了,我们还可以绘制两组生存曲线:

import pandas as pd``import matplotlib.pyplot as plt``import seaborn as sns``from lifelines import KaplanMeierFitter``   ``# 示例数据``data = pd.DataFrame({`    `'time': [5, 10, 15, 20, 25, 30, 35, 40, 45, 50],`    `'event': [1, 1, 0, 1, 1, 1, 1, 0, 1, 0]``})``data2 = pd.DataFrame({`    `'time': [5, 10, 15, 20, 25, 30, 35, 40, 45, 50],`    `'event': [0, 1, 0, 0, 1, 0, 1, 0, 0, 0]``})``# 创建 Kaplan-Meier 生存曲线对象``kmf = KaplanMeierFitter()``   ``# 拟合生存曲线``kmf.fit(data['time'], event_observed=data['event'], label='Overall Survival')``   ``# 创建图表``fig, ax = plt.subplots(figsize=(10, 6))``sns.set_style("white")``   ``# 绘制生存曲线``kmf.plot(ci_show=False, color='blue', lw=2, label='Group 1', ax=ax)``   ``# 拟合第二组数据并绘制曲线(使用蓝色线条)并去掉置信区间``kmf.fit(data2['time'], event_observed=data2['event'])``kmf.plot(label='Group 2', color='red', ci_show=False, ax=ax,lw=2)``   ``# 添加标签和标题``plt.title('Kaplan-Meier Survival Curve', fontsize=18)``plt.xlabel('Time (Months)', fontsize=15)``plt.ylabel('Survival Probability', fontsize=15)``   ``   ``# 自定义 x 轴刻度``plt.xticks(np.arange(0, 55, 5),fontsize=12)``plt.yticks(fontsize=12)  # 调整 y 轴刻度的字号``   ``# 添加图例``plt.legend(fontsize=14)``   ``# 去掉上边框和右边框线``ax.spines['top'].set_visible(False)``ax.spines['right'].set_visible(False)``   ``# 设置刻度线``ax.tick_params(axis='both', which='both', bottom=True, left=True)``   ``# 显示图表``plt.show()

输出:

还可以通过设置plt.legend中的参数调整图例样式:

import pandas as pd``import matplotlib.pyplot as plt``import seaborn as sns``from lifelines import KaplanMeierFitter``   ``   ``# 示例数据``data = pd.DataFrame({`    `'time': [5, 10, 15, 20, 25, 30, 35, 40, 45, 50],`    `'event': [1, 1, 0, 1, 1, 1, 1, 0, 1, 0]``})``data2 = pd.DataFrame({`    `'time': [5, 10, 15, 20, 25, 30, 35, 40, 45, 50],`    `'event': [0, 1, 0, 0, 1, 0, 1, 0, 0, 0]``})``# 创建 Kaplan-Meier 生存曲线对象``kmf = KaplanMeierFitter()``   ``# 拟合生存曲线``kmf.fit(data['time'], event_observed=data['event'], label='Overall Survival')``   ``# 创建图表``fig, ax = plt.subplots(figsize=(10, 6))``sns.set_style("white")``   ``# 绘制生存曲线``kmf.plot(ci_show=False, color='blue', lw=2, label='Group 1', ax=ax)``# 拟合第二组数据并绘制曲线(使用蓝色线条)并去掉置信区间``kmf.fit(data2['time'], event_observed=data2['event'])``kmf.plot(label='Group 2', color='red', ci_show=False, ax=ax,lw=2)``   ``# 添加标签和标题``plt.title('Kaplan-Meier Survival Curve', fontsize=18)``plt.xlabel('Time (Months)', fontsize=15)``plt.ylabel('Survival Probability', fontsize=15)``   ``# 自定义 x 轴刻度``plt.xticks(np.arange(0, 55, 5),fontsize=12)``plt.yticks(fontsize=12)  # 调整 y 轴刻度的字号``# 添加图例``plt.legend(fontsize=14, frameon=False)``   ``# 去掉上边框和右边框线``ax.spines['top'].set_visible(False)``ax.spines['right'].set_visible(False)``   ``# 设置刻度线``ax.tick_params(axis='both', which='both', bottom=True, left=True)``# 显示图表``plt.show()

输出:

这里我们通过设置frameon=False,取消了图例的边框。其内包含其他参数如下:

  • labels:一个包含图例标签的列表,用于指定每个图例项的标签文本。

  • loc:用于指定图例的位置。常见的取值包括 ‘best’(自动选择最佳位置)、‘upper right’(右上角)、‘upper left’(左上角)、‘lower right’(右下角)、‘lower left’(左下角)等。您也可以使用数字表示位置,例如,0 表示 ‘best’,1 表示 ‘upper right’,以此类推。

  • fontsize:用于设置图例文本的字号大小。

  • title:用于设置图例的标题文本。

  • title_fontsize:用于设置图例标题的字号大小。

  • frameon:一个布尔值,用于控制是否显示图例的边框。设置为 False 可以去掉边框,设置为 True 则显示边框。

  • facecolor:用于设置图例的背景颜色。

  • edgecolor:用于设置图例的边框颜色。

  • framealpha:用于设置图例边框的透明度。

  • ncol:用于设置图例的列数,以便在一行中显示多个图例项。

  • bbox_to_anchor:用于设置图例的位置,可以指定图例的左下角坐标相对于 Axes 坐标系的位置。

  • bbox_transform:指定 bbox_to_anchor 参数的参考坐标系,通常使用 ‘axes’(Axes 坐标系)或 ‘figure’(Figure 坐标系)。

ax.legend 函数用于设置图例的属性,包括标签、位置、字号、颜色等。我们可以根据自己的需求进行绘制。

总结

以上就是本次推送的全部内容,希望小伙伴们能够多提提建议!

---------------------------END---------------------------

题外话

在这里插入图片描述

感兴趣的小伙伴,赠送全套Python学习资料,包含面试题、简历资料等具体看下方。

👉CSDN大礼包🎁:全网最全《Python学习资料》免费赠送🆓!(安全链接,放心点击)

一、Python所有方向的学习路线

Python所有方向的技术点做的整理,形成各个领域的知识点汇总,它的用处就在于,你可以按照下面的知识点去找对应的学习资源,保证自己学得较为全面。

img
img

二、Python必备开发工具

工具都帮大家整理好了,安装就可直接上手!img

三、最新Python学习笔记

当我学到一定基础,有自己的理解能力的时候,会去阅读一些前辈整理的书籍或者手写的笔记资料,这些笔记详细记载了他们对一些技术点的理解,这些理解是比较独到,可以学到不一样的思路。

img

四、Python视频合集

观看全面零基础学习视频,看视频学习是最快捷也是最有效果的方式,跟着视频中老师的思路,从基础到深入,还是很容易入门的。

img

五、实战案例

纸上得来终觉浅,要学会跟着视频一起敲,要动手实操,才能将自己的所学运用到实际当中去,这时候可以搞点实战案例来学习。

img

六、面试宝典

在这里插入图片描述

在这里插入图片描述

简历模板在这里插入图片描述

👉CSDN大礼包🎁:全网最全《Python学习资料》免费赠送🆓!(安全链接,放心点击)

若有侵权,请联系删除

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/994950.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

猫头虎的技术笔记:Spring Boot启动报错解决方案

🌷🍁 博主猫头虎(🐅🐾)带您 Go to New World✨🍁 🦄 博客首页——🐅🐾猫头虎的博客🎐 🐳 《面试题大全专栏》 🦕 文章图文…

算法竞赛个人注意事项

浅浅记录一下自己在算法竞赛中的注意事项。 数据类 注意看数大小,数学库中的函数尽量加上 * 1.0,转成double,防止整型溢出。,int型相乘如果可能溢出,乘 * 1LL。 数据范围大于1e6,注意用快读。 浮点数输…

桉木建筑模板与其他常见建筑模板材料相比有什么优势?

桉木建筑模板与其他常见建筑模板材料相比具有以下优势: 1. 强度和稳定性:桉木具有较高的密度和硬度,使其具备出色的抗弯和抗压能力。相比于其他常见建筑模板材料如胶合板或钢模板,桉木建筑模板能够更好地承受施工期间的荷载和压力…

类和对象的基本概念

目录 c和c中结构体的区别 类的封装 c语言中的行为和属性封装存在的问题 c中对事物的封装——类的封装 尽量将成员变量设置为private 代码示例 c和c中结构体的区别 c语言中struct只有变量,不能存放函数,也就是数据(属性)和行为&#xf…

学信息系统项目管理师第4版系列06_项目管理概论

1. 项目基础 1.1. 项目是为创造独特的产品、服务或成果而进行的临时性工作 1.1.1. 独特的产品、服务或成果 1.1.2. 临时性工作 1.1.2.1. 项目有明确的起点和终点 1.1.2.2. 不一定意味着项目的持续时间短 1.1.2.3. 临时性是项目的特点,不是项目目标的特点 1.1…

什么是 DNS 隧道以及如何检测和防止攻击

什么是 DNS 隧道? DNS 隧道是一种DNS 攻击技术,涉及在 DNS 查询和响应中对其他协议或程序的信息进行编码。DNS 隧道通常具有可以锁定目标 DNS 服务器的数据有效负载,允许攻击者管理应用程序和远程服务器。 DNS 隧道往往依赖于受感染系统的…

记一起小意外事件引起的批量重命名文件名

一、事件描述 某次,因某业务系统迁移,一线人员对业务目录误操作,执行打包命令过程中导致Tomcat下的web应用程序无法使用,检查后发现项目下所有文件名都加了gz格式;询问一线,发现是对项目目录执行了:gzip -r ./tomcat导致程序文件找不到;报错如下: 二、事件处理 1、查看…

联表查询的时候外键id是字符串

联表查询的时候外键id是字符串 例: 第一种:可以使用:FIND_IN_SET 关键字进行查询(推荐) SELECTt.task_name,t.task_id,t.common_ids,t.task_description,t.task_type,t.task_state,t.task_start_time,t.task_end_tim…

算法-88.合并两个有序数组-⭐

给你两个按 非递减顺序 排列的整数数组 nums1 和 nums2,另有两个整数 m 和 n ,分别表示 nums1 和 nums2 中的元素数目。 请你 合并 nums2 到 nums1 中,使合并后的数组同样按 非递减顺序 排列。 注意:最终,合并后数组…

在Qt5中SQLite3的使用

一、SQLite简要介绍 什么是SQLite SQLite是一个进程内的库,实现了自给自足的、无服务器的、零配置的、事务性的 SQL 数据库引擎。它是一个零配置的数据库,这意味着与其他数据库不一样,您不需要在系统中配置。 就像其他数据库,S…

【AI】机器学习——感知机

文章目录 4.1 感知机基本概念4.2 策略4.2.1 数据集的线性可分性4.2.2 学习策略目标损失函数的构造关于距离的解释 4.3 算法4.3.1 原始形式损失函数的梯度下降法 4.3.2 PLA例题4.3.3 算法收敛性 4.4 PLA对偶形式4.4.1 原始PLA分析4.4.2 PLA对偶形式4.4.3 优点 4.1 感知机基本概念…

理财是什么?怎样学习理财?

大家好,我是财富智星,今天跟大家分享一下理财是什么?怎样学习理财的方法。 一、理财的基本原则 1、理财应注重投资而不是投机,要与时间为友。 让我们先考虑以下问题:什么样的回报才算是真正的高回报?假设有…

HTML5 进阶知识

简答题 什么是 HTML5 标签的语义化&#xff1f; HTML5 标签的语义化是指使用具有语义意义的标签来描述网页内容。例如&#xff0c;使用 <header> 标签来表示页眉&#xff0c;使用 <main> 标签来表示主要内容区&#xff0c;使用 <footer> 标签来表示页脚。 什…

Wireshark 用命令行分析数据包

1&#xff0c;那些情况需要使用命令行 Wireshark一次性提供了太多的信息。使用命令行工具可以限制打印出的信息&#xff0c;最后只显示相关数据&#xff0c;比如用单独一行来显示IP地址。命令行工具适用于过滤数据包捕获文件&#xff0c;并提供结果给另一个支持UNIX管道的工具…

Yolov5如何训练自定义的数据集,以及使用GPU训练,涵盖报错解决

本文主要讲述了Yolov5如何训练自定义的数据集&#xff0c;以及使用GPU训练&#xff0c;涵盖报错解决&#xff0c;案例是检测图片中是否有救生圈。 最后的效果图大致如下&#xff1a; 效果图1效果图2 前言 系列文章 1、详细讲述Yolov5从下载、配置及如何使用GPU运行 2、…

最新仿闲鱼链接+独立后台管理 跳转APP

2024最新仿xy链接源码 后台一键生成链接&#xff0c;后台管理教程&#xff1a;解压源码&#xff0c;修改数据库config/Congig 不会可以看源码里有教程 下载程序&#xff1a;https://pan.baidu.com/s/16lN3gvRIZm7pqhvVMYYecQ?pwd6zw3

JS防抖和节流在前端开发中的应用场景

聚沙成塔每天进步一点点 ⭐ 专栏简介⭐ 防抖&#xff08;Debouncing&#xff09;⭐ 节流&#xff08;Throttling&#xff09;⭐ 写在最后 ⭐ 专栏简介 前端入门之旅&#xff1a;探索Web开发的奇妙世界 记得点击上方或者右侧链接订阅本专栏哦 几何带你启航前端之旅 欢迎来到前端…

C++与C编译后符号表对比(一百九十二)

简介&#xff1a; CSDN博客专家&#xff0c;专注Android/Linux系统&#xff0c;分享多mic语音方案、音视频、编解码等技术&#xff0c;与大家一起成长&#xff01; 优质专栏&#xff1a;Audio工程师进阶系列【原创干货持续更新中……】&#x1f680; 人生格言&#xff1a; 人生…

DBeaver 下载、安装与数据库连接(MySQL)详细教程【超详细,保姆级教程!!!】

本文介绍DBeaver 下载、安装与数据库连接&#xff08;MySQL&#xff09;的详细教程 一、DBeaver 下载 官网下载地址&#xff1a;https://dbeaver.io/download/ 二、安装 1、双击下载的安装包&#xff0c;选择中文 2、点击下一步 3、点击我接受 4、如下勾选&#xff0c;…

Java高级——类加载及执行子系统的案例与实战

类加载及执行子系统的案例与实战 概述类加载器案例TomcatOSGi 字节码案例动态代理Java逆向移植工具 实战——远程执行功能目标思路实现验证&#xff08;未完成&#xff0c;不会写JSP&#xff09; 概述 Class文件以何种格式存储、字节码指令如何执行等都是由JVM控制 字节码生成…