• <noscript id="e0iig"><kbd id="e0iig"></kbd></noscript>
  • <td id="e0iig"></td>
  • <option id="e0iig"></option>
  • <noscript id="e0iig"><source id="e0iig"></source></noscript>
  • 4-中國疫情示意圖

    上篇是使用pyecharts繪制的中國疫情圖,今天采用大家都熟知的常用工具matplotlib工具來專心繪制此圖。到時候中國戰’疫’結束后,再來此博客查看,表達喜悅。

    肯定會有那么一天,并且已經不會太久!!

    導包

    import time
    import json
    import requests
    from datetime import datetime
    import numpy as np
    import matplotlib
    import matplotlib.figure
    from matplotlib.font_manager import FontProperties
    from matplotlib.backends.backend_agg import FigureCanvasAgg
    from matplotlib.patches import Polygon
    from matplotlib.collections import PatchCollection
    from mpl_toolkits.basemap import Basemap
    import matplotlib.pyplot as plt
    import matplotlib.dates as mdates
    
    plt.rcParams['font.sans-serif'] = ['FangSong']  # 設置默認字體
    plt.rcParams['axes.unicode_minus'] = False  # 解決保存圖像時'-'顯示為方塊的問題
    
    def catch_daily():
        """抓取每日確診和死亡數據"""
        
        url = 'https://view.inews.qq.com/g2/getOnsInfo?name=wuwei_ww_cn_day_counts&callback=&_=%d'%int(time.time()*1000)
        data = json.loads(requests.get(url=url).json()['data'])
        data.sort(key=lambda x:x['date'])
        
        date_list = list() # 日期
        confirm_list = list() # 確診
        suspect_list = list() # 疑似
        dead_list = list() # 死亡
        heal_list = list() # 治愈
        for item in data:
            month, day = item['date'].split('/')
            date_list.append(datetime.strptime('2020-%s-%s'%(month, day), '%Y-%m-%d'))
            confirm_list.append(int(item['confirm']))
            suspect_list.append(int(item['suspect']))
            dead_list.append(int(item['dead']))
            heal_list.append(int(item['heal']))
        
        return date_list, confirm_list, suspect_list, dead_list, heal_list
    
    def catch_distribution():
        """抓取行政區域確診分布數據"""
        
        data = {}
        url = 'https://view.inews.qq.com/g2/getOnsInfo?name=disease_h5&callback=&_=%d'%int(time.time()*1000)
        for item in json.loads(requests.get(url=url).json()['data'])['areaTree'][0]['children']:
            if item['name'] not in data:
                data.update({item['name']:0})
            for city_data in item['children']:
                data[item['name']] += int(city_data['total']['confirm'])
        
        return data
    
    def plot_daily():
        """繪制每日確診和死亡數據"""
        
        date_list, confirm_list, suspect_list, dead_list, heal_list = catch_daily() # 獲取數據
        
        plt.figure('2019-nCoV疫情統計圖表', facecolor='#f4f4f4', figsize=(10, 8))
        plt.title('2019-nCoV疫情曲線', fontsize=20)
        
        plt.plot(date_list, confirm_list, label='確診')
        plt.plot(date_list, suspect_list, label='疑似')
        plt.plot(date_list, dead_list, label='死亡')
        plt.plot(date_list, heal_list, label='治愈')
        
        plt.gca().xaxis.set_major_formatter(mdates.DateFormatter('%m-%d')) # 格式化時間軸標注
        plt.gcf().autofmt_xdate() # 優化標注(自動傾斜)
        plt.grid(linestyle=':') # 顯示網格
        plt.legend(loc='best') # 顯示圖例
        plt.savefig('2019-nCoV疫情曲線.png') # 保存為文件
        #plt.show()
    
    def plot_distribution():
        """繪制行政區域確診分布數據"""
        
        data = catch_distribution()
        
        width = 1600
        height = 800
        rect = [0.1, 0.12, 0.8, 0.8]
        lat_min = 0
        lat_max = 60
        lon_min = 77
        lon_max = 140
        
        '''全球等經緯投影模式使用以下設置,否則使用上面的對應設置
        width = 3000
        height = 1500
        rect = [0, 0, 1, 1]
        lat_min = -90
        lat_max = 90
        lon_min = 0
        lon_max = 360
        '''
        
        handles = [
                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),
    ]
        labels = [ '1-9人', '10-99人', '100-999人', '>1000人']
        
        provincePos = {
            "遼寧省":[121.7,40.9],
            "吉林省":[124.5,43.5],
            "黑龍江省":[125.6,46.5],
            "北京市":[116.0,39.9],
            "天津市":[117.0,38.7],
            "內蒙古自治區":[110.0,41.5],
            "寧夏回族自治區":[105.2,37.0],
            "山西省":[111.0,37.0],
            "河北省":[114.0,37.8],
            "山東省":[116.5,36.0],
            "河南省":[111.8,33.5],
            "陜西省":[107.5,33.5],
            "湖北省":[111.0,30.5],
            "江蘇省":[119.2,32.5],
            "安徽省":[115.5,31.8],
            "上海市":[121.0,31.0],
            "湖南省":[110.3,27.0],
            "江西省":[114.0,27.0],
            "浙江省":[118.8,28.5],
            "福建省":[116.2,25.5],
            "廣東省":[113.2,23.1],
            "臺灣省":[120.5,23.5],
            "海南省":[108.0,19.0],
            "廣西壯族自治區":[107.3,23.0],
            "重慶市":[106.5,29.5],
            "云南省":[101.0,24.0],
            "貴州省":[106.0,26.5],
            "四川省":[102.0,30.5],
            "甘肅省":[103.0,35.0],
            "青海省":[95.0,35.0],
            "新疆維吾爾自治區":[85.5,42.5],
            "西藏自治區":[85.0,31.5],
            "香港特別行政區":[115.1,21.2],
            "澳門特別行政區":[112.5,21.2]
        }
        
        fig = matplotlib.figure.Figure()
        fig.set_size_inches(width/100, height/100) # 設置繪圖板尺寸
        axes = fig.add_axes(rect)
        
        # 蘭博托投影模式,局部
    #     m = Basemap(projection='lcc', llcrnrlon=77, llcrnrlat=14, urcrnrlon=140, urcrnrlat=51, lat_1=33, lat_2=45, lon_0=100, ax=axes)
        
        # 蘭博托投影模式,全圖
        #m = Basemap(projection='lcc', llcrnrlon=80, llcrnrlat=0, urcrnrlon=140, urcrnrlat=51, lat_1=33, lat_2=45, lon_0=100, ax=axes)
        
        # 圓柱投影模式,局部
        #m = Basemap(llcrnrlon=lon_min, urcrnrlon=lon_max, llcrnrlat=lat_min, urcrnrlat=lat_max, resolution='l', ax=axes)
        
        # 正射投影模式
    #     m = Basemap(projection='ortho', lat_0=36, lon_0=102, resolution='l', ax=axes)
    	
    	# 全球等經緯投影模式,
        m = Basemap(llcrnrlon=lon_min, urcrnrlon=lon_max, llcrnrlat=lat_min, urcrnrlat=lat_max, resolution='l', ax=axes)
        m.etopo()
        
        m.readshapefile('./china-shapefiles-master/china-shapefiles-master/china', 'province', drawbounds=True)
        m.readshapefile('./china-shapefiles-master/china-shapefiles-master/china_nine_dotted_line', 'section', drawbounds=True)
        m.drawcoastlines(color='black') # 洲際線
        m.drawcountries(color='black')  # 國界線
        m.drawparallels(np.arange(lat_min,lat_max,10), labels=[1,0,0,0]) #畫經度線
        m.drawmeridians(np.arange(lon_min,lon_max,10), labels=[0,0,0,1]) #畫緯度線
        
        pset = set()
        for info, shape in zip(m.province_info, m.province):
            pname = info['OWNER'].strip('\x00')
            fcname = info['FCNAME'].strip('\x00')
            if pname != fcname: # 不繪制海島
                continue
            
            for key in data.keys():
                if key in pname:
                    if data[key] == 0:
                        color = '#f0f0f0'
                    elif data[key] < 10:
                        color = '#ffaa85'
                    elif data[key] <100:
                        color = '#ff7b69'
                    elif  data[key] < 1000:
                        color = '#bf2121'
                    else:
                        color = '#7f1818'
                    break
            
            poly = Polygon(shape, facecolor=color, edgecolor=color)
            axes.add_patch(poly)
            
            pos = provincePos[pname]
            text = pname.replace("自治區", "").replace("特別行政區", "").replace("壯族", "").replace("維吾爾", "").replace("回族", "").replace("省", "").replace("市", "")
            if text not in pset:
                x,  y = m(pos[0], pos[1])
                axes.text(x,  y, text, fontsize=11, color='#00FFFF')
                pset.add(text)
        
        axes.legend(handles, labels, bbox_to_anchor=(0.5, -0.11), loc='lower center', ncol=4, prop=font_14)
        axes.set_title("2019-nCoV疫情地圖", fontsize=14)
        FigureCanvasAgg(fig)
        fig.savefig('2019-nCoV疫情地圖2.png')
    
    if __name__ == '__main__':
        plot_distribution()
    

    最終繪制圖例如下:
    在這里插入圖片描述
    在這里插入圖片描述
    在這里插入圖片描述

    在這里插入圖片描述

    中國加油,武漢加油!!!

    版權聲明:本文為qq_42166308原創文章,遵循 CC 4.0 BY-SA 版權協議,轉載請附上原文出處鏈接和本聲明。
    本文鏈接:https://blog.csdn.net/qq_42166308/article/details/104315327

    智能推薦

    css 行高示意圖

    當設置了font-size時,設置行高會有誤差,解決方案:...

    Matplotlib繪制機器學習中的判別分析示意圖

    判別分析簡介 判別分析就是依據訓練樣本建立判別函數,借助判別函數對給定的新樣本數據做出類別歸屬的分類預測方法,是機器學習中的分類預測方法。 同樣,我們會通過判別函數對給定的一組新樣本做出分類歸屬的決策。 因此,將分類歸屬結果以可視化形式進行展示就顯得特別有意義,很重要哇。 Matplotlib編程實現 成品圖...

    文獻插圖:在Unity中畫出360°全景視頻觀看示意圖

    文獻插圖:在Unity中畫出全景視頻觀看示意圖 插圖說明 實現思路 操作步驟 創建場景 相機視錐體可視化 設置圖像顯示層級 實現效果 工程下載 插圖說明 在論文中需要畫出插圖,以說明全景視頻在觀看時的示意圖,類似于如下效果: 實現思路 創建兩個Sphere,設置其中一個球顯示效果為“透視”,另一個為“不透視”。“透視”球顯示全...

    Python基礎03-對象的內存示意圖

    前面我們了解了對象的基本組成,對"對象"有了一定的了解后,我們再深入探討------對象的內存 ################################################################################# 我們還是以昨天的例子為例: 定義兩個變量,一個變量名為a,一個變量名為b。 那么a和b的作用是不是也存放在了對象的里面呢...

    GMT繪制研究區示意圖(圖中圖)

    . . 數語記吾學,以備不時之需,若遇同仁愿得賜教。 . . GMT繪制青藏高原某湖泊 ,GMT中文手冊104頁已有詳細介紹,僅做部分修改。 inset begin 定義了小圖的位置位于大圖左下角(-DjBL),小圖區域的寬度為 3 厘米,高度為 3.6 厘米(+w3c/3.6c),并且相對大圖左下角偏移 0.1 厘米(+o0.1c)。同時還設置了小圖區域的背景色為白色(+gwhite),并繪制了...

    猜你喜歡

    HTML中常用操作關于:頁面跳轉,空格

    1.頁面跳轉 2.空格的代替符...

    freemarker + ItextRender 根據模板生成PDF文件

    1. 制作模板 2. 獲取模板,并將所獲取的數據加載生成html文件 2. 生成PDF文件 其中由兩個地方需要注意,都是關于獲取文件路徑的問題,由于項目部署的時候是打包成jar包形式,所以在開發過程中時直接安照傳統的獲取方法沒有一點文件,但是當打包后部署,總是出錯。于是參考網上文章,先將文件讀出來到項目的臨時目錄下,然后再按正常方式加載該臨時文件; 還有一個問題至今沒有解決,就是關于生成PDF文件...

    電腦空間不夠了?教你一個小秒招快速清理 Docker 占用的磁盤空間!

    Docker 很占用空間,每當我們運行容器、拉取鏡像、部署應用、構建自己的鏡像時,我們的磁盤空間會被大量占用。 如果你也被這個問題所困擾,咱們就一起看一下 Docker 是如何使用磁盤空間的,以及如何回收。 docker 占用的空間可以通過下面的命令查看: TYPE 列出了docker 使用磁盤的 4 種類型: Images:所有鏡像占用的空間,包括拉取下來的鏡像,和本地構建的。 Con...

    requests實現全自動PPT模板

    http://www.1ppt.com/moban/ 可以免費的下載PPT模板,當然如果要人工一個個下,還是挺麻煩的,我們可以利用requests輕松下載 訪問這個主頁,我們可以看到下面的樣式 點每一個PPT模板的圖片,我們可以進入到詳細的信息頁面,翻到下面,我們可以看到對應的下載地址 點擊這個下載的按鈕,我們便可以下載對應的PPT壓縮包 那我們就開始做吧 首先,查看網頁的源代碼,我們可以看到每一...

    精品国产乱码久久久久久蜜桃不卡