新冠疫情已經持續好幾個月了,目前,我國疫情已經基本控制住了,咱們會看到不少網站都提供了多種疫情統計圖,今天咱們使用 Python 的 pyecharts 框架來繪製一些比較常見的統計圖。html
首先,咱們來繪製前段時間比較火的南丁格爾玫瑰圖,數據來源咱們經過接口 https://lab.isaaclin.cn/nCoV/zh
來獲取,咱們取疫情中死亡人數超過 2000 的國家的數據,實現代碼以下:python
url = 'https://lab.isaaclin.cn/nCoV/api/area' data_json = requests.get(url).json() country_list = [] count_list = [] ds = {} for item in data_json['results']: if item['countryEnglishName']: if item['deadCount'] is not None and item['countryName'] is not None: if int(item['deadCount']) > 2000: d = {item['countryName']:item['deadCount']} ds.update(d) ds = dict(sorted(ds.items(), key = lambda k: k[1])) # 名稱有重複的,把國家名做爲 key 吧 country_list = ds.keys() count_list = ds.values() # 隨機顏色生成 def randomcolor(kind): colors = [] for i in range(kind): colArr = ['1', '2', '3', '4', '5', '6', '7', '8', '9', 'A', 'B', 'C', 'D', 'E', 'F'] color = "" for i in range(6): color += colArr[random.randint(0, 14)] colors.append("#" + color) return colors color_series = randomcolor(len(count_list)) # 建立餅圖 pie = Pie(init_opts=opts.InitOpts(width='800px', height='900px')) # 添加數據 pie.add("", [list(z) for z in zip(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='全球新冠疫情',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='Microsoft YaHei')) pie.set_colors(color_series) pie.render('南丁格爾玫瑰圖.html')
看一下效果圖:json
接着咱們來繪製全球疫情地圖,咱們取各個國家的累計死亡人數的數據,代碼實現以下所示:api
url = 'https://lab.isaaclin.cn/nCoV/api/area' data = requests.get(url).json() oversea_confirm = [] for item in data['results']: if item['countryEnglishName']: oversea_confirm.append((item['countryEnglishName'] .replace('United States of America', 'United States') .replace('United Kiongdom', 'United Kingdom'), item['deadCount'])) world_map = ( Map(init_opts=opts.InitOpts(theme='dark')) .add('累計死亡人數', oversea_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')
看一下效果圖:微信
咱們接着繪製我國的疫情地圖,數據取各個省份累計確診人數的數據,代碼實現以下所示:app
url = 'https://lab.isaaclin.cn/nCoV/api/area' data = requests.get(url).json() province_data = [] for item in data['results']: if item['countryName'] == '中國': province_data.append((item['provinceShortName'], item['confirmedCount'])) china_map = ( Map(init_opts=opts.InitOpts(theme='dark')) .add('確診人數', province_data, 'china',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-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"}, ]) ) ) china_map.render(path='中國疫情地圖.html')
看一下效果圖:echarts
咱們再接着來繪製熱力圖,咱們仍是取我國各個省份確診的數據,實現代碼以下所示:框架
url = 'https://lab.isaaclin.cn/nCoV/api/area' data = requests.get(url).json() cities_data = [] for item in data['results']: if item['countryName'] == '中國': if item['cities'] is not None: cities_data.extend(item['cities']) hot_geo = ( Geo(init_opts=opts.InitOpts(theme='dark')) .add_schema(maptype='china') .add('累計確診人數', [(i['cityName'], i['currentConfirmedCount']) for i in cities_data if i['cityName'] in pyecharts.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')
看一下效果圖:dom
咱們接着來繪製柱狀圖,此次咱們取一個省份的數據,由於湖北省確診人數最多,咱們就用這個省的數據吧,實現代碼以下所示:ide
url = 'https://lab.isaaclin.cn/nCoV/api/area' data = requests.get(url).json() for item in data['results']: if item['provinceShortName'] == '湖北': hb_data = item['cities'] hb_bar = ( Bar(init_opts=opts.InitOpts(theme='dark')) .add_xaxis([hd['cityName'] for hd in hb_data]) .add_yaxis('累計確診人數', [hd['confirmedCount'] for hd in hb_data]) .add_yaxis('累計治癒人數', [hd['curedCount'] for hd in hb_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='中國疫情折線圖.html')
看一下效果圖:
若是須要源碼,能夠微信搜索公衆號 Python小二,後臺回覆 200418 自行領取。