Python抓新型冠状病毒肺炎疫情数据并绘制全国疫情分布的代码实例


Posted in Python onFebruary 05, 2020

运行结果(2020-2-4日数据)

Python抓新型冠状病毒肺炎疫情数据并绘制全国疫情分布的代码实例

Python抓新型冠状病毒肺炎疫情数据并绘制全国疫情分布的代码实例

数据来源

news.qq.com/zt2020/page/feiyan.htm

Python抓新型冠状病毒肺炎疫情数据并绘制全国疫情分布的代码实例

抓包分析

Python抓新型冠状病毒肺炎疫情数据并绘制全国疫情分布的代码实例

Python抓新型冠状病毒肺炎疫情数据并绘制全国疫情分布的代码实例

日报数据格式

"chinaDayList": [{
		"date": "01.13",
		"confirm": "41",
		"suspect": "0",
		"dead": "1",
		"heal": "0"
	}, {
		"date": "01.14",
		"confirm": "41",
		"suspect": "0",
		"dead": "1",
		"heal": "0"
	}, {
		"date": "01.15",
		"confirm": "41",
		"suspect": "0",
		"dead": "2",
		"heal": "5"
	}, {
	。。。。。。

全国各地疫情数据格式

"lastUpdateTime": "2020-02-04 12:43:19",
	"areaTree": [{
		"name": "中国",
		"children": [{
			"name": "湖北",
			"children": [{
				"name": "武汉",
				"total": {
					"confirm": 6384,
					"suspect": 0,
					"dead": 313,
					"heal": 303
				},
				"today": {
					"confirm": 1242,
					"suspect": 0,
					"dead": 48,
					"heal": 79
				}
			}, {
				"name": "黄冈",
				"total": {
					"confirm": 1422,
					"suspect": 0,
					"dead": 19,
					"heal": 36
				},
				"today": {
					"confirm": 176,
					"suspect": 0,
					"dead": 2,
					"heal": 9
				}
			}, {
			。。。。。。

地图数据

github.com/dongli/china-shapefiles

代码实现

#%%

import time, json, requests
from datetime import datetime
import matplotlib
import matplotlib.pyplot as plt
import matplotlib.dates as mdates
from matplotlib.font_manager import FontProperties
from mpl_toolkits.basemap import Basemap
from matplotlib.patches import Polygon
import numpy as np
import jsonpath

plt.rcParams['font.sans-serif'] = ['SimHei'] # 用来正常显示中文标签
plt.rcParams['axes.unicode_minus'] = False # 用来正常显示负号

#%%

# 全国疫情地区分布(省级确诊病例)
def catch_cn_disease_dis():
 timestamp = '%d'%int(time.time()*1000)
 url_area = ('https://view.inews.qq.com/g2/getOnsInfo?name=disease_h5'
    '&callback=&_=') + timestamp
 world_data = json.loads(requests.get(url=url_area).json()['data'])
 china_data = jsonpath.jsonpath(world_data, 
         expr='$.areaTree[0].children[*]')
 list_province = jsonpath.jsonpath(china_data, expr='$[*].name')
 list_province_confirm = jsonpath.jsonpath(china_data, expr='$[*].total.confirm')
 dic_province_confirm = dict(zip(list_province, list_province_confirm)) 
 return dic_province_confirm

area_data = catch_cn_disease_dis()
print(area_data)

#%%

# 抓取全国疫情按日期分布
'''
数据源:
"chinaDayList": [{
		"date": "01.13",
		"confirm": "41",
		"suspect": "0",
		"dead": "1",
		"heal": "0"
	}, {
		"date": "01.14",
		"confirm": "41",
		"suspect": "0",
		"dead": "1",
		"heal": "0"
	}
'''
def catch_cn_daily_dis():
 timestamp = '%d'%int(time.time()*1000)
 url_area = ('https://view.inews.qq.com/g2/getOnsInfo?name=disease_h5'
    '&callback=&_=') + timestamp
 world_data = json.loads(requests.get(url=url_area).json()['data'])
 china_daily_data = jsonpath.jsonpath(world_data, 
         expr='$.chinaDayList[*]')

 # 其实没必要单独用list存储,json可读性已经很好了;这里这样写仅是为了少该点老版本的代码  
 list_dates = list() # 日期
 list_confirms = list() # 确诊
 list_suspects = list() # 疑似
 list_deads = list() # 死亡
 list_heals = list() # 治愈  
 for item in china_daily_data:
  month, day = item['date'].split('.')
  list_dates.append(datetime.strptime('2020-%s-%s'%(month, day), '%Y-%m-%d'))
  list_confirms.append(int(item['confirm']))
  list_suspects.append(int(item['suspect']))
  list_deads.append(int(item['dead']))
  list_heals.append(int(item['heal']))  
 return list_dates, list_confirms, list_suspects, list_deads, list_heals  

list_date, list_confirm, list_suspect, list_dead, list_heal = catch_cn_daily_dis() 
print(list_date)
 

#%%

# 绘制每日确诊和死亡数据
def plot_cn_daily():
 # list_date, list_confirm, list_suspect, list_dead, list_heal = catch_cn_daily_dis() 
 
 plt.figure('novel coronavirus', facecolor='#f4f4f4', figsize=(10, 8))
 plt.title('全国新型冠状病毒疫情曲线', fontsize=20)
 print('日期元素数:', len(list_date), "\n确诊元素数:", len(list_confirm))
 plt.plot(list_date, list_confirm, label='确诊')
 plt.plot(list_date, list_suspect, label='疑似')
 plt.plot(list_date, list_dead, label='死亡')
 plt.plot(list_date, list_heal, label='治愈')
 xaxis = plt.gca().xaxis 
 # x轴刻度为1天
 xaxis.set_major_locator(matplotlib.dates.DayLocator(bymonthday=None, interval=1, tz=None))
 xaxis.set_major_formatter(mdates.DateFormatter('%m月%d日'))
 plt.gcf().autofmt_xdate() # 优化标注(自动倾斜)
 plt.grid(linestyle=':') # 显示网格
 plt.xlabel('日期',fontsize=16)
 plt.ylabel('人数',fontsize=16)
 plt.legend(loc='best')
 
plot_cn_daily()

#%%

# 绘制全国省级行政区域确诊分布图
count_iter = 0
def plot_cn_disease_dis():
 # area_data = catch_area_distribution()
 font = FontProperties(fname='res/coure.fon', size=14)
 
 # 经纬度范围
 lat_min = 10 # 纬度
 lat_max = 60
 lon_min = 70 # 经度
 lon_max = 140
  
 # 标签颜色和文本 
 legend_handles = [
    matplotlib.patches.Patch(color='#7FFFAA', alpha=1, linewidth=0),
    matplotlib.patches.Patch(color='#ffaa85', alpha=1, linewidth=0),
    matplotlib.patches.Patch(color='#ff7b69', alpha=1, linewidth=0),
    matplotlib.patches.Patch(color='#bf2121', alpha=1, linewidth=0),
    matplotlib.patches.Patch(color='#7f1818', alpha=1, linewidth=0),
 ]
 legend_labels = ['0人', '1-10人', '11-100人', '101-1000人', '>1000人']

 fig = plt.figure(facecolor='#f4f4f4', figsize=(10, 8)) 
 # 新建区域
 axes = fig.add_axes((0.1, 0.1, 0.8, 0.8)) # left, bottom, width, height, figure的百分比,从figure 10%的位置开始绘制, 宽高是figure的80%
 axes.set_title('全国新型冠状病毒疫情地图(确诊)', fontsize=20) # fontproperties=font 设置失败 
 # bbox_to_anchor(num1, num2), num1用于控制legend的左右移动,值越大越向右边移动,num2用于控制legend的上下移动,值越大,越向上移动。
 axes.legend(legend_handles, legend_labels, bbox_to_anchor=(0.5, -0.11), loc='lower center', ncol=5) # prop=font
 
 china_map = Basemap(llcrnrlon=lon_min, urcrnrlon=lon_max, llcrnrlat=lat_min, urcrnrlat=lat_max, resolution='l', ax=axes)
 # labels=[True,False,False,False] 分别代表 [left,right,top,bottom]
 china_map.drawparallels(np.arange(lat_min,lat_max,10), labels=[1,0,0,0]) # 画经度线
 china_map.drawmeridians(np.arange(lon_min,lon_max,10), labels=[0,0,0,1]) # 画纬度线
 china_map.drawcoastlines(color='black') # 洲际线
 china_map.drawcountries(color='red') # 国界线
 china_map.drawmapboundary(fill_color = 'aqua')
 # 画中国国内省界和九段线
 china_map.readshapefile('res/china-shapefiles-master/china', 'province', drawbounds=True)
 china_map.readshapefile('res/china-shapefiles-master/china_nine_dotted_line', 'section', drawbounds=True)
 
 global count_iter
 count_iter = 0
 
 # 内外循环不能对调,地图中每个省的数据有多条(绘制每一个shape,可以去查一下第一条“台湾省”的数据)
 for info, shape in zip(china_map.province_info, china_map.province):
  pname = info['OWNER'].strip('\x00')
  fcname = info['FCNAME'].strip('\x00')
  if pname != fcname: # 不绘制海岛
   continue
  is_reported = False # 西藏没有疫情,数据源就不取不到其数据 
  for prov_name in area_data.keys():    
   count_iter += 1
   if prov_name in pname:
    is_reported = True
    if area_data[prov_name] == 0:
     color = '#f0f0f0'
    elif area_data[prov_name] <= 10:
     color = '#ffaa85'
    elif area_data[prov_name] <= 100:
     color = '#ff7b69'
    elif area_data[prov_name] <= 1000:
     color = '#bf2121'
    else:
     color = '#7f1818'
    break
   
  if not is_reported:
   color = '#7FFFAA'
   
  poly = Polygon(shape, facecolor=color, edgecolor=color)
  axes.add_patch(poly)
  

plot_cn_disease_dis()
print('迭代次数', count_iter)

以上就是三水点靠木小编整理的全部知识点内容,感谢大家的学习和对三水点靠木的支持。

Python 相关文章推荐
python实现哈希表
Feb 07 Python
一个检测OpenSSL心脏出血漏洞的Python脚本分享
Apr 10 Python
Python读取指定目录下指定后缀文件并保存为docx
Apr 23 Python
Python中动态检测编码chardet的使用教程
Jul 06 Python
Python+Turtle动态绘制一棵树实例分享
Jan 16 Python
python实现归并排序算法
Nov 22 Python
python 将大文件切分为多个小文件的实例
Jan 14 Python
Python中Unittest框架的具体使用
Aug 27 Python
解决python虚拟环境切换无效的问题
Apr 30 Python
Python tkinter制作单机五子棋游戏
Sep 14 Python
Django contrib auth authenticate函数源码解析
Nov 12 Python
pyqt5蒙版遮罩mask,setmask的使用
Jun 11 Python
Python实现新型冠状病毒传播模型及预测代码实例
Feb 05 #Python
基于Tensorflow批量数据的输入实现方式
Feb 05 #Python
Python操作注册表详细步骤介绍
Feb 05 #Python
Python类继承和多态原理解析
Feb 05 #Python
Python模块 _winreg操作注册表
Feb 05 #Python
python3操作注册表的方法(Url protocol)
Feb 05 #Python
Python tkinter模版代码实例
Feb 05 #Python
You might like
学习php设计模式 php实现桥梁模式(bridge)
2015/12/07 PHP
分享50个提高PHP执行效率的技巧
2015/12/26 PHP
ThinkPHP下表单令牌错误与解决方法分析
2017/05/20 PHP
javascript 新浪背投广告实现代码
2009/07/07 Javascript
jQuery 操作下拉列表框实现代码
2010/02/22 Javascript
js前台判断开始时间是否小于结束时间
2012/02/23 Javascript
jquery 操作DOM案例代码分享
2012/04/05 Javascript
JQuery+Ajax无刷新分页的实例代码
2014/02/08 Javascript
js调用浏览器打印模块实现点击按钮触发自定义函数
2014/03/21 Javascript
js简单的弹出框有关闭按钮
2014/05/05 Javascript
了不起的node.js读书笔记之mongodb数据库交互
2014/12/22 Javascript
浅析javascript中的DOM
2015/03/01 Javascript
JavaScript计算两个日期时间段内日期的方法
2015/03/16 Javascript
利用Angularjs中模块ui-route管理状态的方法
2016/12/27 Javascript
webpack配置文件和常用配置项介绍
2017/04/28 Javascript
jQuery Tree Multiselect使用详解
2017/05/02 jQuery
node.js将MongoDB数据同步到MySQL的步骤
2017/12/10 Javascript
解决Vue 浏览器后退无法触发beforeRouteLeave的问题
2017/12/24 Javascript
javascript中UMD规范的代码推演
2018/08/29 Javascript
使用JS判断页面是首次被加载还是刷新
2019/05/26 Javascript
基于Vue+ElementUI的省市区地址选择通用组件
2019/11/20 Javascript
angular组件间传值测试的方法详解
2020/05/07 Javascript
vue中template的三种写法示例
2020/10/21 Javascript
node.js 基于 STMP 协议和 EWS 协议发送邮件
2021/02/14 Javascript
python+matplotlib绘制简单的海豚(顶点和节点的操作)
2018/01/02 Python
python如何读写csv数据
2018/03/21 Python
python对批量WAV音频进行等长分割的方法实现
2020/09/25 Python
python爬虫中PhantomJS加载页面的实例方法
2020/11/12 Python
Python入门基础之数字字符串与列表
2021/02/01 Python
平面设计求职信
2014/03/10 职场文书
多媒体教室标语
2014/06/26 职场文书
质监局领导班子践行群众路线整改方案
2014/10/26 职场文书
无违反计划生育证明格式
2015/06/24 职场文书
三八妇女节主持词
2015/07/04 职场文书
javaScript Array api梳理
2021/03/31 Javascript
详解Flutter自定义应用程序内键盘的实现方法
2022/06/14 Java/Android