1 前言
最近每天早上起来第一件事,就是打开新闻软件看疫情相关的新闻。了解下自己和亲友所在城市的确诊人数,但纯数字还是缺乏一个直观的概念。那我们来做一个疫情地图吧。至于数据,从各大网站的实时疫情页面就可以拿到。
2. 数据下载
网上一搜,首先搜到的是新浪新闻的疫情实时追踪,那就用这个数据源吧。
可以轻松找到url地址、请求方法、参数、应答格式等信息
URL = "https://gwpre.sina.cn/interface/fymap2020_data.json?random=0.7906952201023671&_=1582869392726"
注:
callback字段已删除(经测试,去掉之后没有太大影响)
_字段为时间戳
查看数据格式:为json格式哦(真棒!)
数据格式很简单,查看省数据和下属城市的数据:(以河北省为例)
{
'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")
效果:
达到200现有确诊的省份一目了然。感兴趣的同学还可以制作市级别或者世界地图。
最后祝愿早日都变为蓝色吧。武汉加油,中国加油!