這篇文章主要介紹Python抓新型冠狀病毒肺炎疫情數(shù)據(jù)并繪制全國(guó)疫情分布的案例分析,文中介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們一定要看完!
運(yùn)行結(jié)果(2020-2-4日數(shù)據(jù))
數(shù)據(jù)來(lái)源
news.qq.com/zt2020/page/feiyan.htm
抓包分析
日?qǐng)?bào)數(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" }, { 。。。。。。
全國(guó)各地疫情數(shù)據(jù)格式
"lastUpdateTime": "2020-02-04 12:43:19", "areaTree": [{ "name": "中國(guó)", "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
代碼實(shí)現(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'] # 用來(lái)正常顯示中文標(biāo)簽 plt.rcParams['axes.unicode_minus'] = False # 用來(lái)正常顯示負(fù)號(hào) #%% # 全國(guó)疫情地區(qū)分布(省級(jí)確診病例) def catch_cn_disease_dis(): timestamp = '%d'%int(time.time()*1000) url_area = ('https://view.inews.qq.com/g2/getOnsInfo?name=disease_h6' '&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) #%% # 抓取全國(guó)疫情按日期分布 ''' 數(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_h6' '&callback=&_=') + timestamp world_data = json.loads(requests.get(url=url_area).json()['data']) china_daily_data = jsonpath.jsonpath(world_data, expr='$.chinaDayList[*]') # 其實(shí)沒(méi)必要單獨(dú)用list存儲(chǔ),json可讀性已經(jīng)很好了;這里這樣寫(xiě)僅是為了少該點(diǎn)老版本的代碼 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('全國(guó)新型冠狀病毒疫情曲線(xiàn)', fontsize=20) print('日期元素?cái)?shù):', len(list_date), "\n確診元素?cái)?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)注(自動(dòng)傾斜) plt.grid(linestyle=':') # 顯示網(wǎng)格 plt.xlabel('日期',fontsize=16) plt.ylabel('人數(shù)',fontsize=16) plt.legend(loc='best') plot_cn_daily() #%% # 繪制全國(guó)省級(jí)行政區(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%的位置開(kāi)始繪制, 寬高是figure的80% axes.set_title('全國(guó)新型冠狀病毒疫情地圖(確診)', fontsize=20) # fontproperties=font 設(shè)置失敗 # bbox_to_anchor(num1, num2), num1用于控制legend的左右移動(dòng),值越大越向右邊移動(dòng),num2用于控制legend的上下移動(dòng),值越大,越向上移動(dòng)。 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]) # 畫(huà)經(jīng)度線(xiàn) china_map.drawmeridians(np.arange(lon_min,lon_max,10), labels=[0,0,0,1]) # 畫(huà)緯度線(xiàn) china_map.drawcoastlines(color='black') # 洲際線(xiàn) china_map.drawcountries(color='red') # 國(guó)界線(xiàn) china_map.drawmapboundary(fill_color = 'aqua') # 畫(huà)中國(guó)國(guó)內(nèi)省界和九段線(xiàn) 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)不能對(duì)調(diào),地圖中每個(gè)省的數(shù)據(jù)有多條(繪制每一個(gè)shape,可以去查一下第一條“臺(tái)灣省”的數(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 # 西藏沒(méi)有疫情,數(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)python的數(shù)據(jù)類(lèi)型有哪些?
python的數(shù)據(jù)類(lèi)型:1. 數(shù)字類(lèi)型,包括int(整型)、long(長(zhǎng)整型)和float(浮點(diǎn)型)。2.字符串,分別是str類(lèi)型和unicode類(lèi)型。3.布爾型,Python布爾類(lèi)型也是用于邏輯運(yùn)算,有兩個(gè)值:True(真)和False(假)。4.列表,列表是Python中使用最頻繁的數(shù)據(jù)類(lèi)型,集合中可以放任何數(shù)據(jù)類(lèi)型。5. 元組,元組用”()”標(biāo)識(shí),內(nèi)部元素用逗號(hào)隔開(kāi)。6. 字典,字典是一種鍵值對(duì)的集合。7. 集合,集合是一個(gè)無(wú)序的、不重復(fù)的數(shù)據(jù)組合。
以上是“Python抓新型冠狀病毒肺炎疫情數(shù)據(jù)并繪制全國(guó)疫情分布的案例分析”這篇文章的所有內(nèi)容,感謝各位的閱讀!希望分享的內(nèi)容對(duì)大家有幫助,更多相關(guān)知識(shí),歡迎關(guān)注創(chuàng)新互聯(lián)行業(yè)資訊頻道!
分享題目:Python抓新型冠狀病毒肺炎疫情數(shù)據(jù)并繪制全國(guó)疫情分布的案例分析-創(chuàng)新互聯(lián)
網(wǎng)站網(wǎng)址:http://aaarwkj.com/article10/dopjgo.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供網(wǎng)站導(dǎo)航、App開(kāi)發(fā)、定制開(kāi)發(fā)、ChatGPT、網(wǎng)站制作、云服務(wù)器
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶(hù)投稿、用戶(hù)轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀(guān)點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話(huà):028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來(lái)源: 創(chuàng)新互聯(lián)
猜你還喜歡下面的內(nèi)容