用Python绘制全球疫情变化地图
目前全球疫情仍然比较严重,为了能清晰地看到疫情爆发以来至现在全球疫情的变化趋势,我绘制了一张疫情变化地图,完整代码共 230 行,需要的朋友在公众号回复关键字 疫情地图 即可。 废话不多说,先上图
下面就来重点介绍下上面这张图的绘制过程,主要分为以下三个步骤:
数据收集
数据处理
画图
下面一个一个来说。
数据收集
这是万里长城的第一步,俗话说“巧妇难为无米之炊”,既然是变化图,当然需要每个国家、每天的现有确诊病例数。好在现在各大网站都有疫情相关的专题页,我们可以直接抓数据。以网易为例
我们选择 XHR,重新刷新下网页可以看到有几个接口,其中 list-total 接口是获取当前所有有疫情的国家,以及对应的国家id。另外,我们看到还有一个 list-by-area-code 接口,它是获取每个国家历史上每天的疫情数据,请求这个接口需要带 areaCode 参数,这个参数就是我们刚刚说的国家id。所以对我们来说这两个接口是最重要的。下面我们就看看请求 list-total 接口的代码
def get_and_save_all_countries():
"""
获取所有的国家名以及对应的id,保存为文件
""" url = 'https://c.m.163.com/ug/api/wuhan/app/data/list-total?t=317452696323'
list_total_req = requests.get(url, headers=headers)
if list_total_req.status_code == 200:
area_tree = list_total_req.json()['data']['areaTree'] area_dict = {}
for area in area_tree:
country_id = area['id']
name = area['name']
area_dict[country_id] = name area_json = json.dumps(area_dict, ensure_ascii=False) # ensure_ascii=False 防止json编码后中文编程\u开头的字符
write_file('./config/countries_id2name.json', area_json)
这里将请求下来的数据临时存放在文件里。有了所有的疫情国家的id,我们就可以请求 list-by-area-code 接口来获取每个国家的疫情数据了。代码与上面的类似,不同的是将请求结果存在了 mongodb 而不是文件,目的是为了方便增删改查。当然为了大家方便使用,我将mongodb中的数据导入了文件 counties_daily.json 中,大家可以在源码根目录找到它。
数据处理
这一步的处理主要是为第三步画图做准备的。因为我们画图用的是pyecharts框架,它绘制世界地图需要输入的国家名是英文的,而我们收集的国家名是中文的,所以要将中文国家名对应到英文国家名。最终的效果如下
网上能找到这样的对应关系,但想要用起来还需要解决两个问题。第一,两边中文名统一,比如:我们收集的国家名是中非共和国,而对应关系里是中非,那还是对应不上。第二,需要自己增加映射关系,网上找的一般都不全,我们需要根据收集的数据自行增加。经过上面两个步骤处理后,我们就可以将大部分国家名对应到pyechars能识别的英文名了。相关代码如下
def get_cy_properties():
# 获取配置文件信息
countries_id2name = read_file('./config/countries_id2name.json')
cy_id2name_dict = json.loads(countries_id2name)
cy_ch2en = {v: k for k, v in countries_dict.items()} # 调整国家的名字与配置文件一致
cy_id2name_dict[''] = '波斯尼亚和黑塞哥维那'
cy_id2name_dict[''] = '多哥'
cy_id2name_dict[''] = '刚果民主共和国'
cy_id2name_dict[''] = '刚果'
cy_id2name_dict[''] = '中非'
cy_id2name_dict[''] = '多米尼加' cy_props = {}
for key in cy_id2name_dict:
cy_name = cy_id2name_dict[key]
if cy_name in cy_ch2en:
cy_props[cy_name] = {}
cy_props[cy_name]['id'] = key
cy_props[cy_name]['en_name'] = cy_ch2en[cy_name] return cy_props
画图
这一步涉及到两个核心过程——构造数据结构和画图。首先,我构造了3个数据结构,分别是date_list、cy_name_list 和 ncov_data。date_list存放的是日期列表,因为我们画动图,所以需要一段时间;cy_name_list 存放收集的所有国家列表(英文名);ncov_data是一个字典,key是日期,value是数组,存放各个国家当天的确诊病例数。生成这三个数据结构的代码如下
def parse_ncov_data(start_date, end_date, records):
if not records:
return date_list = get_date_range(start_date, end_date)
cy_name_list = []
res = {}
# 获取各国每天现有确认病例
for i, record in enumerate(records):
cy_name = record['cy_en_name']
cy_name_list.append(cy_name) # 解析每天数据并计算现有确认病例
existing_case_dict = {}
for ncov_daily in record['data']['list']:
date_str = ncov_daily['date']
confirm = ncov_daily['total']['confirm'] # 累计确诊
heal = ncov_daily['total']['heal'] # 累计确诊
dead = ncov_daily['total']['dead'] # 累计死亡 existing_case = confirm - heal - dead
existing_case_dict[date_str] = existing_case last_existing_case = 0
# 将每天确诊病例数合并到res中
for date_str in date_list:
if date_str not in res: # 初始化
res[date_str] = [] existing_case = existing_case_dict.get(date_str)
if existing_case is None:
existing_case = last_existing_case
res[date_str].append(existing_case) last_existing_case = existing_case return date_list, cy_name_list, res
参数 records 是一个数组,数组每个元素代表一个国家,内容便是我们在第一步请求 list-by-area-code 接口的数据。最后,用 pyecharts 来画图,直接上代码
def render_map(date_list, cy_name_list, ncov_data):
tl = Timeline() # 创建时间线轮播多图,可以让图形按照输入的时间动起来
# is_auto_play:自动播放
# play_interval:播放时间间隔,单位:毫秒
# is_loop_play:是否循环播放
tl.add_schema(is_auto_play=True, play_interval=50, is_loop_play=False) for date_str in date_list: # 遍历时间列表
map0 = (
Map() # 创建地图图表
# 将国家名 cy_name_list 以及各国当天确诊病例 ncov_data[date_str] 加入地图中
.add("全球疫情趋势", [list(z) for z in zip(cy_name_list, ncov_data[date_str])],
"world", is_map_symbol_show=False)
.set_series_opts(label_opts=opts.LabelOpts(is_show=False)) # 不显示国家名
.set_global_opts(
title_opts=opts.TitleOpts(title="%s日" % date_str), # 图表标题
visualmap_opts=opts.VisualMapOpts(max_=80), # 当确诊病例大于80 ,地图颜色是红色
)
)
tl.add(map0, "%s" % date_str) # 将当天的地图状态加入时间线中 tl.render() # 生成最终轮播多图,会在当前目录创建 render.html 文件
代码里加了注释,这里就不再赘述了。
运行 render_map 函数会在当前目录生成 render.html 文件,打开后便自动播放疫情变化趋势,如文章开头 gif。另外,有些朋友可能会问,能不能直接输出 gif。这一点我也尝试过,百度、谷歌、GitHub上的教程基本上都试了一遍,比较遗憾没有找到靠谱的方法。所以劝大家还是放弃这条路,曲线救国,录制一个视频转成 gif 即可,方便快捷。毕竟人生苦短,Python 为我们节省下的时间不能再被这些无谓的坑再填回去。这样整个过程就介绍完了,虽然思路不复杂,但局部细节上还是需要花一些时间处理的。完整代码共 230 行,需要的朋友在公众号回复关键字 疫情地图 即可。
最近国内某些地方出现了反弹的迹象,希望大家无论是在工作还是生活上都能继续保持警惕。希望这次疫情早点过去,等待全球地图变白的那一天。
欢迎公众号「渡码」,输出别地儿看不到的干货。
用Python绘制全球疫情变化地图的更多相关文章
- Python 绘制全球疫情地图
国内疫情得到控制后,我就没怎么再关心过疫情,最近看到一条新闻,全球疫情累计确诊人数已经突破 500w 大关,看到这个数字我还是有点吃惊的. 思来想去,还是写一篇全球疫情的分析的文章,本文包括网络爬虫. ...
- 【疫情动态条形图】用Python开发全球疫情排名动态条形图bar_chart_race
一.开发背景 你好,我是 @马哥python说 ,这是我用Python开发的全球疫情动态条形图,演示效果: https://www.zhihu.com/zvideo/15603276220259696 ...
- Python 绘制2016世界GDP地图
2016世界GDP地图 从https://datahub.io/core/gdp#data下载得到json文件. # country_code.py 获取国家二字代码 # 从pygal.maps.wo ...
- 如何用 Python 绘制玫瑰图等常见疫情图
新冠疫情已经持续好几个月了,目前,我国疫情已经基本控制住了,而欧美国家正处于爆发期,我们会看到很多网站都提供了多种疫情统计图,今天我们使用 Python 的 pyecharts 框架来绘制一些比较常见 ...
- 用python画出全球疫情趋势变化图
前言 文的文字及图片来源于网络,仅供学习.交流使用,不具有任何商业用途,版权归原作者所有,如有问题请及时联系我们以作处理. 作者:谦睿科技 PS:如有需要Python学习资料的小伙伴可以加点击下方链接 ...
- python绘制疫情图
python中进行图表绘制的库主要有两个:matplotlib 和 pyecharts, 相比较而言: matplotlib中提供了BaseMap可以用于地图的绘制,但是个人觉得其绘制的地图不太美观, ...
- 不仅仅是Google,您必须知道的全球十大地图API
不仅仅是Google,您必须知道的全球十大地图API 一.总结 一句话总结:除了google,也有其它很多很好的地图,必应地图(Bing Maps),OpenLayers 二.不仅仅是Google,您 ...
- 全球疫情统计APP图表形式展示
全球疫情统计APP图表展示: 将该任务分解成三部分来逐个实现: ①爬取全球的疫情数据存储到云服务器的MySQL上 ②在web项目里添加一个servlet,通过参数的传递得到对应的json数据 ③设计A ...
- 全球疫情爬取APP版
全球疫情统计APP图表展示: 将该任务分解成三部分来逐个实现: ①爬取全球的疫情数据存储到云服务器的MySQL上 ②在web项目里添加一个servlet,通过参数的传递得到对应的json数据 ③设计A ...
随机推荐
- wpf xaml CS0426 错误原因
wpf 程序集中 类命名空间名称和类名不能相同,否则在 xaml生成 i.g.cs时,会导致 自动生成代码无法推到处是类型还是命名空间的问题. 触发这个错误的条件是类命名空间 与 类名相同 并 ...
- [BJDCTF 2nd]old-hack
进入首页: 首页告诉了我们是thinkphp5的漏洞. 知道了是哪个版本的话就搜一搜喽:最后发现是thinkphp5.0.23的命令执行 payload_1:查看根目录文件,发现flag位置 http ...
- 推荐一款优秀的web自动化测工具
在业务使用的自动化测试工具很多.有开源的,有商业化的,各有各得特色,各有各得优点!下面我就介绍几个我用过的一款非常优秀的国产自动化测试工具.在现有的自动化软件当中,都是以元素的name.id.xpat ...
- Python+Selenium+Unittest编写超链接点击测试用例
测试功能:博客园首页网站分类的一级菜单链接和二级菜单链接的点击. 遇到的问题: 1.循环点击二级菜单时,点击了一个一级菜单下的第一个二级菜单后,页面会刷新,再定位同一个一级菜单次下的第二个二级菜单时, ...
- 99%的程序员都在用Lombok,原理竟然这么简单?我也手撸了一个!|建议收藏!!!
罗曼罗兰说过:世界上只有一种英雄主义,就是看清生活的真相之后依然热爱生活. 对于 Lombok 我相信大部分人都不陌生,但对于它的实现原理以及缺点却鲜为人知,而本文将会从 Lombok 的原理出发,手 ...
- 五、运算符的补充与if语句
1.可变不可变类型 指:对前面所学类型做一个可变和不可变类型的分类 可变类型:值改变,ID不变,证明改的是原值,原值是可以被改变的 不可变类型:值改变,ID也变了,证明是产生新的值,压根没有改变原值, ...
- 实例演示:如何简化生产中的Pod安全策略?
Pod安全策略对于强化K8S集群安全至关重要.本文将延续之前的文章继续深入介绍Pod安全策略. 首先,简单介绍了如何将Pod与Pod安全策略相关联,并使用RBAC来展示具体步骤.然后介绍如何在Ranc ...
- Python第五章-内置数据结构03-元组
Python 内置的数据结构 三.元组(tuple) python 作为一个发展中的语言,也提供了其他的一些数据类型. tuple也是 python 中一个标准的序列类型. 他的一些操作和str和li ...
- 近期 github 机器学习热门项目top5
磐创智能-专注机器学习深度学习的教程网站 http://panchuang.net/ 磐创AI-智能客服,聊天机器人,推荐系统 http://panchuangai.com/ [导读]:Github是 ...
- 3分钟学会简单使用Vim
Vim是一款运行在命令行里的文字编辑器,它是Linux人员的标配.在Windows环境下也可以有特别的用处,比如创建没有文件名的文件(.gitignore). Vim的功能十分强大,以至于有一些人对它 ...