ECharts实战:新冠病毒全国疫情地图可视化(requests获取数据+ECharts展
⽰)
ECharts实现新冠病毒全国疫情地图可视化效果
效果1(分段映射)
效果2(连续映射)
前⼏天使⽤basemap + matplotlib实现了新冠病毒全国疫情地图可视化,但是美观性不是太好
通过⽐较多个可视化⼯具,发现还是ECharts最适合中国地图可视化
ECharts有很好的交互性,⿏标放置地图上可以显⽰具体的⼈数,拖动滑条可以查看不同的范围
ECharts地图数据丰富,图表美化的很好,很多功能不⽤单独去设置,输出的图⽚已经是优化后的结果
虽然有pyecharts库,但是相对于原装的ECharts功能还是少⼀些,设置上也稍微⿇烦⼀点
推荐直接使⽤ECharts,更新维护更加⽅便
1. 获取及提取数据
使⽤requests请求获取原始数据即可
# -*- coding:utf-8 -*-
# project_xxx\venv\Scripts python
'''
Author: Felix
WeiXin: AXiaShuBai
Email: xiashubai@gmail
Blog: blog.csdn/u011318077
Date: 2020/1/30 20:33
Desc:
'''
import requests
import json
class nCovData():
def __init__(self):
# 获取原始全国疫情数据的⽹址
self.start_url = 'view.inews.qq/g2/getOnsInfo?name=disease_h5'
def get_html_text(self):
headers = {'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; WOW64; rv:66.0) Gecko/20100101 Firefox/66.0'}
res = (self.start_url, headers=headers, timeout=30)
# 将获取到的json格式的字符串类型数据转换为python⽀持的字典类型数据
data = json.)
# 所有的疫情数据,data['data']数据还是str的json格式需要转换为字典格式,包括:中国累积数据、各国数据(中国⾥⾯包含各省及地级市详细数据)、中国每⽇累积数据(1⽉13⽇开始)
all_data = json.loads(data['data'])
# print(all_data)
return all_data
if __name__ == '__main__':
ncovdata = nCovData()
<_html_text()
提取需要的数据
# -*- coding:utf-8 -*-
# project_xxx\venv\Scripts python
'''
'''
Author: Felix
WeiXin: AXiaShuBai
Email: xiashubai@gmail
Blog: blog.csdn/u011318077
Date: 2020/1/30 21:15
Desc:
'''
from nCov_data_analysis import a_get_html
import json
class ProvinceData():
def __init__(self):
# 获取所有的疫情数据,字典格式
self.all_data = _html_text()
用html设计一个疫情网页代码def province_total_data(self):
'''获取各省的累积数据'''
# areaTree对应的第⼀个数据就是中国,下⾯的children对应的就是每个省份的数据,是⼀个列表 areaTree = self.all_data['areaTree'][0]['children']
province_name = list()
province_total_confirm = list()
province_total_suspect = list()
province_total_dead = list()
province_total_heal = list()
for province in areaTree:
province_name.append(province['name'])
province_total_confirm.append(province['total']['confirm'])
province_total_suspect.append(province['total']['suspect'])
province_total_dead.append(province['total']['dead'])
province_total_heal.append(province['total']['heal'])
# 将省份名称和确诊⼈数对应打包为字典,⽤于ECharts地图可视化
province_total_confirm_dict = {'name': province_name, 'value': province_total_confirm}
print(province_total_confirm_dict)
with open('province_total.json', 'w', encoding='utf-8') as f:
json.dump(province_total_confirm_dict, f, ensure_ascii=False)
return province_name, province_total_confirm
def province_today_data(self):
'''获取各省今⽇数据'''
areaTree = self.all_data['areaTree'][0]['children']
province_name = list()
province_today_confirm = list()
province_today_suspect = list()
province_today_dead = list()
province_today_heal = list()
for province in areaTree:
province_name.append(province['name'])
province_today_confirm.append(province['today']['confirm'])
province_today_suspect.append(province['today']['suspect'])
province_today_dead.append(province['total']['dead'])
province_today_heal.append(province['total']['heal'])
# print(province_today_confirm)
def main(self):
self.province_total_data()
self.province_today_data()
if __name__ == '__main__':
province_data= ProvinceData()
province_data.main()
数据的获取具体分析及步骤请参考我的另外⼀篇博⽂
最终获取的JSON数据内容,⽤于ECharts作图:
{"name": ["湖北", "⼴东", "河南", "浙江", "湖南", "安徽", "江西", "江苏", "重庆", "⼭东", "四川", "⿊龙江", "北京", "上海", "福建", "河北", "陕西", "⼴西", "海南", "云南", "贵州", "⼭西", "辽宁", "天津", "⽢肃", "吉林", "宁夏", "新疆", "内蒙古", "⾹港", "台湾", "青海", "澳门", "西藏"],
"value": [48206, 1241, 1169, 1145, 968, 910, 872, 570, 518, 506, 451, 395, 366, 315, 279, 265, 229, 222, 157, 155, 135, 126, 116, 113, 87, 84, 64, 63, 61 , 50, 18, 18, 10, 1]}
2. ECharts地图可视化
使⽤map进⾏可视化
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
<script src="../js/jquery-1.12.4.min.js"></script>
<script src="../echarts/dist/echarts.min.js"></script> <!--引⼊echarts的js⽂件-->
<!--引⼊中国的地图数据js⽂件,引⼊后会⾃动注册地图名字和数据,json格式⽂件需要⼿动注册-->
<script src="../echarts/map/js/china.js"></script>
</head>
<body>
<div id="main" ></div> <!-- 第2步:引⼊绘图容器 -->
<script type="text/javascript">
// 第3步: 基于容器,创建⼀个echarts实例
var myChart = echarts.ElementById('main'));
// 第4步和第5步可以合并,合并myChart.setOption中的内容即可,如下
$.get('../nCov_data_analysis/province_total.json').done(function (data) {
myChart.setOption({
// 设置标题和副标题及副标题跳转链接
title: {
text: '新冠病毒疫情病毒(各省确诊病例截⽌2020.02.13)',
subtext: '数据来源--腾讯新闻',
sublink: 'news.qq//zt2020/page/feiyan.htm'
},
// 数据提⽰框
tooltip: {
trigger: 'item', // item放到数据区域触发
formatter: '{b}<br/>{c} (⼈)' // 提⽰数据格式br表⽰换⾏,地图 : {a}(系列名称),{b}(区域名称),{c}(合并数值), {d}(⽆)
},
// ⼯具栏
toolbox: {
show: true,
orient: 'horizontal',
left: 'right',
feature: {
dataView: {readOnly: false},
restore: {},
saveAsImage: {}
}
},
// 视觉映射⽅案1:,疫情颜⾊根据传染病疫情等级分类为4机:蓝⾊-黄⾊-橙⾊-红⾊
// 为了是视觉分布更好,可以添加更多的颜⾊范围,然后适当调⼩max的值,因为湖北和后⾯省份相差太⼤
// 湖北有⼏万确诊,其它较严重省份⼈数在1000多⼈,max值设置在1500,整个地图颜⾊变化相对均匀
/*visualMap: {
min: 1, // 颜⾊映射对应的最⼩值,即对应下⾯的lightskyblue
max: 1500, // 颜⾊映射对应的最⼤值,即对应下⾯的orangered
text: ['严重', '⼀般'], // 映射图上下标记⽂本
realtime: true, // 是否显⽰拖拽⼿柄,映射条可以拖拽调整要映射的范围
calculable: true, // 拖拽时,是否实时更新地图
inRange: {
color: ['lightblue', 'yellow', 'orange', 'darkorange', 'red', 'darkred'] // 颜⾊映射范围,最⼩值,过渡值,最⼤值 }
},*/
// 视觉映射⽅案2:
// visualMap默认是连续映射,我们也可以设置为分段型,对于分布范围⼴的数据
// 使⽤透明度来区分疫情严重情况
visualMap: {
type: 'piecewise',
pieces: [
{gt: 1500, color: 'darkred'}, // (1500, Infinity]
{gt: 1000, lte: 1500, color: 'red', colorAlpha: 1}, // (1000, 1500]
{gt: 500, lte: 1000, color: 'red', colorAlpha: 0.8},
{gt: 300, lte: 500, color: 'red', colorAlpha: 0.6},
{gt: 100, lte: 300, color: 'red', colorAlpha: 0.4},
{gt: 50, lte: 100, color: 'red', colorAlpha: 0.3},
{lt: 50, color: 'red', colorAlpha: 0.2} // (-Infinity, 100)
],
},
// 具体数据
series: [
{
name: '各省确诊病例', // 系列名称
type: 'map', // 系列类型,地图
map: 'china', // 要使⽤的地图,即上⾯注册的地图名称
roam: true, // 开启⿏标缩放和平移漫游
label: { // 图形上的⽂本标签,地图默认显⽰数据名
show: true,
formatter: '{b}', // b是数据名,c是数据值
fontSize: 12
},
data: [
{name: data['name'][0], value: data['value'][0]},
{name: data['name'][1], value: data['value'][1]},
{name: data['name'][2], value: data['value'][2]},
{name: data['name'][3], value: data['value'][3]},
{name: data['name'][4], value: data['value'][4]},
{name: data['name'][5], value: data['value'][5]},
{name: data['name'][6], value: data['value'][6]},
{name: data['name'][7], value: data['value'][7]},
{name: data['name'][8], value: data['value'][8]},
{name: data['name'][9], value: data['value'][9]},
{name: data['name'][10], value: data['value'][10]},
{name: data['name'][11], value: data['value'][11]},
{name: data['name'][12], value: data['value'][12]},
{name: data['name'][13], value: data['value'][13]},
{name: data['name'][14], value: data['value'][14]},
{name: data['name'][15], value: data['value'][15]},
{name: data['name'][16], value: data['value'][16]},
{name: data['name'][17], value: data['value'][17]},
{name: data['name'][18], value: data['value'][18]},
{name: data['name'][19], value: data['value'][19]},
{name: data['name'][20], value: data['value'][20]},
{name: data['name'][21], value: data['value'][21]},
{name: data['name'][22], value: data['value'][22]},
{name: data['name'][23], value: data['value'][23]},
{name: data['name'][24], value: data['value'][24]},
{name: data['name'][25], value: data['value'][25]},
{name: data['name'][26], value: data['value'][26]},
{name: data['name'][27], value: data['value'][27]},
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论