Python抓新型冠狀病毒肺炎疫情數(shù)據(jù)并繪制全國疫情分布的代碼實例
運行結(jié)果(2020-2-4日數(shù)據(jù))


數(shù)據(jù)來源
news.qq.com/zt2020/page/feiyan.htm

抓包分析


日報數(shù)據(jù)格式
"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"
}, {
。。。。。。
全國各地疫情數(shù)據(jù)格式
"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
}
}, {
。。。。。。
地圖數(shù)據(jù)
github.com/dongli/china-shapefiles
代碼實現(xiàn)
#%%
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'] # 用來正常顯示中文標(biāo)簽
plt.rcParams['axes.unicode_minus'] = False # 用來正常顯示負(fù)號
#%%
# 全國疫情地區(qū)分布(省級確診病例)
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)
#%%
# 抓取全國疫情按日期分布
'''
數(shù)據(jù)源:
"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可讀性已經(jīng)很好了;這里這樣寫僅是為了少該點老版本的代碼
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)
#%%
# 繪制每日確診和死亡數(shù)據(jù)
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('日期元素數(shù):', len(list_date), "\n確診元素數(shù):", 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() # 優(yōu)化標(biāo)注(自動傾斜)
plt.grid(linestyle=':') # 顯示網(wǎng)格
plt.xlabel('日期',fontsize=16)
plt.ylabel('人數(shù)',fontsize=16)
plt.legend(loc='best')
plot_cn_daily()
#%%
# 繪制全國省級行政區(qū)域確診分布圖
count_iter = 0
def plot_cn_disease_dis():
# area_data = catch_area_distribution()
font = FontProperties(fname='res/coure.fon', size=14)
# 經(jīng)緯度范圍
lat_min = 10 # 緯度
lat_max = 60
lon_min = 70 # 經(jīng)度
lon_max = 140
# 標(biāo)簽顏色和文本
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))
# 新建區(qū)域
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 設(shè)置失敗
# 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]) # 畫經(jīng)度線
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')
# 畫中國國內(nèi)省界和九段線
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
# 內(nèi)外循環(huán)不能對調(diào),地圖中每個省的數(shù)據(jù)有多條(繪制每一個shape,可以去查一下第一條“臺灣省”的數(shù)據(jù))
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 # 西藏沒有疫情,數(shù)據(jù)源就不取不到其數(shù)據(jù)
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('迭代次數(shù)', count_iter)
以上就是腳本之家小編整理的全部知識點內(nèi)容,感謝大家的學(xué)習(xí)和對腳本之家的支持。
相關(guān)文章
Python?time模塊之時間戳與結(jié)構(gòu)化時間的使用
這篇文章主要為大家詳細(xì)介紹了Python中的time模塊以及如何利用time模塊實現(xiàn)時間戳與結(jié)構(gòu)化時間,文中的示例代碼講解詳細(xì),需要的可以參考一下2022-06-06
Django JSONField的自動轉(zhuǎn)換思路詳解(django自定義模型字段)
如果想實現(xiàn)JSONField的自動轉(zhuǎn)換,可以使用Django REST framework的JSONField,或者自定義一個字段類并覆蓋from_db_value()和get_prep_value()方法來實現(xiàn)這個功能,這篇文章主要介紹了Django JSONField的自動轉(zhuǎn)換(django自定義模型字段)問題,需要的朋友可以參考下2023-06-06
Python內(nèi)建類型int源碼學(xué)習(xí)
這篇文章主要為大家介紹了Python內(nèi)建類型int源碼學(xué)習(xí),有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪2022-05-05
Python實現(xiàn)讀取目錄所有文件的文件名并保存到txt文件代碼
這篇文章主要介紹了Python實現(xiàn)讀取目錄所有文件的文件名并保存到txt文件代碼,本文分別使用os.listdir和os.walk實現(xiàn)給出兩段實現(xiàn)代碼,需要的朋友可以參考下2014-11-11
python3+PyQt5 數(shù)據(jù)庫編程--增刪改實例
今天小編就為大家分享一篇python3+PyQt5 數(shù)據(jù)庫編程--增刪改實例,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2019-06-06

