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代码检查工具pylint 让你的python更规范
Sep 05 Python
Web服务器框架 Tornado简介
Jul 16 Python
Python的Bottle框架的一些使用技巧介绍
Apr 08 Python
Windows下Anaconda的安装和简单使用方法
Jan 04 Python
numpy使用技巧之数组过滤实例代码
Feb 03 Python
idea创建springMVC框架和配置小文件的教程图解
Sep 18 Python
Python 多线程不加锁分块读取文件的方法
Dec 11 Python
python解析含有重复key的json方法
Jan 22 Python
python 将字符串完成特定的向右移动方法
Jun 11 Python
python爬虫selenium和phantomJs使用方法解析
Aug 08 Python
django 多对多表的创建和插入代码实现
Sep 09 Python
django haystack实现全文检索的示例代码
Jun 24 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常用正则表达式集锦
2014/08/17 PHP
ThinkPHP文件缓存类代码分享
2015/04/22 PHP
php实现分页显示
2015/11/03 PHP
PHP之十六个魔术方法详细介绍
2016/11/01 PHP
IE不出现Flash激活框的小发现的js实现方法
2007/09/07 Javascript
基于jquery的模态div层弹出效果
2010/08/21 Javascript
jQuery数组处理方法汇总
2011/06/20 Javascript
jquery中ajax学习笔记一
2011/10/16 Javascript
5分钟理解JavaScript中this用法分享
2013/11/09 Javascript
jQuery删除节点的三个方法即remove()detach()和empty()
2013/12/27 Javascript
分享一则javascript 调试技巧
2015/01/02 Javascript
DOM基础教程之事件对象
2015/01/20 Javascript
JS中用try catch对代码运行的性能影响分析
2016/12/26 Javascript
Vuejs 用$emit与$on来进行兄弟组件之间的数据传输通信
2017/02/23 Javascript
微信小程序仿RadioGroup改变样式的处理方案
2018/07/13 Javascript
Element-UI中Upload上传文件前端缓存处理示例
2019/02/21 Javascript
vue webpack重写cookie路径的方法
2019/07/10 Javascript
使用Vant完成Dialog弹框案例
2020/11/11 Javascript
[00:59]DOTA2背景故事第二期之四大基本法则
2020/07/07 DOTA
python实现socket客户端和服务端简单示例
2014/02/24 Python
Python中循环引用(import)失败的解决方法
2018/04/22 Python
Python读取Pickle文件信息并计算与当前时间间隔的方法分析
2019/01/30 Python
Python 根据数据模板创建shapefile的实现
2019/11/26 Python
Python 基于wxpy库实现微信添加好友功能(简洁)
2019/11/29 Python
Django中ORM找出内容不为空的数据实例
2020/05/20 Python
Python使用paramiko连接远程服务器执行Shell命令的实现
2021/03/04 Python
今天学到的CSS最新技术(与图片背景相关)
2012/12/24 HTML / CSS
二手房购房意向书范本
2014/04/01 职场文书
幼儿园中班区域活动总结
2014/07/09 职场文书
局领导领导班子四风对照检查材料
2014/09/27 职场文书
电影焦裕禄观后感
2015/06/09 职场文书
为什么说餐饮很难做,是因为你不了解这些新规则
2019/08/20 职场文书
送给自己的励志语句:要安静的优秀,悄无声息的坚强
2019/11/26 职场文书
Python中的min及返回最小值索引的操作
2021/05/10 Python
MybatisPlus EntityWrapper如何自定义SQL
2022/03/22 Java/Android
Pyhton爬虫知识之正则表达式详解
2022/04/01 Python