matplotlib+basemap畫出中國疫情地圖

參考地址:https://mp.weixin.qq.com/s/Mni6ZLGC5jlUzMVpglv6JA               https://www.cnblogs.com/ameile/p/6694982.html

1.首先建立一個字典用來存儲每個省份的疫情狀況,使用不同的顏色標記來區分

2.readshapefile爲讀取下載好的地圖文件,源碼中的原話爲:

For example, if name='counties', self.counties will be a list of x,y vertices for each shape in map projection coordinates and self.counties_info will be a list of dictionaries with shape attributes. 程序中給入的值爲prov,所以map1.prov_info爲地圖信息,map1.prov爲多邊形的座標

from mpl_toolkits.basemap import Basemap
import matplotlib.pyplot as plt
from matplotlib.patches import Polygon
from matplotlib.collections import PatchCollection
from matplotlib.patches import PathPatch
import numpy as np


if __name__ == '__main__':
    info_dic = {}
    provinces = ['湖北','廣東','浙江','河南','湖南','安徽','江西','江蘇','重慶','山東','四川','北京','黑龍江','上海','福建','河北','陝西','廣西','雲南','海南','山西','貴州','遼寧','天津','甘肅','吉林','內蒙古','新疆','寧夏','香港','青海','臺灣','澳門','西藏']
    nums =[29631,1151,1092,1073,879,830,771,492,468,466,405,337,331,299,261,218,213,210,141,136,119,109,107,94,83,80,58,49,49,36,18,18,10,1]
    colors = ['darkred','firebrick','indianred','lightcoral','lightsalmon']
    for i in range(len(provinces)):
        info_dic[provinces[i]] = str(nums[i])

    for name in info_dic.keys():
        # print(name)
        if int(info_dic[name])>=10000:
            info_dic[name]= 'darkred'
        elif 1000<int(info_dic[name])<9999:
            info_dic[name]= 'firebrick'
        elif 100<int(info_dic[name])<999:
            info_dic[name]= 'indianred'
        elif 10<int(info_dic[name])<99:
            info_dic[name]='lightcoral'
        else:
            info_dic[name]='lightsalmon'



    map1 =  Basemap(projection='lcc', width=7000000,height=5000000,
                       lat_0=35, lon_0=105)
    plt.figure(figsize=(12,9))
    map1.drawmapboundary(fill_color='aqua')
    map1.fillcontinents(color='#ddaa66',lake_color='aqua')
    map1.drawcoastlines()
    map1.readshapefile(r'map\gadm36_CHN_1', 'prov')
    #print(map1.prov_info)
    #print(map1.prov)  #列表
    #map1.readshapefile(r'f:\data\gadm36_TWN_shp\gadm36_TWN_0', 'taiwan') # 臺灣地圖要單獨添加

    #print(list(zip(map1.prov_info, map1.prov)))

    ax = plt.gca()  #  獲取當前子圖
    for name in provinces:
        patch = []
        if name != '臺灣':
            for info, shape in zip(map1.prov_info, map1.prov):  # 將每個省的地圖信息與座標合併成元組
                if name in info['NL_NAME_1']:  # map1.prov_info 中'NL_NAME_1': '遼寧|遼寧',
                    patch.append( Polygon(np.array(shape), closed=True))  #  將多邊形頂點連接繪製多邊形
            ax.add_collection(PatchCollection(patch, facecolor=info_dic[name],edgecolor='k', linewidths=1., zorder=2))

        # else:
        #     for info, shape in zip(map1.taiwan_info, map1.taiwan):
        #         if info['NAME_0'] == "Taiwan":
        #             patch.append( Polygon(np.array(shape), closed=True) )
        #     ax.add_collection(PatchCollection(patch, facecolor=info_dic['臺灣']['color'], edgecolor='k', linewidths=1., zorder=2))



    plt.show()

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章