疫情地圖制作
1.獲取相關數據 (網易, 新浪提供的接口並進行分析)
YQ/jsondata.py
# 封裝 json 數據類 返回所有需要的數據
# 新浪數據接口
# https://interface.sina.cn/news/wap/fymap2020_data.d.json
# "https://c.m.163.com/ug/api/wuhan/app/data/list-total"
# 由於新浪數據不全 所以用網易補全。
import json
import requests
from django.core.cache import caches
class JsonData:
# 獲取新浪api json 數據
def get_sina_data(self):
url = "https://interface.sina.cn/news/wap/fymap2020_data.d.json"
response = requests.request('get', url=url)
json_data = json.loads(response.text)
# with open('json.txt', 'r+') as f:
# json_text = f.read()
# json_data = json.loads(json_text)
# print(json_data, type(json_data))
return json_data['data']
# 獲取163中的數據
def get_163_data(self):
url = "https://c.m.163.com/ug/api/wuhan/app/data/list-total"
header = {
"User-Agent": "Mozilla/5.0 (Windows; U; Windows NT 6.1; en-us) AppleWebKit/534.50 (KHTML, like Gecko) Version/5.1 Safari/534.50"
}
response = requests.request('get', url=url, headers=header)
json_data = json.loads(response.text)
return json_data['data']
# 獲取地方名和累計人數
def get_old_number(self):
"""
:return: 各地區的 [名字和人數] 列表
"""
province_data = []
json_data = self.get_sina_data()['list']
for one_data in json_data:
# 獲取各地區名稱和感染人數
province_data.append([
one_data['name'],
one_data['value']
])
return province_data
# 獲取當前新冠肺炎感染人數
def get_now_number(self):
province_data = []
json_data = self.get_sina_data()['list']
for one_data in json_data:
# 獲取各地區名稱和當前感染人數
province_data.append([
one_data['name'],
one_data['econNum']
])
return province_data
# 歷史數據 從 1.11 截止到2020年12月14日
def get_history_list(self):
json_data_history = self.get_163_data()["chinaDayList"]
date_x = []
people_number_y = []
people_cure_y = []
people_death_y = []
people_death_rate = []
for data in json_data_history:
date_x.append(data['date'])
people_number_y.append(data['total']['confirm'])
people_cure_y.append(data['total']['heal'])
people_death_y.append(data['total']['dead'])
people_death_rate.append(data['total']['dead'] / data['total']['confirm'])
# print(date_x)
return date_x, people_number_y, people_cure_y, people_death_y, people_death_rate
jsondata = JsonData()
province_data_sum = jsondata.get_old_number() # 各個地區累計人數
province_data_now = jsondata.get_now_number() # 各個地區當前人數
province_data_tuple = jsondata.get_history_list()
2.繪制圖表
YQ/draw_picture.py
from pyecharts import options as opts
from pyecharts.charts import Map, Page, Tab
from pyecharts.faker import Faker
from pyecharts.components import Table
from pyecharts.charts import Line, Bar, Grid
from pyecharts.globals import ThemeType
from datetime import date
from json_data import province_data_sum, province_data_now
from snapshot_selenium import snapshot
from pyecharts.render import make_snapshot
from json_data import province_data_tuple
from pyecharts.charts import MapGlobe
from pyecharts.faker import POPULATION
from json_data import country_data
import pyecharts.render.templates
# 生成全國疫情確診人數累計地圖
def get_map_old_data() -> map:
# print(province_data_sum)
update_date = date.today()
map = (
Map(init_opts=opts.InitOpts(theme=ThemeType.WHITE, width='100%', height='900px'))
.add("各地累計確診人數", province_data_sum, "china", is_map_symbol_show=False)
.set_global_opts(
title_opts=opts.TitleOpts(
title="新冠狀病毒全國疫情地圖統計",
subtitle="更新日期:{}".format(update_date),
),
# 視覺映射配置項
visualmap_opts=opts.VisualMapOpts(
is_show=True, # 是否顯示
min_=0, # 左下角刻度最小值
max_=2000,
range_color=['#FFFFFF', '#F78181', '#FE2E2E', '#FF0000', '#B40404'], # 顏色過濾配置
),
toolbox_opts=opts.ToolboxOpts(
is_show=True,
feature=opts.ToolBoxFeatureOpts(
save_as_image=opts.ToolBoxFeatureSaveAsImageOpts(
type_='png',
name="YQMap",
background_color='#FFFFFF',
is_show=True,
title="保存為圖片",
),
restore=opts.ToolBoxFeatureRestoreOpts(
is_show=False
),
data_view=opts.ToolBoxFeatureDataViewOpts(
is_show=False
),
data_zoom=opts.ToolBoxFeatureDataZoomOpts(
is_show=False
),
brush=opts.ToolBoxFeatureBrushOpts(
type_="clear"
)
)
),
) # .render('img/全國疫情可視化map.html')
)
# make_snapshot(snapshot, map.render(), 'img/全國疫情可視化map.gif')
return map
# 生成全國疫情當前確診人數地圖
def get_map_now_data() -> map:
update_date = date.today()
map = (
Map(init_opts=opts.InitOpts(theme=ThemeType.WHITE, width='100%', height='900px'))
.add("各地現確診人數", province_data_now, "china", is_map_symbol_show=False, is_roam=False)
.set_global_opts(
title_opts=opts.TitleOpts(
title="全國疫情現狀地圖",
subtitle="更新日期:{}".format(update_date),
),
# 視覺映射配置項
visualmap_opts=opts.VisualMapOpts(
is_show=True, # 是否顯示
min_=0, # 左下角刻度最小值
max_=150,
range_color=['#FFFFFF', '#F78181', '#FE2E2E', '#FF0000', '#B40404'] # 顏色過濾配置
),
toolbox_opts=opts.ToolboxOpts(
is_show=True,
feature=opts.ToolBoxFeatureOpts(
save_as_image=opts.ToolBoxFeatureSaveAsImageOpts(
type_='png',
name="YQMap",
background_color='#FFFFFF',
is_show=True,
title="保存為圖片",
),
restore=opts.ToolBoxFeatureRestoreOpts(
is_show=False
),
data_view=opts.ToolBoxFeatureDataViewOpts(
is_show=False
),
data_zoom=opts.ToolBoxFeatureDataZoomOpts(
is_show=False
),
brush=opts.ToolBoxFeatureBrushOpts(
type_="clear"
)
)
),
)
)
# make_snapshot(snapshot, map.render(), 'img/全國疫情可視化map1.gif')
return map
# 生成折線統計圖
def get_line_pic() -> Line:
c = (
Line(init_opts=opts.InitOpts(width="100%",
# 設置動畫
animation_opts=opts.AnimationOpts(
animation_delay=1000,
animation_duration=10000,
)
))
.add_xaxis(province_data_tuple[0])
.add_yaxis(
"累計感染人數",
province_data_tuple[1],
# areastyle_opts=opts.AreaStyleOpts(opacity=0.5),
label_opts=opts.LabelOpts(is_show=False),
)
.add_yaxis(
"累計治愈人數",
province_data_tuple[2],
# areastyle_opts=opts.AreaStyleOpts(opacity=0.5),
label_opts=opts.LabelOpts(is_show=False),
)
.add_yaxis(
"累計死亡人數",
province_data_tuple[3],
# areastyle_opts=opts.AreaStyleOpts(opacity=0.5),
label_opts=opts.LabelOpts(is_show=False),
)
.set_global_opts(
title_opts=opts.TitleOpts(title="新冠肺炎走勢圖"),
toolbox_opts=opts.ToolboxOpts(
is_show=True,
feature=opts.ToolBoxFeatureOpts(
save_as_image=opts.ToolBoxFeatureSaveAsImageOpts(
type_='png',
name="YQLine",
background_color='#FFFFFF',
is_show=True,
title="保存為圖片",
),
restore=opts.ToolBoxFeatureRestoreOpts(
is_show=False
),
data_view=opts.ToolBoxFeatureDataViewOpts(
is_show=False
),
data_zoom=opts.ToolBoxFeatureDataZoomOpts(
is_show=False
),
brush=opts.ToolBoxFeatureBrushOpts(
type_="clear"
)
)
),
)
)
# make_snapshot(snapshot, c, 'img/全國疫情可視化line.gif')
return c
# 生成死亡率 治愈率折線圖
def get_rate_line_pic() -> Line:
line = (
Line(init_opts=opts.InitOpts(width="100%",
# 設置動畫
animation_opts=opts.AnimationOpts(
animation_delay=1000,
animation_duration=10000,
)
))
.add_xaxis(province_data_tuple[0])
.add_yaxis("新冠肺炎感染人數死亡率",
province_data_tuple[4],
label_opts=opts.LabelOpts(is_show=False)
)
.add_yaxis("新冠肺炎感染人數治愈率",
province_data_tuple[5],
label_opts=opts.LabelOpts(is_show=False)
)
.set_global_opts(
title_opts=opts.TitleOpts(title="新冠肺炎感染人數治愈率和死亡率"),
toolbox_opts=opts.ToolboxOpts(
is_show=True,
feature=opts.ToolBoxFeatureOpts(
save_as_image=opts.ToolBoxFeatureSaveAsImageOpts(
type_='png',
name="YQLineRate",
background_color='#FFFFFF',
is_show=True,
title="保存為圖片",
),
restore=opts.ToolBoxFeatureRestoreOpts(
is_show=False
),
data_view=opts.ToolBoxFeatureDataViewOpts(
is_show=False
),
data_zoom=opts.ToolBoxFeatureDataZoomOpts(
is_show=False
),
brush=opts.ToolBoxFeatureBrushOpts(
type_="clear"
)
)
),
)
)
return line
# 生成動態柱狀圖
def bar_datazoom_slider() -> Bar:
c = (
Bar(init_opts=opts.InitOpts(width='100%'))
.add_xaxis(province_data_tuple[0])
# 不顯示數據
.add_yaxis("感染人數", province_data_tuple[1], label_opts=opts.LabelOpts(is_show=False))
.add_yaxis("治愈人數", province_data_tuple[2], label_opts=opts.LabelOpts(is_show=False))
.add_yaxis("死亡人數", province_data_tuple[3], label_opts=opts.LabelOpts(is_show=False))
.set_global_opts(
title_opts=opts.TitleOpts(title="新冠肺炎感染人數"),
# 鎖定區域
datazoom_opts=[opts.DataZoomOpts(
range_start=0,
range_end=20,
)],
)
)
return c
# 獲取全球疫情地圖
def get_world_map():
c = (
MapGlobe(init_opts=opts.InitOpts(width="100%", height="700px", bg_color="#2E9AFE"))
.add_schema()
.add(
maptype="world",
series_name="World Population",
data_pair=country_data,
is_map_symbol_show=False,
label_opts=opts.LabelOpts(is_show=True),
tooltip_opts=opts.TooltipOpts(
is_show=True
)
)
.set_global_opts(
title_opts=opts.TitleOpts(
title="全球疫情可視化地圖",
),
visualmap_opts=opts.VisualMapOpts(
min_=0,
max_=1000000,
range_text=["max", "min"],
is_calculable=True,
range_color=["#F5DA81", "#FAAC58", "#FE642E", "#DF0101"],
),
)
)
c.render('app01/templates/world.html')
# 生成組合圖標
def page_simple_layout():
page = Page(layout=Page.SimplePageLayout)
page.add(
get_map_old_data(),
get_map_now_data(),
get_line_pic(),
bar_datazoom_slider(),
get_rate_line_pic(),
# get_world_map(),
)
page.render('app01/templates/全國疫情可視化匯總圖.html')
3.效果展示