在python jupyter笔记本上创建gif文件

时间:2020-06-27 00:23:52

标签: python numpy matplotlib jupyter-notebook gif

我正在研究一种疾病的随机模型,即人们在家里随机移动,然后在给定的时间去上班,在工作一段时间后,他们回到家中,所有移动都是随机的,每当有人靠近被感染的个体时,都会绘制一个随机变量来了解健康个体是否被感染。

我有两个问题:

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)
        

它基本上有一个时间循环,每次检查新的感染,人们在健康的,潜在的和传染性的隔间之间移动,然后根据人的当前状态绘制颜色。

欢迎任何帮助!

0 个答案:

没有答案