我正在研究一种疾病的随机模型,即人们在家里随机移动,然后在给定的时间去上班,在工作一段时间后,他们回到家中,所有移动都是随机的,每当有人靠近被感染的个体时,都会绘制一个随机变量来了解健康个体是否被感染。
我有两个问题:
1.-根据matplotlib.pyplot制作的图形,并在帧之间有给定的等待时间,有没有办法让jupyter自动生成gif?
2.--如果是这样,我如何制作一条跟随感染者并持续一段时间的“传染性踪迹”,而我知道如何对其进行编码,以便它可以感染遍历它的人们,所以我不会不知道我如何以颜色随时间消失的方式绘制它(随着传染性的消失)。
我当前正在使用的代码如下:
import numpy as np
import matplotlib.pyplot as plt
import time
import math
dias=2
niter=24
N=100
X0=np.random.uniform(size=N)
Y0=np.random.uniform(size=N)
INF=[]
INF_INC=[]
INF.append(np.random.choice(range(N)))
MAX_SPEED=0.2
W=[0.3,0.3]
RAD_W=0.1
RAD_H=0.05
RAD_INF=0.1
INF_THRESHOLD=0.95
INC_TIME=1
circle1 = plt.Circle((W[0], W[1]), RAD_W, color='y')
plt.plot(X0,Y0,'r*')
SUC_X=np.delete(X0,INF)
SUC_Y=np.delete(Y0,INF)
plt.gcf().gca().add_artist(circle1)
plt.plot(SUC_X,SUC_Y,'bo')
plt.plot(X0[INF],Y0[INF],'go')
plt.show()
NEW_POSX=[[]]*niter*dias
NEW_POSY=[[]]*niter*dias
INCUBANDO=[[]]*dias
INCUB_TIMES=[[]]*dias
time.sleep(0.1)
NEW_POSX[0][:]=X0[:]
NEW_POSY[0][:]=Y0[:]
for d in range(dias):
INCUBANDO[d]=INF_INC
INCUB_TIMES[d]=np.around(np.random.normal(INC_TIME,1/10,size=len(INCUBANDO[d])))
if d==0:pass
else:
for s in range(d):
AUXLIST=[]
for inf in range(len(INCUBANDO[d])):
if d-s>=INCUB_TIMES[d][inf]:
INF.append(INCUBANDO[d][inf])
AUXLIST.append(inf)
INCUBANDO[d]=[INCUBANDO[d][j] for j in range(len(INCUBANDO[d])) if j not in AUXLIST]
for t in range(1,niter):
print('La hora es: ',t,':00')
if t >=9 and t <=18:
for n in range(N):
if math.sqrt((NEW_POSX[t-1][n] - W[0])**2+(NEW_POSY[t-1][n] - W[1])**2)<=RAD_W:
NEW_POSX[t][n]=min(max(NEW_POSX[t-1][n] +np.random.normal(0,RAD_W/2),0),1)
NEW_POSY[t][n]=min(max(NEW_POSY[t-1][n] +np.random.normal(0,RAD_W/2),0),1)
else:
MX=np.random.normal(W[0]- NEW_POSX[t-1][n],RAD_W/2)
MY=np.random.normal(W[0]- NEW_POSY[t-1][n],RAD_W/2)
SX=np.sign(MX)
SY=np.sign(MY)
NEW_POSX[t][n]=min(max(NEW_POSX[t-1][n] +SX*min(abs(MX),MAX_SPEED),0),1)
NEW_POSY[t][n]=min(max(NEW_POSY[t-1][n] +SY*min(abs(MY),MAX_SPEED),0),1)
else:
for n in range(N):
if math.sqrt((NEW_POSX[t-1][n] - X0[0])**2+(NEW_POSY[t-1][n] - Y0[1])**2)<=RAD_H:
NEW_POSX[t][n]=min(max(NEW_POSX[t-1][n] +np.random.normal(0,RAD_H/2),0),1)
NEW_POSY[t][n]=min(max(NEW_POSY[t-1][n] +np.random.normal(0,RAD_H/2),0),1)
else:
MXH=np.random.normal(X0[n]-NEW_POSX[t-1][n],RAD_H/2)
MYH=np.random.normal(Y0[n]-NEW_POSY[t-1][n],RAD_H/2)
SXH=np.sign(MXH)
SYH=np.sign(MYH)
NEW_POSX[t][n]=min(max(NEW_POSX[t-1][n] +SXH*min(abs(MXH),MAX_SPEED),0),1)
NEW_POSY[t][n]=min(max(NEW_POSY[t-1][n] +SYH*min(abs(MYH),MAX_SPEED),0),1)
for i in INF:
for j in np.delete(range(N),list(set(INF)|set(INF_INC))):
coin=np.random.uniform()
if math.sqrt((NEW_POSX[t][i] - NEW_POSX[t][j])**2+(NEW_POSY[t][i] - NEW_POSY[t][j])**2)<=RAD_INF and coin>=INF_THRESHOLD:
INF_INC.append(j)
plt.clf()
NEW_INFX=[NEW_POSX[t][i] for i in INF]
NEW_INFY=[NEW_POSY[t][j] for j in INF]
NEW_INFINCX=[NEW_POSX[t][i] for i in INF_INC]
NEW_INFINCY=[NEW_POSY[t][j] for j in INF_INC]
plt.plot(np.delete(NEW_POSX[t],list(set(INF)|set(INF_INC))),np.delete(NEW_POSY[t],list(set(INF)|set(INF_INC))),'bo',X0,Y0,'r*')
plt.plot(NEW_INFINCX,NEW_INFINCY,'o',color='lime')
plt.plot(NEW_INFX,NEW_INFY,'go')
circle1 = plt.Circle((W[0], W[1]), 0.1, color='y')
plt.gcf().gca().add_artist(circle1)
plt.show()
time.sleep(0.1)
它基本上有一个时间循环,每次检查新的感染,人们在健康的,潜在的和传染性的隔间之间移动,然后根据人的当前状态绘制颜色。
欢迎任何帮助!