python绘制中国大陆人口热力图


Posted in Python onNovember 07, 2018

这篇文章给出了如何绘制中国人口密度图,但是运行存在一些问题,我在一些地方进行了修改。

本人使用的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)

去国家统计局网站下载人口各省,只需保留地区和总人口即可,保存为csv格式并改名为pop.csv。

python绘制中国大陆人口热力图

读取数据,储存为dataframe格式,删去地名之中的空格,并设置地名为dataframe的index。

df = pd.read_csv('pop.csv')
new_index_list = []
for i in df["地区"]:
 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(["地区"], axis=1)
df.set_index("region", inplace=True)

将Basemap中的地区与我们下载的csv中的人口数据对应起来,建立字典。注意,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['人口数'][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["地区"]:
 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(["地区"], 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['人口数'][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()

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Python 相关文章推荐
Python中asyncore的用法实例
Sep 29 Python
详解Python的迭代器、生成器以及相关的itertools包
Apr 02 Python
通过Python使用saltstack生成服务器资产清单
Mar 01 Python
老生常谈Python startswith()函数与endswith函数
Sep 08 Python
Python优先队列实现方法示例
Sep 21 Python
Python实现删除时保留特定文件夹和文件的示例
Apr 27 Python
Python实现繁体中文与简体中文相互转换的方法示例
Dec 18 Python
python的常见矩阵运算(小结)
Aug 07 Python
python3.7 openpyxl 删除指定一列或者一行的代码
Oct 08 Python
Tensorflow卷积实现原理+手写python代码实现卷积教程
May 22 Python
Python socket服务常用操作代码实例
Jun 22 Python
Python Socket多线程并发原理及实现
Dec 11 Python
利用Python将数值型特征进行离散化操作的方法
Nov 06 #Python
python3 爬取图片的实例代码
Nov 06 #Python
修改默认的pip版本为对应python2.7的方法
Nov 06 #Python
使用python根据端口号关闭进程的方法
Nov 06 #Python
python3 打开外部程序及关闭的示例
Nov 06 #Python
对pandas的层次索引与取值的新方法详解
Nov 06 #Python
浅谈pandas用groupby后对层级索引levels的处理方法
Nov 06 #Python
You might like
thinkphp数据查询和遍历数组实例
2014/11/28 PHP
[原创]smarty简单模板变量输出方法
2016/07/09 PHP
PHP实现普通hash分布式算法简单示例
2018/08/06 PHP
PHP实现的62进制转10进制,10进制转62进制函数示例
2019/06/06 PHP
php连接sftp的作用以及实例代码
2019/09/23 PHP
关于JavaScript的gzip静态压缩方法
2007/01/05 Javascript
javascript json 新手入门文档
2009/12/03 Javascript
jquery 新手学习常见问题解决方法
2010/04/18 Javascript
拥抱模块化的JavaScript
2012/03/07 Javascript
JQuery实现的按钮倒计时效果
2015/12/23 Javascript
jQuery弹出窗口打开链接的实现代码
2016/12/24 Javascript
jQuery Validate 数组 全部验证问题
2017/01/12 Javascript
原生js仿浏览器滚动条效果
2017/03/02 Javascript
通过学习bootstrop导航条学会修改bootstrop颜色基调
2017/06/11 Javascript
JS使用百度地图API自动获取地址和经纬度操作示例
2019/04/16 Javascript
Vue路由前后端设计总结
2019/08/06 Javascript
ES6 Object.assign()的用法及其使用
2020/01/18 Javascript
[02:28]DOTA2亚洲邀请赛 LGD战队巡礼
2015/02/03 DOTA
Python 调用DLL操作抄表机
2009/01/12 Python
Python算法之图的遍历
2017/11/16 Python
python用插值法绘制平滑曲线
2021/02/19 Python
浅谈Pandas:Series和DataFrame间的算术元素
2018/12/22 Python
Python利用matplotlib做图中图及次坐标轴的实例
2019/07/08 Python
Python 转换文本编码实现解析
2019/08/27 Python
html5 canvas实现给图片添加平铺水印
2019/08/20 HTML / CSS
正隆泰信息技术有限公司上机题
2012/06/14 面试题
护理专科毕业自荐信范文
2014/04/21 职场文书
软件售后服务承诺书
2014/05/21 职场文书
关于青春的演讲稿800字
2014/08/22 职场文书
汇报材料怎么写
2014/12/30 职场文书
公务员个人年终总结
2015/02/12 职场文书
幽默导游词开场白
2015/05/29 职场文书
师范生小学见习总结
2015/06/23 职场文书
中职班主任培训心得体会
2016/01/07 职场文书
mysql的数据压缩性能对比详情
2021/11/07 MySQL
2007年老电脑安装win11会怎么样? 网友实测win11在老电脑运行良好
2021/11/21 数码科技