使用python 编写一个 传染病的交互式绘图

935 阅读5分钟

持续创作,加速成长!这是我参与「掘金日新计划 · 10 月更文挑战」的第23天,点击查看活动详情

传染病的交互式绘图

当我对这本文进行最后的润色时,我正在国内遵循与限制Covid-19疾病传播相关的“社交距离”限制。与许多呼吸道病毒一样,SARS-CoV-2病毒主要通过人与人之间的接触传播。保持社交距离旨在减少人与人之间的接触,从而限制由病毒引起的疾病的传播。

image.png

图 13-14。包含对传染病发病率随时间推移的简单模拟。参数 fixed 是一个字典,用于定义与感染传播相关的关键变量的初始值。参数变量是定义与社交距离相关的变量的字典。稍后,我们将展示如何在交互式绘图中更改变量的值。

在本文的后面,我们将详细讨论仿真模型。然而,在这里,我们专注于交互式绘图,模拟的目的是为我们提供一些有趣的东西来绘制。如果您不了解模拟的细节,那没关系。

图 13-15 包含一个函数,该函数生成一个静态图,显示每天的感染人数。它还包含一个文本框,显示感染者的总人数。这以 txt_box = plt.text 开头的语句指示 Python 在前两个参数指定的位置开始由 plt.text 的第三个参数指定的文本。表达式 plt.xlim() [1]/2 将文本的左边缘放在 x 轴的左端(对于此图为 o)和 x 轴的右端之间。表达式 plt.ylim()[1]/1.25 将文本放置在从 y 轴底部(此图中的 o)到 y 轴顶部的 80% 处。

image.png

图 13-16 使用图 13-14 和图 13-15 中的函数生成图 13-17 中的图,显示感染人数(假设没有社交距离)。固定的值不是基于特定疾病。假设一个人平均每天与50人“接触”似乎令人惊讶。但是,请记住,此数字包括间接接触,例如,与感染者乘坐同一辆公共汽车或触摸可能由感染者沉积病原体的物体。

image.png

image.png

该图显示当前感染数量迅速上升,随后迅速下降到当前感染为零的稳定状态。快速增长的发生是因为每个感染者都会感染

当前感染人数多个其他人,因此能够传播感染的人数呈指数级增长。没有新感染的稳定状态发生是因为人口已经实现了群体免疫。当足够大一部分人群对某种疾病免疫时(我们假设从这种疾病中康复的人无法再次感染这种疾病),在很长一段时间内没有人感染这种疾病,这最终导致没有人留下来传播它. 我们可以在固定变量中更改某些变量的值,并生成另一个图。然而,这是探索“假设”场景的一种相当繁琐的方法。相反,让我们生成一个包含滑块85的图表,该图表可用于动态更改与社交距离相关的关键参数:减少contacts_per_day,red_start和red_end。

该图将具有四个独立的组件:主图和字典变量的每个元素的一个滑块。我们首先通过指定每个组件的整体尺寸(12 英寸宽和 8.5 英寸高)、位置(以与文本框相同的方式指定)和尺寸(相对于整个图形的大小)来描述图形的布局。我们还为每个组件绑定了一个名称,以便以后可以引用它们。

image.png

接下来的代码行定义了三个滑块,每个滑块对应于我们要更改的每个值。首先,我们导入一个包含类滑块的模块

image.png

接下来,我们创建三个滑块,将每个滑块绑定到一个变量

image.png

image.png

接下来,我们提供了一个函数 update,该函数根据滑块的当前值更新绘图。

image.png

接下来,我们需要指示Python在滑块的值发生更改时调用更新。这有点棘手。Slider 类包含一个方法 on_changed,该方法采用每当更改滑块时调用的函数类型的参数。此函数始终只采用一个参数,即表示滑块当前值的数字。但是,在我们的例子中,每次更改滑块时,我们都希望使用所有三个滑块的值和字典固定的值来运行模拟。

我们通过引入一个新函数来解决这个问题,该函数是on_changed的合适论据。函数slider_update采用强制数字参数,但不使用它。相反,定义slider_update的 lambda 表达式捕获固定、infection_plot txt_box和三个滑块绑定到的对象。然后,它使用这些参数调用更新。

image.png

image.png

最后,我们绘制感染曲线,并更新图中绑定到infections_ax部分中的文本框。

image.png

运行此代码时,将生成图 13-18.86 中的图

image.png

现在,我们可以轻松地尝试滑块值的许多组合,其中一个显示在 Eigure 13-19 中。

当前感染人数

image.png

图 13-19。表明,如果在20天后将接触者减少到平均每天25次并保持在该水平40周,则感染总数减少。更重要的是,感染的峰值数量(以及因此对医疗保健系统的最大负担)大大减少。这通常称为使曲线变平。