python繪制中國大陸人口熱力圖
這篇文章給出了如何繪制中國人口密度圖,但是運行存在一些問題,我在一些地方進行了修改。
本人使用的IDE是anaconda,因此事先在anaconda prompt 中安裝Basemap包
conda install Basemap
新建文檔,導入需要的包
import matplotlib.pyplot as plt from mpl_toolkits.basemap import Basemap from matplotlib.patches import Polygon from matplotlib.colors import rgb2hex import numpy as np import pandas as pd
Basemap中不包括中國省界,需要在下面網(wǎng)站下載中國省界,點擊Shapefile下載。
生成中國大陸省界圖片。
plt.figure(figsize=(16,8)) m = Basemap( llcrnrlon=77, llcrnrlat=14, urcrnrlon=140, urcrnrlat=51, projection='lcc', lat_1=33, lat_2=45, lon_0=100 ) m.drawcountries(linewidth=1.5) m.drawcoastlines() m.readshapefile('gadm36_CHN_shp/gadm36_CHN_1', 'states', drawbounds=True)
去國家統(tǒng)計局網(wǎng)站下載人口各省,只需保留地區(qū)和總人口即可,保存為csv格式并改名為pop.csv。
讀取數(shù)據(jù),儲存為dataframe格式,刪去地名之中的空格,并設置地名為dataframe的index。
df = pd.read_csv('pop.csv') new_index_list = [] for i in df["地區(qū)"]: i = i.replace(" ","") new_index_list.append(i) new_index = {"region": new_index_list} new_index = pd.DataFrame(new_index) df = pd.concat([df,new_index], axis=1) df = df.drop(["地區(qū)"], axis=1) df.set_index("region", inplace=True)
將Basemap中的地區(qū)與我們下載的csv中的人口數(shù)據(jù)對應起來,建立字典。注意,Basemap中的地名與csv文件中的地名并不完全一樣,需要進行一些處理。
provinces = m.states_info statenames=[] colors = {} cmap = plt.cm.YlOrRd vmax = 100000000 vmin = 3000000 for each_province in provinces: province_name = each_province['NL_NAME_1'] p = province_name.split('|') if len(p) > 1: s = p[1] else: s = p[0] s = s[:2] if s == '黑龍': s = '黑龍江' if s == '內(nèi)蒙': s = '內(nèi)蒙古' statenames.append(s) pop = df['人口數(shù)'][s] colors[s] = cmap(np.sqrt((pop - vmin) / (vmax - vmin)))[:3]
最后畫出圖片即可
ax = plt.gca() for nshape, seg in enumerate(m.states): color = rgb2hex(colors[statenames[nshape]]) poly = Polygon(seg, facecolor=color, edgecolor=color) ax.add_patch(poly) plt.show()
完整代碼如下
# -*- coding: utf-8 -*- import matplotlib.pyplot as plt from mpl_toolkits.basemap import Basemap from matplotlib.patches import Polygon from matplotlib.colors import rgb2hex import numpy as np import pandas as pd plt.figure(figsize=(16,8)) m = Basemap( llcrnrlon=77, llcrnrlat=14, urcrnrlon=140, urcrnrlat=51, projection='lcc', lat_1=33, lat_2=45, lon_0=100 ) m.drawcountries(linewidth=1.5) m.drawcoastlines() m.readshapefile('gadm36_CHN_shp/gadm36_CHN_1', 'states', drawbounds=True) df = pd.read_csv('pop.csv') new_index_list = [] for i in df["地區(qū)"]: i = i.replace(" ","") new_index_list.append(i) new_index = {"region": new_index_list} new_index = pd.DataFrame(new_index) df = pd.concat([df,new_index], axis=1) df = df.drop(["地區(qū)"], axis=1) df.set_index("region", inplace=True) provinces = m.states_info statenames=[] colors = {} cmap = plt.cm.YlOrRd vmax = 100000000 vmin = 3000000 for each_province in provinces: province_name = each_province['NL_NAME_1'] p = province_name.split('|') if len(p) > 1: s = p[1] else: s = p[0] s = s[:2] if s == '黑龍': s = '黑龍江' if s == '內(nèi)蒙': s = '內(nèi)蒙古' statenames.append(s) pop = df['人口數(shù)'][s] colors[s] = cmap(np.sqrt((pop - vmin) / (vmax - vmin)))[:3] ax = plt.gca() for nshape, seg in enumerate(m.states): color = rgb2hex(colors[statenames[nshape]]) poly = Polygon(seg, facecolor=color, edgecolor=color) ax.add_patch(poly) plt.show()
以上就是本文的全部內(nèi)容,希望對大家的學習有所幫助,也希望大家多多支持腳本之家。
相關文章
python在windows調(diào)用svn-pysvn的實現(xiàn)
本文主要介紹了python在windows調(diào)用svn-pysvn的實現(xiàn),文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧2023-02-02python讀寫excel數(shù)據(jù)--pandas詳解
這篇文章主要為大家詳細介紹了python操作EXCEL讀數(shù)據(jù)、寫數(shù)據(jù)的實例源碼,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下2021-09-09Python用requests-html爬取網(wǎng)頁的實現(xiàn)
本文主要介紹了Python用requests-html爬取網(wǎng)頁的實現(xiàn),文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧2022-07-07