first, I'm sorry if my question seems really simple, but I am a python beginner. I've been writing for a while this code modeling the spread of an epidemic using cellular automata. The code is the following :
import matplotlib.colors
import numpy as np
import matplotlib.pyplot as plt
from matplotlib import colors
from matplotlib.animation import FuncAnimation
import matplotlib.animation as ani
import random as rd
import random
import copy
from matplotlib.colors import ListedColormap
cmap=ListedColormap(['k','w','r','b'])
dead=0
untouched=1
ill=2
recovered=3
previous_state_matrix = []
current_state_matrix = []
n=50 #number of array (table of 50*50 : 2500 cells)
def init_graph():
plt.hlines(y=np.arange(0, 50)+0.5, xmin=np.full(50, 0)-0.5,linewidth=0.25,xmax=np.full(50, 50)-0.5, color="grey")
plt.vlines(x=np.arange(0, 50)+0.5, ymin=np.full(50, 0)-0.5,linewidth=0.25, ymax=np.full(50, 50)-0.5, color="grey")
def init_matrix_array():
global previous_state_matrix
global current_state_matrix
global n
for i in range (n):
previous_state_matrix.append([])
current_state_matrix.append([])
for j in range (n):
previous_state_matrix[i].append(1)
current_state_matrix[i].append(1)
previous_state_matrix[n//2][n//2]=2
current_state_matrix[n//2][n//2]=2
def next_to_ill_cell(i,j):
for x in [i-1,i,i+1]:
for y in [j-1,j,j+1]:
if not((x==i and y==j) or x==-1 or y==-1 or x==n or y==n):
if previous_state_matrix[x][y]==ill:
return True
#Rules
def process_next_state ():
global previous_state_matrix
global current_state_matrix
previous_state_matrix = copy.deepcopy(current_state_matrix)
for i in range (n) :
for j in range (n) :
if previous_state_matrix[i][j]==untouched
if next_to_ill_cell(i,j)== True:
k=rd.random()#random
if k >=0.5:
current_state_matrix[i][j]=ill
else:
current_state_matrix[i][j]=untouched
if previous_state_matrix[i][j]==ill:
s=rd.random()
if s>= 0.02875:
current_state_matrix[i][j]=recovered
else:
current_state_matrix[i][j]=dead
init_graph()
init_matrix_array()
print(current_state_matrix)
for k in range (len(current_state_matrix)):
for l in range (len(current_state_matrix[1])):
if current_state_matrix[k][l]==2:
plt.imshow(current_state_matrix, cmap=cmap, vmin=0, vmax=3)
process_next_state()
plt.pause(1)
plt.imshow(current_state_matrix, cmap=cmap, vmin=0, vmax=3)
plt.show()
I'm sure that this code could be largely improved, but as I said, I'm a beginner. Now what I want to do is to add an annotation at the bottom of the plot to indicate the number of death and the number of recoveries. I also want to indicate at the top of the plot the number of days elapsed, which would correspond to the transition from one table of numbers to the next.
Could you please help me?