今天分享课程中的一节内容,用 python 绘制一个疫情地图。
图表的数据来自于百度的疫情实时大数据报告,通过用爬虫的方法爬取到从疫情开始到最新一天的数据,数据爬取回来保存到一个 json 文件中,作为上课的素材。
最终实现的效果如下:
现有确诊效果图
累计确诊效果图
主要代码:
爬取数据保存到 疫情数据.json 文件中(1.10之前爬取的,url 可能会变化,错误可以自己去网上查找其它网站提供的API)
import requests
import json
import re
url = "https://voice.baidu.com/newpneumonia/get?target=trend&isCaseIn=0&stage=publish&callback=jsonp_1606089952492_47078"
response = requests.get(url)
data = json.loads(re.match(".*?({.*}).*",response.text)[1])
with open("疫情数据.json","w",encoding="utf-8") as f:
json.dump(data["data"], f)
利用爬取的数据绘制疫情地图代码
from pyecharts import Map
import webbrowser
import os
import json
with open("疫情数据.json", "r", encoding="utf-8") as f:
data = json.load(f)
print(len(data))
provice_diagnose_data = []
now_provice_diagnose_data = []
for province in data:
province_name = province["name"]
date = province["trend"]["updateDate"]
# 确诊
diagnose_name = province["trend"]["list"][0]["name"]
diagnose_data = province["trend"]["list"][0]["data"]
# 治愈
cure_name = province["trend"]["list"][1]["name"]
cure_data = province["trend"]["list"][1]["data"]
# 死亡
died_name = province["trend"]["list"][2]["name"]
died_data = province["trend"]["list"][2]["data"]
# 新增
add_name = province["trend"]["list"][3]["name"]
add_data = province["trend"]["list"][3]["data"]
# 累计确诊
provice_diagnose_data.append((province_name, diagnose_data[-1]))
# 现有确诊
now_provice_diagnose_data.append((province_name, (diagnose_data[-1]-cure_data[-1]-died_data[-1])))
attr, value = Map.cast(provice_diagnose_data)
attr2, value2 = Map.cast(now_provice_diagnose_data)
map = Map("疫情地图", width=800, height=600)
map.add(
"累计确诊",
attr, value,
maptype="china",
is_label_show = True,
is_visualmap=True,
is_map_symbol_show=False,
is_piecewise = True,
visual_split_number=3,
pieces =[
{"min":0, "max": 0,"color":"Gainsboro"},
{"min": 1, "max": 9,"color":"PeachPuff"},
{"min": 10, "max": 99,"color":"Salmon"},
{"min": 100, "max": 999,"color":"IndianRed"},
{"min": 1000, "max": 9999,"color":"Red"},
{"min": 10000,"color":"DarkRed"},
]
)
map.add(
"现有确诊",
attr2, value2,
maptype="china",
is_label_show = True,
is_visualmap=True,
is_map_symbol_show=False,
is_piecewise = True,
visual_split_number=3,
pieces =[
{"min":0, "max": 0,"color":"Gainsboro"},
{"min": 1, "max": 9,"color":"PeachPuff"},
{"min": 10, "max": 99,"color":"Salmon"},
{"min": 100, "max": 999,"color":"IndianRed"},
{"min": 1000, "max": 9999,"color":"Red"},
{"min": 10000,"color":"DarkRed"},
]
)
map.render()
webbrowser.open("file://"+os.path.realpath("render.html"))
(全文完)