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和shell变量互相传递的几种方法
Nov 20 Python
Python运算符重载用法实例分析
Jun 01 Python
以windows service方式运行Python程序的方法
Jun 03 Python
Python模拟登录验证码(代码简单)
Feb 06 Python
《Python学习手册》学习总结
Jan 17 Python
Python使用progressbar模块实现的显示进度条功能
May 31 Python
pyinstaller打包多个py文件和去除cmd黑框的方法
Jun 21 Python
Python xlrd模块导入过程及常用操作
Jun 10 Python
python用tkinter实现一个简易能进行随机点名的界面
Sep 27 Python
Python tempfile模块生成临时文件和临时目录
Sep 30 Python
解决tensorflow模型压缩的问题_踩坑无数,总算搞定
Mar 02 Python
django学习之ajax post传参的2种格式实例
May 14 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
PHP运行出现Notice : Use of undefined constant 的完美解决方案分享
2012/03/05 PHP
php中函数前加&符号的作用分解
2014/07/08 PHP
调试WordPress中定时任务的相关PHP脚本示例
2015/12/10 PHP
PHP版微信小店接口开发实例
2016/11/12 PHP
PHP设计模式之原型模式定义与用法详解
2018/04/03 PHP
TP - 比RBAC更好的权限认证方式(Auth类认证)
2021/03/09 PHP
13 个JavaScript 性能提升技巧分享
2012/07/26 Javascript
js arguments对象应用介绍
2012/11/28 Javascript
Jquery对数组的操作技巧整理
2014/03/25 Javascript
JS下载文件|无刷新下载文件示例代码
2014/04/17 Javascript
jquery+css3打造一款ajax分页插件(自写)
2014/06/18 Javascript
跟我学习javascript的严格模式
2015/11/16 Javascript
JavaScript创建对象的方式小结(4种方式)
2015/12/17 Javascript
jquery ui dialog替代confirm实例分析
2016/01/25 Javascript
javascript 动态样式添加的简单实现
2016/10/11 Javascript
Angularjs手动解析表达式($parse)
2016/10/12 Javascript
jQuery监听文件上传实现进度条效果的方法
2016/10/16 Javascript
Vue实战之vue登录验证的实现代码
2017/10/31 Javascript
webpack+vue-cil中proxyTable处理跨域的方法
2018/07/20 Javascript
vue cli3.0结合echarts3.0与地图的使用方法示例
2019/03/26 Javascript
解决layui中onchange失效以及form动态渲染失效的问题
2019/09/27 Javascript
vue中实现图片压缩 file文件的方法
2020/05/28 Javascript
Python获取当前页面内所有链接的四种方法对比分析
2017/08/19 Python
Python针对给定字符串求解所有子序列是否为回文序列的方法
2018/04/21 Python
为什么从Python 3.6开始字典有序并效率更高
2019/07/15 Python
Python实现列表中非负数保留,负数转化为指定的数值方式
2020/06/04 Python
Pycharm中配置远程Docker运行环境的教程图解
2020/06/11 Python
基于python实现MQTT发布订阅过程原理解析
2020/07/27 Python
eBay比利时购物网站:eBay.be
2019/08/09 全球购物
人力资源主管岗位职责
2014/01/29 职场文书
医科大学毕业生自荐信
2014/02/03 职场文书
保安部任务及岗位职责
2014/02/25 职场文书
英语课前三分钟演讲稿(6篇)
2014/09/13 职场文书
2015年大班保育员工作总结
2015/05/18 职场文书
肖申克的救赎观后感
2015/06/02 职场文书
SpringBoot集成Druid连接池连接MySQL8.0.11
2021/07/02 Java/Android