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 相关文章推荐
PyQt5主窗口动态加载Widget实例代码
Feb 07 Python
教你使用python画一朵花送女朋友
Mar 29 Python
Python实现EXCEL表格的排序功能示例
Jun 25 Python
python字符串替换第一个字符串的方法
Jun 26 Python
用Python配平化学方程式的方法
Jul 20 Python
python hashlib加密实现代码
Oct 17 Python
pytorch torch.expand和torch.repeat的区别详解
Nov 05 Python
多个python文件调用logging模块报错误
Feb 12 Python
Python中的Cookie模块如何使用
Jun 04 Python
Django启动时找不到mysqlclient问题解决方案
Nov 11 Python
pytorch Dataset,DataLoader产生自定义的训练数据案例
Mar 03 Python
Python开发五子棋小游戏
May 02 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许愿墙模块功能分析
2013/06/25 PHP
php中使用Ajax时出现Error(c00ce56e)的详细解决方案
2014/11/03 PHP
PHP数字前补0的自带函数sprintf 和number_format的用法(详解)
2017/02/06 PHP
PHPstorm快捷键(分享)
2017/07/17 PHP
PHP静态延迟绑定和普通静态效率的对比
2017/10/20 PHP
PHP随机数函数rand()与mt_rand()的讲解
2019/03/25 PHP
关于IFRAME 自适应高度的研究
2006/07/20 Javascript
javascript中获取选中对象的类型
2007/04/02 Javascript
jQuery 1.2.x 升? 1.3.x 注意事项
2009/05/06 Javascript
JavaScript 模拟用户单击事件
2009/12/31 Javascript
关于jquery append() html时的小问题的解决方法
2010/12/16 Javascript
jQuery中使用了document和window哪些属性和方法小结
2011/09/13 Javascript
使用jQuery简单实现模拟浏览器搜索功能
2014/12/21 Javascript
Javascript中的getUTCHours()方法使用详解
2015/06/10 Javascript
浅谈js对象的创建和对6种继承模式的理解和遐想
2016/10/16 Javascript
Javascript 实现全屏滚动实例代码
2016/12/31 Javascript
AngularJS中ng-class用法实例分析
2017/07/06 Javascript
webpack2.0配置postcss-loader的方法
2017/08/17 Javascript
jquery animate动画持续运动的实例
2017/11/29 jQuery
如何使用webpack打包一个库library的方法步骤
2019/12/18 Javascript
微信小程序scroll-view隐藏滚动条的方法详解
2020/03/25 Javascript
python实现微信跳一跳辅助工具步骤详解
2018/01/04 Python
Python3.5实现的三级菜单功能示例
2019/03/25 Python
python实现两个经纬度点之间的距离和方位角的方法
2019/07/05 Python
python使用 cx_Oracle 模块进行查询操作示例
2019/11/28 Python
python 获取字典特定值对应的键的实现
2020/09/29 Python
html5实现完美兼容各大浏览器的播放器
2014/12/26 HTML / CSS
用你熟悉的语言写一个连接ORACLE数据库的程序,能够完成修改和查询工作
2012/06/11 面试题
servlet面试题
2012/08/20 面试题
志愿者宣传口号
2014/06/17 职场文书
学校查摆问题整改措施
2014/09/28 职场文书
2014最新实习证明模板
2014/10/02 职场文书
离开雷锋的日子观后感
2015/06/09 职场文书
python设置 matplotlib 正确显示中文的四种方式
2021/05/10 Python
MySQL 用 limit 为什么会影响性能
2021/09/15 MySQL
全新239军机修复记
2022/04/05 无线电