用 Python 制作实时现有确诊疫情图

1 前言

最近每天早上起来第一件事,就是打开新闻软件看疫情相关的新闻。了解下自己和亲友所在城市的确诊人数,但纯数字还是缺乏一个直观的概念。那我们来做一个疫情地图吧。至于数据,从各大网站的实时疫情页面就可以拿到。

2. 数据下载

网上一搜,首先搜到的是新浪新闻的疫情实时追踪,那就用这个数据源吧。

可以轻松找到 url 地址、请求方法、参数、应答格式等信息

用 Python 制作实时现有确诊疫情图用 Python 制作实时现有确诊疫情图​​

URL = "https://gwpre.sina.cn/interface/fymap2020_data.json?random=0.7906952201023671&_=1582869392726"

注:
callback 字段已删除(经测试,去掉之后没有太大影响)
_ 字段为时间戳

查看数据格式:为 json 格式哦(真棒!)

用 Python 制作实时现有确诊疫情图

数据格式很简单,查看省数据和下属城市的数据:(以河北省为例)

{
	'name': '河北',
	'ename': 'hebei',
	'value': '318',
	'conadd': '1',
	'hejian': '',
	'econNum': '38',
	'susNum': '0',
	'deathNum': '6',
	'cureNum': '274',
	'adddaily': {
		'conadd': '+1',
		'deathadd': '+0',
		'cureadd': '+13',
		'econadd': '-12',
		'conadd_n': 1,
		'deathadd_n': 0,
		'cureadd_n': 13
	},
	'city': [{
		'name': '石家庄',
		'conNum': '29',
		'conadd': '0',
		'hejian': '',
		'susNum': '0',
		'cureNum': '24',
		'deathNum': '0',
		'mapName': '石家庄市',
		'citycode': 'CN13010000000000'
	}, {
		'name': '廊坊',
		'conNum': '30',
		'conadd': '0',
		'hejian': '',
		'susNum': '0',
		'cureNum': '30',
		'deathNum': '0',
		'mapName': '廊坊市',
		'citycode': 'CN13100000000000'
	}, {
		'name': '沧州',
		'conNum': '48',
		'conadd': '0',
		'hejian': '',
		'susNum': '0',
		'cureNum': '39',
		'deathNum': '3',
		'mapName': '沧州市',
		'citycode': 'CN13090000000000'
	}, {
		'name': '邯郸',
		'conNum': '32',
		'conadd': '0',
		'hejian': '',
		'susNum': '0',
		'cureNum': '30',
		'deathNum': '0',
		'mapName': '邯郸市',
		'citycode': 'CN13040000000000'
	}, {
		'name': '保定',
		'conNum': '32',
		'conadd': '0',
		'hejian': '',
		'susNum': '0',
		'cureNum': '32',
		'deathNum': '0',
		'mapName': '保定市',
		'citycode': 'CN13060000000000'
	}, {
		'name': '邢台',
		'conNum': '23',
		'conadd': '0',
		'hejian': '',
		'susNum': '0',
		'cureNum': '22',
		'deathNum': '1',
		'mapName': '邢台市',
		'citycode': 'CN13050000000000'
	}, {
		'name': '衡水',
		'conNum': '8',
		'conadd': '0',
		'hejian': '',
		'susNum': '0',
		'cureNum': '8',
		'deathNum': '0',
		'mapName': '衡水市',
		'citycode': 'CN13110000000000'
	}, {
		'name': '承德',
		'conNum': '7',
		'conadd': '0',
		'hejian': '',
		'susNum': '0',
		'cureNum': '7',
		'deathNum': '0',
		'mapName': '承德市',
		'citycode': 'CN13080000000000'
	}, {
		'name': '唐山',
		'conNum': '58',
		'conadd': '0',
		'hejian': '',
		'susNum': '0',
		'cureNum': '40',
		'deathNum': '1',
		'mapName': '唐山市',
		'citycode': 'CN13020000000000'
	}, {
		'name': '张家口',
		'conNum': '41',
		'conadd': '1',
		'hejian': '',
		'susNum': '0',
		'cureNum': '33',
		'deathNum': '0',
		'mapName': '张家口市',
		'citycode': 'CN13070000000000'
	}, {
		'name': '秦皇岛',
		'conNum': '10',
		'conadd': '0',
		'hejian': '',
		'susNum': '0',
		'cureNum': '9',
		'deathNum': '1',
		'mapName': '秦皇岛市',
		'citycode': 'CN13030000000000'
	}]
}

3 安装 Python 包

国内大厂出的 echarts 自然会对国内地图有最好的支持。用 pip 安装 pyecharts,以及两个数据包 echarts-china-provinces-pypkg、echarts-china-cities-pypkg 即可

pip install pyecharts
pip install echarts-china-provinces-pypkg
pip install echarts-china-cities-pypkg

4 代码实现

遍历下 json 数据,把省名和确诊数存在 data 数据里传给 map 对象就好

注意 max 是决定渲染颜色的

import json
import requests
import time

from pyecharts.charts import Map
from pyecharts import options as opts

URL = "https://gwpre.sina.cn/interface/fymap2020_data.json?random=0.7906952201023671&_=%s" % int(time.time() * 1000)

# 获取网页响应
resp = requests.get(URL)
# 解析网页响应内容(Unicode编码)
content = resp.content.decode("unicode_escape")
# 将网页内容改为 json 格式
con_json = json.loads(content)
# 获取省份列表
province_list = con_json["data"]["list"]
data = []
for province in province_list:
    # 修改 econNum , 显示不同的数据
    data.append((province['name'], province['econNum']))

# 实例化
map_p = Map()
map_p.set_global_opts(title_opts=opts.TitleOpts(title=con_json["data"]["times"] + "疫情图"), visualmap_opts=opts.VisualMapOpts(max_=200))
map_p.add("现有确诊", data, maptype="china")
# 生成html文件
map_p.render("ncov.html")

效果:

用 Python 制作实时现有确诊疫情图

达到 200 现有确诊的省份一目了然。感兴趣的同学还可以制作市级别或者世界地图。

最后祝愿早日都变为蓝色吧。武汉加油,中国加油!