Python抓新型冠状病毒肺炎疫情数据并绘制全国疫情分布的代码实例
运行结果(2020-2-4日数据)
数据来源
news.qq.com/zt2020/page/feiyan.htm
抓包分析
日报数据格式
"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-0412: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
代码实现
#%% importtime,json,requests fromdatetimeimportdatetime importmatplotlib importmatplotlib.pyplotasplt importmatplotlib.datesasmdates frommatplotlib.font_managerimportFontProperties frommpl_toolkits.basemapimportBasemap frommatplotlib.patchesimportPolygon importnumpyasnp importjsonpath plt.rcParams['font.sans-serif']=['SimHei']#用来正常显示中文标签 plt.rcParams['axes.unicode_minus']=False#用来正常显示负号 #%% #全国疫情地区分布(省级确诊病例) defcatch_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)) returndic_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" } ''' defcatch_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()#治愈 foriteminchina_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'])) returnlist_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) #%% #绘制每日确诊和死亡数据 defplot_cn_daily(): #list_date,list_confirm,list_suspect,list_dead,list_heal=catch_cn_daily_dis() plt.figure('novelcoronavirus',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 defplot_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的百分比,从figure10%的位置开始绘制,宽高是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='lowercenter',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) globalcount_iter count_iter=0 #内外循环不能对调,地图中每个省的数据有多条(绘制每一个shape,可以去查一下第一条“台湾省”的数据) forinfo,shapeinzip(china_map.province_info,china_map.province): pname=info['OWNER'].strip('\x00') fcname=info['FCNAME'].strip('\x00') ifpname!=fcname:#不绘制海岛 continue is_reported=False#西藏没有疫情,数据源就不取不到其数据 forprov_nameinarea_data.keys(): count_iter+=1 ifprov_nameinpname: is_reported=True ifarea_data[prov_name]==0: color='#f0f0f0' elifarea_data[prov_name]<=10: color='#ffaa85' elifarea_data[prov_name]<=100: color='#ff7b69' elifarea_data[prov_name]<=1000: color='#bf2121' else: color='#7f1818' break ifnotis_reported: color='#7FFFAA' poly=Polygon(shape,facecolor=color,edgecolor=color) axes.add_patch(poly) plot_cn_disease_dis() print('迭代次数',count_iter)
以上就是毛票票小编整理的全部知识点内容,感谢大家的学习和对毛票票的支持。
声明:本文内容来源于网络,版权归原作者所有,内容由互联网用户自发贡献自行上传,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任。如果您发现有涉嫌版权的内容,欢迎发送邮件至:czq8825#qq.com(发邮件时,请将#更换为@)进行举报,并提供相关证据,一经查实,本站将立刻删除涉嫌侵权内容。