数据的可视化更多的是数据的格式化和准备工作,互联网上关于海南地图的展现绝大多数是不全的,所以本笔记的主要难点在于数据的转换,列表中根据字典日期对字典数据的排序,对列表中数据的过滤,对同义词数据的翻译,其次是pyecharts的使用,pyecharts进入了1.0版本,新引入了链式访问,在map上也尝试了非连续值和色差呈现。
代码如下:
代码语言:javascript复制#coding=utf-8
from pyecharts import options as opts
from pyecharts.globals import ThemeType
from pyecharts.charts import Map,Line
# 原始数据
#全国病例历史数据,从2020-01-23到前一天,可进行分析预测
countrydatahistorys=[]
#前一日的全国各省病例数据,可进行全国的可视化呈现
provincedatas=[]
#前一日的全国各省市县病例数据,可进行各省市的可视化呈现
citydatas=[]
# 结构化全国各省图表所需数据
provincenames=list(row['provinceName'] for row in provincedatas)
confirmedCount=list(row['confirmedCount'] for row in provincedatas)
provincedatasdict=[list(z) for z in zip(provincenames,confirmedCount)]
# 结构化海南各市县图表所需数据
# pyecharts中的地市名称是全称,而卫计委提供的是简称
citysyn={'三亚':'三亚市','海口':'海口市','万宁':'万宁市','儋州':'儋州市','澄迈县':'澄迈县','琼海市':'琼海市',
'临高县':'临高县','昌江':'昌江黎族自治县','陵水县':'陵水黎族自治县','文昌':'文昌市','定安':'定安县','东方市':'东方市',
'保亭县':'保亭黎族苗族自治县','乐东':'乐东黎族自治县','琼中县':'琼中黎族苗族自治县','白沙':'白沙黎族自治县','屯昌县':'屯昌县','五指山':'五指山市'}
citydatas=[]
cityname=list(row['cityName'] for row in citydatas if row['provinceName']=='海南')
cityname=[citysyn[i] if i in citysyn else i for i in cityname]
citycount=list(row['confirmedCount'] for row in citydatas if row['provinceName']=='海南')
citydatasdict=[list(z) for z in zip(cityname,citycount)]
#全国各省的区间值
provicepiece=[{"min": 10000, "label": ">= 10000", "color": '#49712D'},
{"min": 1000,"max": 9999, "label": "1000 - 9999", "color": '#5F933B'},
{"min": 500,"max": 999, "label": "500 - 999", "color": '#6BA543'},
{"min": 100,"max": 499, "label": "100 - 499", "color": '#88B76E'},
{"min": 10, "max": 99, "label": "10 - 99", "color": '#ACCA9E'},
{"min": 1,"max": 9, "label": "1 - 9", "color": '#C9DBC1'}
]
#海南各市县的区间值
hainanpiece=[{"min": 100, "label": ">= 100", "color": '#49712D'},
{"min": 50,"max": 99, "label": "50 - 99", "color": '#5F933B'},
{"min": 20,"max": 49, "label": "20 - 49", "color": '#6BA543'},
{"min": 10,"max": 19, "label": "10 - 19", "color": '#88B76E'},
{"min": 1,"max": 9, "label": "1 - 9", "color": '#ACCA9E'},
{"min": 0,"max": 0, "label": " = 0", "color": '#C9DBC1'}
]
hainan_point = [109.844902, 19.0392]
# # -----------------------------------------------------------------
map = Map(init_opts=opts.InitOpts(width="800px", height="600px",
theme=ThemeType.LIGHT))#主题风格
map.add(series_name="累计确诊病例",
data_pair=provincedatasdict,
maptype="china",
is_selected=True
)
map.set_global_opts(title_opts=opts.TitleOpts(title="全国疫情地图", #主标题
subtitle="累计确诊病例"), #副标题
visualmap_opts=opts.VisualMapOpts(
is_show=True, # 是否显示视觉映射配置
#min_=0, # 指定 visualMapPiecewise 组件的最小值。
#max=25000, # 指定 visualMapPiecewise 组件的最大值。
#range_size=[0,10000], # visualMap 组件过渡 symbol 大小
#split_number = 5, # 对于连续型数据,自动平均切分成几段。默认为5段
is_piecewise=True, # 是否为分段型
pieces=provicepiece # 自定义的每一段的范围,以及每一段的文字,以及每一段的特别的样式
)
)
map.render('全国.html')
# -----------------------------------------------------------------
map = Map(init_opts=opts.InitOpts(width="800px", height="600px",
theme=ThemeType.LIGHT))#主题风格
map.add(series_name="累计确诊病例",
data_pair=citydatasdict,
maptype="海南",
center=hainan_point,
is_selected=True,
zoom=8
)
map.set_global_opts(title_opts=opts.TitleOpts(title="海南疫情地图", #主标题
subtitle="累计确诊病例"), #副标题
visualmap_opts=opts.VisualMapOpts(
is_show=True, # 是否显示视觉映射配置
#min_=0, # 指定 visualMapPiecewise 组件的最小值。
#max=25000, # 指定 visualMapPiecewise 组件的最大值。
#range_size=[0,10000], # visualMap 组件过渡 symbol 大小
#split_number = 5, # 对于连续型数据,自动平均切分成几段。默认为5段
is_piecewise=True, # 是否为分段型
pieces=hainanpiece # 自定义的每一段的范围,以及每一段的文字,以及每一段的特别的样式
)
)
map.render('海南.html')
# -----------------------------------------------------------------
import operator
# 按照时间排序全国趋势数据
countrydatahistorys=sorted(countrydatahistorys, key=operator.itemgetter('date'))
# 结构化全国各省图表所需数据
dates=list(row['date'] for row in countrydatahistorys)
confirmedNum=list(row['confirmedNum'] for row in countrydatahistorys)
suspectedNum=list(row['suspectedNum'] for row in countrydatahistorys)
suspectedIncr=list(row['suspectedIncr'] for row in countrydatahistorys)
def line_commdata() -> Line:
c = (
Line(init_opts=opts.InitOpts(width="800px", height="500px",
theme=ThemeType.LIGHT))
.add_xaxis(dates)
.add_yaxis("累计确诊病例", confirmedNum, is_smooth=True)
.add_yaxis("累计疑似病例", suspectedNum, is_smooth=True)
.set_global_opts(title_opts=opts.TitleOpts(title="全国疫情累计趋势",subtitle="累计确诊/疑似病例"))
)
return c
line=line_commdata()
line.render('全国累计趋势.html')
def line_newdata() -> Line:
c = (
Line(init_opts=opts.InitOpts(width="800px", height="500px",
theme=ThemeType.LIGHT))
.add_xaxis(dates)
.add_yaxis("新增疑似病例", suspectedIncr, is_smooth=True)
.set_global_opts(title_opts=opts.TitleOpts(title="全国疫情新增趋势",subtitle="新增疑似病例"))
)
return c
line=line_newdata()
line.render('全国新增趋势.html')