受杰森的《Almost Looks Like Work》启发,我来展示一些病毒传播模型。需要注意的是这个模型并不反映现实情况,因此不要误以为是西非可怕的传染病。相反,它更应该被看做是某种虚构的僵尸爆发现象。那么,让我们进入主题。
这就是SIR模型,其中字母S、I和R反映的是在僵尸疫情中,个体可能处于的不同状态。
上面的模型没有考虑S/I/R的空间分布,下面来修正一下!
一种方法是把瑞典和北欧国家分割成网格,每个单元可以感染邻近单元,描述如下:
其中对于单元,和是它周围的四个单元。(不要因为对角单元而脑疲劳,我们需要我们的大脑不被吃掉)。
初始化一些东东。
import numpy as np import math import matplotlib.pyplot as plt %matplotlib inline from matplotlib import rcParams import matplotlib.image as mpimg rcParams['font.family'] = 'serif' rcParams['font.size'] = 16 rcParams['figure.figsize'] = 12, 8 from PIL import Image
适当的beta和gamma值就能够摧毁大半江山
beta = 0.010 gamma = 1
还记得导数的定义么?当导数已知,假设Δt很小的情况下,经过重新整理,它可以用来近似预测函数的下一个取值,我们已经声明过u′(t)。
初始化一些东东。
import numpy as np import math import matplotlib.pyplot as plt %matplotlib inline from matplotlib import rcParams import matplotlib.image as mpimg rcParams['font.family'] = 'serif' rcParams['font.size'] = 16 rcParams['figure.figsize'] = 12, 8 from PIL import Image
适当的beta和gamma值就能够摧毁大半江山
beta = 0.010 gamma = 1
还记得导数的定义么?当导数已知,假设Δt很小的情况下,经过重新整理,它可以用来近似预测函数的下一个取值,我们已经声明过u′(t)。
这种方法叫做欧拉法,代码如下:
def euler_step(u, f, dt): return u + dt * f(u)
我们需要函数f(u)。友好的numpy提供了简洁的数组操作。我可能会在另一篇文章中回顾它,因为它们太强大了,需要更多的解释,但现在这样就能达到效果:
def f(u): S = u[0] I = u[1] R = u[2] new = np.array([-beta*(S[1:-1, 1:-1]*I[1:-1, 1:-1] + S[0:-2, 1:-1]*I[0:-2, 1:-1] + S[2:, 1:-1]*I[2:, 1:-1] + S[1:-1, 0:-2]*I[1:-1, 0:-2] + S[1:-1, 2:]*I[1:-1, 2:]), beta*(S[1:-1, 1:-1]*I[1:-1, 1:-1] + S[0:-2, 1:-1]*I[0:-2, 1:-1] + S[2:, 1:-1]*I[2:, 1:-1] + S[1:-1, 0:-2]*I[1:-1, 0:-2] + S[1:-1, 2:]*I[1:-1, 2:]) - gamma*I[1:-1, 1:-1], gamma*I[1:-1, 1:-1] ]) padding = np.zeros_like(u) padding[:,1:-1,1:-1] = new padding[0][padding[0] < 0] = 0 padding[0][padding[0] > 255] = 255 padding[1][padding[1] < 0] = 0 padding[1][padding[1] > 255] = 255 padding[2][padding[2] < 0] = 0 padding[2][padding[2] > 255] = 255 return padding
导入北欧国家的人口密度图并进行下采样,以便较快地得到结果
from PIL import Image img = Image.open('popdens2.png') img = img.resize((img.size[0]/2,img.size[1]/2)) img = 255 - np.asarray(img) imgplot = plt.imshow(img) imgplot.set_interpolation('nearest')
北欧国家的人口密度图(未包含丹麦)
S矩阵,也就是易感个体,应该近似于人口密度。感染者初始值是0,我们把斯德哥尔摩作为第一感染源。
S_0 = img[:,:,1] I_0 = np.zeros_like(S_0) I_0[309,170] = 1 # patient zero
因为还没人死亡,所以把矩阵也置为0.
R_0 = np.zeros_like(S_0)
接着初始化模拟时长等。
T = 900 # final time dt = 1 # time increment N = int(T/dt) + 1 # number of time-steps t = np.linspace(0.0, T, N) # time discretization # initialize the array containing the solution for each time-step u = np.empty((N, 3, S_0.shape[0], S_0.shape[1])) u[0][0] = S_0 u[0][1] = I_0 u[0][2] = R_0
我们需要自定义一个颜色表,这样才能将感染矩阵显示在地图上。
import matplotlib.cm as cm theCM = cm.get_cmap("Reds") theCM._init() alphas = np.abs(np.linspace(0, 1, theCM.N)) theCM._lut[:-3,-1] = alphas
下面坐下来欣赏吧…
for n in range(N-1): u[n+1] = euler_step(u[n], f, dt)
让我们再做一下图像渲染,把它做成gif,每个人都喜欢gifs!
from images2gif import writeGif keyFrames = [] frames = 60.0 for i in range(0, N-1, int(N/frames)): imgplot = plt.imshow(img, vmin=0, vmax=255) imgplot.set_interpolation("nearest") imgplot = plt.imshow(u[i][1], vmin=0, cmap=theCM) imgplot.set_interpolation("nearest") filename = "outbreak" + str(i) + ".png" plt.savefig(filename) keyFrames.append(filename) images = [Image.open(fn) for fn in keyFrames] gifFilename = "outbreak.gif" writeGif(gifFilename, images, duration=0.3) plt.clf()
本文向大家介绍Python绘制全球疫情变化地图的实例代码,包括了Python绘制全球疫情变化地图的实例代码的使用技巧和注意事项,需要的朋友参考一下 目前全球疫情仍然比较严重,为了能清晰地看到疫情爆发以来至现在全球疫情的变化趋势,我绘制了一张疫情变化地图。 废话不多说,先上图 下面就来重点介绍下上面这张图的绘制过程,主要分为以下三个步骤: 数据收集 数据处理 画图 下面一个一个来说。 数据收集 这是
问题内容: 我正在尝试制作散点图的动画,其中点的颜色和大小在动画的不同阶段会发生变化。对于数据,我有两个带有x值和y值的numpy ndarray: 现在我想绘制一个散点图 并在索引上创建动画。我该怎么做呢? 问题答案: 假设有一个散点图scat = ax.scatter(…),则可以 改变立场 其中array是N x 2x和y坐标的形状数组。 改变大小 其中array是以点为单位的一维尺寸数组。
本文向大家介绍python在openstreetmap地图上绘制路线图的实现,包括了python在openstreetmap地图上绘制路线图的实现的使用技巧和注意事项,需要的朋友参考一下 利用python进行经纬度轨迹展示 嘿!各位好久不见,距离第一次发博客已经过去两年多了,本人也从本科生变成了研究生,好了书归正传,最近在做一个关于航班滑行路径轨迹的项目,目的是将航班的经纬度数据在地图上显现出来并
我正在使用函数scatter和mplot3d绘制一个三维散点图。我正在为绘图中的所有点选择单一颜色,但当使用matplotlib绘制时,点的透明度将相对于与摄影机的距离进行设置。有没有办法禁用此功能? 我尝试将alpha-kwarg设置为None/1,并将vmin/vmax设置为1(试图强制颜色缩放为纯色单色),但没有成功。我在散点文档中没有看到与此设置相关的任何其他可能选项。 谢谢
ClickableMap、按照字面意思上说,就是可以「点」的「地图」、通过在一张图片上定义数个「领域」、使玩家可以通过在图片上进行鼠标点击和选择的东西。 吉里吉里/KAG中制作地图,除了需要地图画面本身以外,还需要「领域图片(领域画像)」和「领域动作定义档」这两样,以上三个文件构成完整的地图。 领域图片又是什么? 领域图片是一张和地图画面同样大小,位元数设定成256色的图片。256色以上位元
问题内容: 在Python中,使用Matplotlib,一个带有空圆的散点图怎么可能是 密谋?我们的目标是在一些彩色磁盘周围画一个空圆圈 已经被“scatter()”绘制,以便突出显示,理想情况下没有 不得不重新画彩色圆圈。 我试过“facecolors=None”,但没用。 问题答案: From the documentation for scatter: Try the following: