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实现基于权重的随机数2种方法
Apr 28 Python
初步解析Python下的多进程编程
Apr 28 Python
python中list常用操作实例详解
Jun 03 Python
Python单体模式的几种常见实现方法详解
Jul 28 Python
详细分析python3的reduce函数
Dec 05 Python
详解Django之auth模块(用户认证)
Apr 17 Python
python筛选出两个文件中重复行的方法
May 31 Python
对pandas中iloc,loc取数据差别及按条件取值的方法详解
Nov 06 Python
通过PYTHON来实现图像分割详解
Jun 26 Python
PyCharm下载和安装详细步骤
Dec 17 Python
Keras构建神经网络踩坑(解决model.predict预测值全为0.0的问题)
Jul 07 Python
matplotlib实现数据实时刷新的示例代码
Jan 05 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 MySQL与分页效率
2008/06/04 PHP
php zip文件解压类代码
2009/12/02 PHP
php 操作excel文件的方法小结
2009/12/31 PHP
PHP下打开URL地址的几种方法小结
2010/05/16 PHP
phpphp图片采集后按原路径保存图片示例
2014/02/18 PHP
PHP处理Json字符串解码返回NULL的解决方法
2014/09/01 PHP
php数组函数array_push()、array_pop()及array_shift()简单用法示例
2020/01/26 PHP
js 操作css实现代码
2009/06/11 Javascript
JavaScript实现的in_array函数
2014/08/27 Javascript
JavaScript实现的简单拖拽效果
2015/06/01 Javascript
关于JS中的apply,call,bind的深入解析
2016/04/05 Javascript
使用jquery提交form表单并自定义action的方法
2016/05/25 Javascript
jQuery的each循环用法简单示例
2016/06/12 Javascript
nodejs redis 发布订阅机制封装实现方法及实例代码
2016/12/15 NodeJs
详解如何提高 webpack 构建 Vue 项目的速度
2017/07/03 Javascript
简单谈谈vue的过渡动画(推荐)
2017/10/11 Javascript
快速搭建React的环境步骤详解
2017/11/06 Javascript
layer.prompt使文本框为空的情况下也能点击确定的方法
2019/09/24 Javascript
[01:18]DOTA2超级联赛专访hanci ForLove淘汰感言曝光
2013/06/04 DOTA
python计算书页码的统计数字问题实例
2014/09/26 Python
python单元测试unittest实例详解
2015/05/11 Python
在Python操作时间和日期之asctime()方法的使用
2015/05/22 Python
pandas Dataframe行列读取的实例
2018/06/08 Python
Django Haystack 全文检索与关键词高亮的实现
2020/02/17 Python
Python实现分数序列求和
2020/02/25 Python
keras的backend 设置 tensorflow,theano操作
2020/06/30 Python
美国隐形眼镜网上商店:Lens.com
2019/09/03 全球购物
美国艺术和工艺品商店:Hobby Lobby
2020/12/09 全球购物
Carmen Sol官网:购买果冻鞋、手袋和配件
2021/01/01 全球购物
大学生毕业求职找工作的自我评价
2013/09/29 职场文书
幼儿园长自我鉴定
2013/10/17 职场文书
体育专业求职信
2014/07/16 职场文书
二人合伙经营协议书
2014/09/13 职场文书
2014个人年度工作总结范文
2014/12/24 职场文书
故意伤害罪辩护词
2015/05/21 职场文书
应届毕业生的自我评价
2019/06/21 职场文书