參考地址: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()