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 django集成cas验证系统
Jul 14 Python
Python类属性的延迟计算
Oct 22 Python
Python 3中print函数的使用方法总结
Aug 08 Python
Python网络爬虫神器PyQuery的基本使用教程
Feb 03 Python
Python 中的range(),以及列表切片方法
Jul 02 Python
浅析python3中的os.path.dirname(__file__)的使用
Aug 30 Python
Python3.5内置模块之os模块、sys模块、shutil模块用法实例分析
Apr 27 Python
解决python中使用PYQT时中文乱码问题
Jun 17 Python
用python打印1~20的整数实例讲解
Jul 01 Python
使用python实现ftp的文件读写方法
Jul 02 Python
Python读取实时数据流示例
Dec 02 Python
python+adb+monkey实现Rom稳定性测试详解
Apr 23 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
PHILIPS D1835/D1875的电路分析与打理
2021/03/02 无线电
php学习笔记之 函数声明
2011/06/09 PHP
php网站判断用户是否是手机访问的方法
2013/11/01 PHP
php操作redis缓存方法分享
2015/06/03 PHP
PHP操作Postgresql封装类与应用完整实例
2018/04/24 PHP
搭建PhpStorm+PhpStudy开发环境的超详细教程
2020/09/17 PHP
javascript 浏览器检测代码精简版
2010/03/04 Javascript
IE6/7 and IE8/9/10(IE7模式)依次隐藏具有absolute或relative的父元素和子元素后再显示父元素
2011/07/31 Javascript
日历查询的算法 如何计算某一天是星期几
2012/12/12 Javascript
js获取触发事件元素在整个网页中的绝对坐标(示例代码)
2013/12/13 Javascript
nodejs开发微博实例
2015/03/25 NodeJs
jQuery实现鼠标滑过点击事件音效试听
2015/08/31 Javascript
js定时器实例分享
2016/12/20 Javascript
React中ES5与ES6写法的区别总结
2017/04/21 Javascript
原生JS实现N级菜单的代码
2017/05/21 Javascript
jQuery基于cookie实现换肤功能实例
2017/10/14 jQuery
关于 angularJS的一些用法
2017/11/29 Javascript
Vue组件开发技巧总结
2018/03/04 Javascript
jQuery判断自定义属性data-val用法示例
2019/01/07 jQuery
vue里的data要用return返回的原因浅析
2019/05/28 Javascript
Layui弹框中数据表格中可双击选择一条数据的实现
2020/05/06 Javascript
Vue记住滚动条和实现下拉加载的完美方法
2020/07/31 Javascript
jQuery列表动态增加和删除的实现方法
2020/11/05 jQuery
js属性对象的hasOwnProperty方法的使用
2021/02/05 Javascript
Python中让MySQL查询结果返回字典类型的方法
2014/08/22 Python
最小二乘法及其python实现详解
2020/02/24 Python
某公司的.net工程师面试题笔试题
2013/11/22 面试题
js正则匹配markdown里的图片标签的实现
2021/03/24 Javascript
幼教个人求职信范文
2013/12/02 职场文书
面临毕业的毕业生自荐书范文
2014/02/05 职场文书
建议书标准格式
2014/03/12 职场文书
弘扬职业精神演讲稿
2014/03/20 职场文书
本科毕业生自荐信
2014/06/02 职场文书
私营公司诉讼代理委托书范本
2014/09/13 职场文书
2014年六五普法工作总结
2014/11/25 职场文书
签约仪式致辞
2015/07/30 职场文书