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中不包括中國省界,需要在下面網站下載中國省界,點擊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)計局網站下載人口各省,只需保留地區(qū)和總人口即可,保存為csv格式并改名為pop.csv。

讀取數(shù)據,儲存為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ù)據對應起來,建立字典。注意,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 == '內蒙':
s = '內蒙古'
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 == '內蒙':
s = '內蒙古'
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()
以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持腳本之家。
相關文章
如何用tempfile庫創(chuàng)建python進程中的臨時文件
這篇文章主要介紹了如何用tempfile庫創(chuàng)建python進程中的臨時文件,幫助大家更好的理解和使用python,感興趣的朋友可以了解下2021-01-01
使用Python爬蟲庫requests發(fā)送表單數(shù)據和JSON數(shù)據
今天再為大家介紹下使用Python爬蟲庫requests發(fā)送表單數(shù)據和JSON數(shù)據的方法,這是最基本的使用方法,大家可以參考測試下2020-01-01
python 的 openpyxl模塊 讀取 Excel文件的方法
這篇文章主要介紹了python 的 openpyxl模塊 讀取 Excel文件的方法,非常不錯,具有一定的參考借鑒價值,需要的朋友可以參考下2019-09-09
在Python中使用filter去除列表中值為假及空字符串的例子
今天小編就為大家分享一篇在Python中使用filter去除列表中值為假及空字符串的例子,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2019-11-11
淺談python累加求和+奇偶數(shù)求和_break_continue
這篇文章主要介紹了淺談python累加求和+奇偶數(shù)求和_break_continue,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2020-02-02

