【python】小学生都能学会!用python可视化模拟新冠疫情发展
【python】利用turtle库可视化模拟新冠疫情
关键词: python入门实践 少年编程教育 turtle 类与对象 新冠肺炎模拟
程序运行展示
随着模拟程序的运行,图中的点会逐渐由绿色变红,最终图中的点全部变为灰色,并不再移动。
点的颜色不同分别代表个体处于不同的健康状态:绿色为健康,黄色为潜伏期,红色为感染,而灰色则代表死亡。
计算机以绝对理性且冰冷的态度追随代码的运行让一个个点在无序运动逐渐变化颜色,但这却是2020年新冠肺炎爆发以来无数条因此丧生的鲜活生命。
愿疫情早日结束!
代码讲解
基础版:模拟新冠疫情爆发早期,新冠病毒刚开始出现
- 面向对象:设计人的类应有的方法和属性
-
属性:
健康状态
status
,分为健康
和患病
- 此时人们没有在意健康问题,都不戴口罩
- 方法
__init__
:定义对象的属性 move
:人的随机运动infect
:健康人与患者距离小于50,则有50%的概率感染- 画布尺寸:设置人员位置,活动范围
- 实现病毒的传播,即新冠肺炎可以由患者传染给健康的人
类的相关代码
如果对该程序兴趣,可以关注公众号【禅与电脑维修艺术】回复关键词【turtle】获得完整源码
# 相关类库的导入 import math import random import turtle import time import datetime # 有关参数的定义 TOTAL_W = 500 #模拟场地总宽度 TOTAL_H = 400 #模拟场地总高度 DANGER_DIS = 50 #传染距离 RATE = 0.5 #传染率 class person(object): def __init__(self,status): self.turt = turtle.Turtle() self.turt.shape('circle') # 健康状态,1 为确诊 0 为健康 self.status = status if self.status == 1: self.turt.color("red") else: self.turt.color("green") #随机定义该点的位置 self.x = random.randint(-TOTAL_W*0.9,TOTAL_W*0.9) self.y = random.randint(-TOTAL_H*0.9,TOTAL_H*0.9) self.turt.penup() self.turt.goto(self.x,self.y) def move(self): dx = random.randint(-2, 2) dy = random.randint(-2, 2) if - TOTAL_W*0.9 < self.x + dx < TOTAL_W*0.9: self.x+=dx else: self.x-=dx if - TOTAL_W*0.9 < self.y + dy < TOTAL_W*0.9: self.y+=dx else: self.y-=dy #如果他们超出了边界就会往回走 self.turt.penup() self.turt.goto(self.x, self.y) def infect(self,rate): x = random.randrange(0,100) # 根据传入的感染率的参数 if x/100 < rate: self.status = 1 #此人被感染 self.turt.color('red') def reset(self): self.turt.penup() self.turt.setpos(self.pos)
运行截图
基础版:绿色代表健康个体,红色为患病个体
进阶版:模拟新冠疫情爆发初期,民众防疫意识加强,开始佩戴口罩
-
面向对象:为人的类
person
添加新的方法和属性属性:
类属性
total_num
:实验总人数 -
类属性
infected_num
:感染人数 -
实例属性
status
,表示该对象的健康状态,分为健康
和患病
-
实例属性
mask
,表示该个体是否佩戴口罩,分为佩戴口罩
和不佩戴口罩
此时人们开始关注新冠疫情,部分人开始佩戴口罩。
佩戴口罩可以有效降低感染率(以下数据为主观猜测,未经验证和校对)
具体情况如下:患者是否佩戴口罩 健康人是否佩戴口罩 健康人的感染率 佩戴 佩戴 1 % 佩戴 不佩戴 15 % 不佩戴 佩戴 30 % 不佩戴 不佩戴 80 % -
方法
__init__
:定义对象的属性 move
:人的随机运动infect
:健康人与患者距离小于50,则有根据他们是否佩戴口罩,有不同的概率感染-
turtle标题可以显示当前天数和感染人数
-
引入天数的概念
类的相关代码
如果对该程序兴趣,可以关注公众号【禅与电脑维修艺术】回复关键词【turtle】获得完整源码
# 相关类库的导入 import math import random import turtle import time import datetime # 有关参数的定义 TOTAL_W = 500 #模拟场地总宽度 TOTAL_H = 400 #模拟场地总高度 DANGER_DIS = 50 #传染距离 class person(object): #类属性 infected_num = 0 total_num = 0 def __init__(self,status,mask): person.total_num += 1 self.turt = turtle.Turtle() # 是否带口罩,1圆形 为戴口罩/0方形 为不戴口罩, self.mask = mask if self.mask == 1: self.turt.shape('circle') elif self.mask == 0: self.turt.shape('square') # 健康状态,1 为确诊/0 为健康 self.status = status if self.status == 1: self.turt.color("red") self.infected_day = 0 person.infected_num += 1 else: self.turt.color("green") #随机定义该点的位置 self.x = random.randint(-TOTAL_W*0.9,TOTAL_W*0.9) self.y = random.randint(-TOTAL_H*0.9,TOTAL_H*0.9) self.turt.penup() self.turt.goto(self.x,self.y) def move(self): dx = random.randint(-2, 2) dy = random.randint(-2, 2) if - TOTAL_W*0.9 < self.x + dx < TOTAL_W*0.9: self.x+=dx else: self.x-=dx if - TOTAL_W*0.9 < self.y + dy < TOTAL_W*0.9: self.y+=dx else: self.y-=dy #如果他们超出了边界就会往回走 self.turt.penup() self.turt.goto(self.x, self.y) def infect(self,rate): x = random.randrange(0,100) if x/100 < rate: self.status = 1 #此人被感染 self.infected_day = 0 #有了感染天数,且变为0 self.turt.color('red') person.infected_num+=1 #感染人数+1 def day(self): if self.status == 1: self.infected_day += 1
光理论是不够的,在此送大家一套2020最新Python全栈项目视频教程,点击此处 免费获取,希望大家一起进步哦!
运行截图
进阶版:方块为未佩戴口罩的个体,红色为佩戴口罩的个体
窗口标题显示
当前天数,
感染人数,
总人数
高阶版:模拟新冠疫情爆发中期,人们逐渐了解肺炎的相关性质(潜伏、死亡等)
-
面向对象:引入潜伏期和患病天数的概念,引入死亡的概念
属性:
类属性
total_num
:实验总人数 -
类属性
infected_num
:感染人数 -
实例属性
status
,表示该对象的健康状态,分为健康
、潜伏
、确诊
-
实例属性
infected_day
,表示患病天数,当患病天数大于4天后有一定概率由潜伏转变为确诊,大于7天有一定概率死亡 -
实例属性
mask
,表示该个体是否佩戴口罩,分为佩戴口罩
和不佩戴口罩
此时人们开始关注新冠疫情,部分人开始佩戴口罩。
佩戴口罩可以有效降低感染率(以下数据为主观猜测,未经查证)
具体情况如下:患者是否佩戴口罩 健康人是否佩戴口罩 健康人的感染率 佩戴 佩戴 1 % 佩戴 不佩戴 15 % 不佩戴 佩戴 30 % 不佩戴 不佩戴 80 % -
方法
__init__
:定义对象的属性 move
:人的随机运动,但是健康患者不会到隔离区,确诊患者只会在隔离区infect
:健康人与患者距离小于50,则有根据他们是否佩戴口罩,有不同的概率感染day
:如果这个人已患病,则调用这个函数其患病天数+1,当患病天数大于最短潜伏期后,一定概率转为确诊,大于最短死亡期后,一定概率死亡-
turtle标题可以显示当前天数、感染人数、死亡人数、总人数
类的相关代码
如果对该程序兴趣,可以关注公众号【禅与电脑维修艺术】回复关键词【turtle】获得完整源码
# 相关类库的导入 import math import random import turtle import time import datetime class person(object): #类属性 infected_num = 0 total_num = 0 dead_num = 0 def __init__(self,status,mask): person.total_num += 1 self.turt = turtle.Turtle() # 是否带口罩,1为戴口罩 圆形/0为不戴口罩 方形 self.mask = mask if self.mask == 1: self.turt.shape('circle') elif self.mask == 0: self.turt.shape('square') # 健康状态,2 为确诊 红色/1 为潜伏 黄色/0 为健康 绿色 self.status = status if self.status == 2: self.infected_day = 0 person.infected_num += 1 self.turt.color("red") elif self.status == 1: self.infected_day = 0 person.infected_num += 1 self.turt.color("yellow") else: self.turt.color("green") #随机定义该点的位置 self.x = random.randint(-TOTAL_W*0.9,TOTAL_W*0.9) self.y = random.randint(-TOTAL_H*0.9,TOTAL_H*0.9) self.turt.penup() self.turt.goto(self.x,self.y) def move(self): dx = random.randint(-2, 2) dy = random.randint(-2, 2) if - TOTAL_W*0.9 < self.x + dx < TOTAL_W*0.9: self.x+=dx else: self.x-=dx if - TOTAL_W*0.9 < self.y + dy < TOTAL_W*0.9: self.y+=dx else: self.y-=dy #如果他们超出了边界就会往回走 self.turt.penup() self.turt.goto(self.x, self.y) def infect(self,rate): x = random.randrange(0,100) if x/100 < rate: self.status = 1 #此人的状态进入潜伏期 self.infected_day = 0 #有了感染天数,且变为0 self.turt.color('yellow') person.infected_num+=1 def day(self): if self.status > 0: if self.infected_day >= 7: x = random.randrange(0,100) if x/100 < DEATH_Rate: #死亡率为5% #确定死亡时返回某个值 return -1 if self.status == 1: self.infected_day += 1 if self.infected_day >= 4: x = random.randrange(0,100) if x/100 < Diagnose_Rate: self.status = 2 self.turt.color('red') return 0 def dead(self): # 死亡以后颜色变为灰色 self.turt.color('gray') person.total_num -= 1 person.dead_num += 1 if self.status>0: person.infected_num -= 1 def __del__(self): person.total_num -= 1 if self.status>0: person.infected_num -= 1
运行截图:
高阶版:黄色为潜伏期个体,灰色为死亡个体,不会再移动
窗口标题显示
当前天数,
感染人数,
总人数
思路启发:
- 治愈功能
- 免疫功能
- 隔离功能
- 新冠肺炎和年龄相关,是否加入年龄的属性
- 是否加入性别
注意问题:
- python的turtle库进行模拟,因为极其耗费CPU,计算量太多了,有些功能不好实现,看下面的例子
【已经失败】最终版:模拟新冠疫情爆发后期,政府开始组织治疗、隔离
-
面向对象:引入隔离状态和免疫
属性:
类属性
total_num
:实验总人数 -
类属性
infected_num
:感染人数 -
类属性
dead_num
:死亡人数 -
类属性
isolated_num
:隔离人数 -
实例属性
status
,表示该对象的健康状态,分为健康
、潜伏
、确诊
、免疫
认为
康复
的人具备对新冠肺炎的抵抗力(仅为主观猜测,未查找相关资料求证) -
实例属性
infected_day
,表示患病天数,当患病天数大于4天后有一定概率由潜伏转变为确诊,大于7天有一定概率死亡 -
实例属性
isolated
,表示该对象是否被隔离,一旦确诊立刻送往隔离 -
实例属性
mask
,表示该个体是否佩戴口罩,分为佩戴口罩
和不佩戴口罩
此时人们开始关注新冠疫情,部分人开始佩戴口罩。
佩戴口罩可以有效降低感染率(以下数据为主观猜测,未经验证和校对)
具体情况如下:患者是否佩戴口罩 健康人是否佩戴口罩 健康人的感染率 佩戴 佩戴 1 % 佩戴 不佩戴 15 % 不佩戴 佩戴 30 % 不佩戴 不佩戴 80 % -
方法
__init__
:定义对象的属性,但是起始状态健康的人不会出现在隔离区 move
:人的随机运动,但是健康患者不会到隔离区,确诊患者只会在隔离区内infect
:健康人与患者距离小于50,则有根据他们是否佩戴口罩,有不同的概率感染day
:如果这个人已患病,则调用这个函数其患病天数+1,当患病天数大于最短潜伏期后,一定概率(诊断率)转为确诊,大于最短死亡期后,一定概率(死亡率)死亡isolated
:如果此人确诊,则立即送往隔离区域heal
:对隔离区患者进行治疗,如果治疗成功则变为免疫
状态-
分配隔离区域为左上区域
-
编程失败,隔离功能没法写,CPU效率不够,会直接卡死
光理论是不够的,在此送大家一套2020最新Python全栈项目视频教程,点击此处 免费获取,希望大家一起进步哦!
如有帮助,欢迎点赞/转载~
(听说给文章点赞的人代码bug特别少👀)
联系邮箱:mrjingcheng@foxmail.com
个人公众号:禅与电脑维修艺术
有问题欢迎通过邮箱交流。
- Python实现新冠肺炎疫情数据采集与分析可视化【一篇迟到的文章,武汉加油,中国加油,神州大地终会迎来春暖花开的日子】
- 【Python-3.5】Pygal模拟骰子点数,分析结果可视化
- 小学生都能学会的python(运算符 和 while循环)
- 小学生都能学会的python(字典{ })
- Python 写了个新型冠状病毒疫情传播模拟程序
- 小学生都能学会的python(<lamda匿名函数,sorted(),filter(),map(),递归函数>)
- 如何利用Python将疫情数据制作成折线变化图,继上篇“关于新型冠状病毒肺炎疫情追踪的可视化数据的采集、处理”的补充
- python模拟疫情扩散
- python——pyecharts库geo函数/map函数实现【安徽省肺炎疫情等级分布】地图数据的可视化
- 新冠肺炎疫情可视化报表自动发布实战技巧
- 全国多地新冠病例0增长,教你用Python画出当下疫情最火玫瑰图! - 知乎
- 如何用JMP让新冠肺炎疫情的可视化清晰地共享可见
- 用 Python可视化神器 Plotly 动态演示全球疫情变化趋势
- 小学生都能学会的python(小数据池)
- 全国多地新冠病例0增长,教你用Python画出当下疫情最火玫瑰图! - 知乎
- Python量子力学计算模拟以及数据可视化
- 小学生都能学会的python(深浅拷贝)
- 小学生都能学会的Python基础语法——代码规范&判断语句&循环语句
- 用Python在地图上模拟疫情扩散
- 小学生都能学会的python(文件操作)