新冠疫情已经持续几个月了。目前,我国疫情已基本得到控制。我们会看到很多网站提供各种疫情统计图。今天我们使用Python的pyecharts框架来绘制一些比较常见的统计图。玫瑰图首先我们来画一下前段时间比较流行的夜莺玫瑰图。数据来源通过接口https://lab.isaaclin.cn/nCoV/zh获取。我们取疫情死亡人数超过2000的国家执行代码如下:url='https://lab.isaaclin.cn/nCoV/api/area'data_json=requests.get(url).json()country_list=[]count_list=[]ds={}foritemindata_json['results']:如果item['countryEnglishName']:如果item['deadCount']不是None并且item['countryName']不是None:如果int(item['deadCount'])>2000:d={item['countryName']:item['deadCount']}ds.update(d)ds=dict(sorted(ds.items(),key=lambdak:k[1]))#name如果有重复,则使用国家名称作为keycountry_list=ds.keys()count_list=ds.values()#随机颜色生成defrandomcolor(kind):colors=[]foriinrange(kind):colArr=['1','2','3','4','5','6','7','8','9','A','B','C','D','E','F']color=""foriinrange(6):color+=colArr[random.randint(0,14)]颜色。append("#"+color)返回颜色color_series=randomcolor(len(count_list))#创建饼图pie=Pie(init_opts=opts.InitOpts(width='800px',height='900px'))#添加数据pie.add("",[list(z)forzinzip(country_list,count_list)],radius=['20%','100%'],center=['60%','65%'],rosetype='area')#设置全局配置#pie.set_global_opts(title_opts=opts.TitleOpts(title='夜莺玫瑰图'),#legend_opts=opts.LegendOpts(is_show=False))#设置全局配置项pie.set_global_opts(title_opts=opts.TitleOpts(title='GlobalNewCrownEpidemic',subtitle='死亡人数超过\n2000的国家',title_textstyle_opts=opts.TextStyleOpts(font_size=15,color='#0085c3'),subtitle_textstyle_opts=opts.TextStyleOpts(font_size=15,color='#003399'),pos_right='center',pos_left='53%',pos_top='62%',pos_bottom='center'),legend_opts=opts.LegendOpts(is_show=False))#设置系列配置和颜色pie.set_series_opts(label_opts=opts.LabelOpts(is_show=True,position='inside',font_size=12,formatter='{b}:{c}',font_style='italic',font_family='微软雅黑'))饼图。set_colors(color_series)pie.render('Nightingalerosemap.html')看效果图:全球疫情地图接下来我们画一张全球疫情地图。我们取每个国家累计死亡人数的数据,代码实现如下Display:url='https://lab.isaaclin.cn/nCoV/api/area'data=requests.get(url).json()oversea_confirm=[]foritemindata['results']:ifitem['countryEnglishName']:oversea_confirm.append((item['countryEnglishName'].replace('UnitedStatesofAmerica','UnitedStates').replace('UnitedKiongdom','UnitedKingdom'),item['deadCount']))world_map=(Map(init_opts=opts.InitOpts(theme='dark')).add('累计死亡人数',overseas_confirm,'world',is_map_symbol_show=False,is_roam=False).set_series_opts(label_opts=opts.LabelOpts(is_show=False,color='#fff')).set_global_opts(title_opts=opts.TitleOpts(title='全球疫情累计死亡人数图'),legend_opts=opts.LegendOpts(is_show=False),visualmap_opts=opts.VisualMapOpts(max_=2700,is_piecewise=True,pieces=[{"max":99999,"min":10000,"label":"10000人及以上","color":"#8A0808"},{"max":9999,"min":1000,"label":"1000-9999人","color":"#B40404"},{"max":999,"min":500,"label":"500-999人","color":"#DF0101"},{"max":499,"min":100,"label":"100-499人","color":"#F78181"},{"max":99,"min":10,"label":"10-99人","color":"#F5A9A9"},{"max":9,"min":0,"label":"1-9人","color":"#FFFFCC"},])))world_map.render(path='全球疫情地图.html')看看效果图:中国疫情地图我们来绘制我国的疫情地图。该数据为各省累计确诊病例数数据。代码实现如下:url='https://lab.isaaclin.cn/nCoV/api/area'data=requests.get(url).json()province_data=[]foritemindata['results']:ifitem['countryName']=='China':province_data.append((item['provinceShortName'],item['confirmedCount']))china_map=(Map(init_opts=opts.InitOpts(theme='dark')).add('确诊病例数',province_data,'中国',is_map_symbol_show=False,is_roam=False).set_series_opts(label_opts=opts.LabelOpts(is_show=True,color='#ffffff')).set_global_opts(title_opts=opts.TitleOpts(title="中国累计确诊病例地图"),legend_opts=opts.LegendOpts(is_show=False),visualmap_opts=opts.VisualMapOpts(max_=2000,is_piecewise=True,pieces=[{"max":9999,"min":1000,"label":"1000-9999people","color":"#B40404"},{"max":999,"min":500,"label":"500-999人","color":"#DF0101"},{"max":499,"min":100,"label":"100-499人","color":"#F78181"},{"max":99,"min":10,"label":"10-99人","color":"#F5A9A9"},{"max":9,"min":0,"label":"1-9人","color":"#FFFFCC"},])))china_map.render(path='中国疫情地图.html')看看rendering:heatmap让我们重新绘制热图。我们还是取国内各个省的确诊数据。实现代码如下:url='https://lab.isaaclin.cn/nCoV/api/area'data=requests.get(url).json()cities_data=[]foritemindata['results']:ifitem['countryName']=='China':ifitem['cities']不是None:cities_data.extend(item['cities'])hot_geo=(Geo(init_opts=opts.InitOpts(theme='dark')).add_schema(maptype='china').add('累计数确诊病例数',[(i['cityName'],i['currentConfirmedCount'])foriincities_dataifi['cityName']inpyecharts.datasets.COORDINATES.keys()],type_='heatmap').set_global_opts(title_opts=opts.TitleOpts(title='中国疫情热图',pos_left='left'),legend_opts=opts.LegendOpts(is_show=False),visualmap_opts=opts.VisualMapOpts(is_show=True,is_piecewise=False,range_color=['#0ff','#0f0','#ff0','#f00'])))hot_geo.render(path='中国疫情热图.html')看一下效果图:直方图画列图,这次取一个省份的数据,因为湖北省的确诊病例最多,所以就用这个省份的数据吧,实现代码如下:url='https://lab.isaaclin.cn/nCoV/api/area'data=requests.get(url).json()foritemindata['results']:ifitem['provinceShortName']=='Hubei':hb_data=item['cities']hb_bar=(Bar(init_opts=opts.InitOpts(theme='dark')).add_xaxis([hd['cityName']forhdinhb_data]).add_yaxis('累计确认数',[hd['confirmedCount']forhdinhb_data]).add_yaxis('累计治愈数',[hd['curedCount']forhdinhb_data]).reversal_axis().set_series_opts(label_opts=opts.LabelOpts(is_show=False)).set_global_opts(title_opts=opts.TitleOpts(title="湖北新冠疫情诊治情况"),legend_opts=opts.LegendOpts(is_show=True)))hb_bar.render(path='湖北新冠疫情地图.html')看一下效果图:折线图目前以上接口没有提供返回时间序列的数据,但是在GitHub上提供了数据仓库,有两种格式,JSON和CSV。由于GitHub网速不好,试了几次都下载不了数据,直接用微信上显示的数据吧。代码实现如下:x_data=['2-06','2-13','2-20','2-27','3-05','3-12','3-19','3-26','4-02','4-09','4-17']#已有诊断y1_data=[20677,46537,49156,36829,22695,13171,6287,2896,987,351,122]#累计治愈y2_data=[817,4131,11788,26403,41966,51533,58381,61731,63612,64236,63494]line=(Line().add_xaxis(x_data).add_yaxis('现有诊断',y1_data,color='#10aeb5').add_yaxis('累计治愈',y2_data,color='#e83132').set_series_opts(label_opts=opts.LabelOpts(is_show=True)).set_global_opts(title_opts=opts.TitleOpts(title='中国疫情随时间推移')))line.render(path='ChinaEpidemicLineChart.html')效果图看一下:需要源码的可以微信搜索公众号Python小二,后台回复200418自行获取
