Python绘图——生存曲线

今天我们将一起学习如何利用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()``   

输出:

Python绘图——生存曲线_第1张图片

我们使用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()

输出:

Python绘图——生存曲线_第2张图片

在这里我们使用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()

输出:

Python绘图——生存曲线_第3张图片

我们通过设置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()

输出:

Python绘图——生存曲线_第4张图片

还可以通过设置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()

输出:

Python绘图——生存曲线_第5张图片

这里我们通过设置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必备开发工具

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

三、最新Python学习笔记

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

img

四、Python视频合集

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

img

五、实战案例

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

img

六、面试宝典

在这里插入图片描述

在这里插入图片描述

简历模板

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

若有侵权,请联系删除

你可能感兴趣的:(python,开发语言)