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 threading模块操作多线程介绍
Apr 08 Python
以windows service方式运行Python程序的方法
Jun 03 Python
Python自动化测试ConfigParser模块读写配置文件
Aug 15 Python
使用Python3 编写简单信用卡管理程序
Dec 21 Python
Python模块文件结构代码详解
Feb 03 Python
Python3删除排序数组中重复项的方法分析
Jan 31 Python
Flask框架单例模式实现方法详解
Jul 31 Python
Flask框架模板渲染操作简单示例
Jul 31 Python
分享PyCharm的几个使用技巧
Nov 10 Python
python图形开发GUI库pyqt5的详细使用方法及各控件的属性与方法
Feb 14 Python
python itsdangerous模块的具体使用方法
Feb 17 Python
python同时遍历两个list用法说明
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
造就帕卡马拉的帕卡斯是怎么被发现的
2021/03/03 咖啡文化
WINDOWS服务器安装多套PHP的另类解决方案
2006/10/09 PHP
开启CURL扩展,让服务器支持PHP curl函数(远程采集)
2011/03/19 PHP
浅析php中三个等号(===)和两个等号(==)的区别
2013/08/06 PHP
thinkphp5实现无限级分类
2019/02/18 PHP
ThinkPHP5.1框架页面跳转及修改跳转页面模版示例
2019/05/06 PHP
jQuery源码中的chunker 正则过滤符分析
2012/07/31 Javascript
jquery选择器之层级过滤选择器详解
2014/01/27 Javascript
深入理解JS中的变量及作用域、undefined与null
2014/03/04 Javascript
JavaScript节点及列表操作实例小结
2015/08/05 Javascript
微信小程序 tabs选项卡效果的实现
2017/01/05 Javascript
详解Vue的常用指令v-if, v-for, v-show,v-else, v-bind, v-on
2018/10/12 Javascript
Vue使用zTree插件封装树组件操作示例
2019/04/25 Javascript
angularjs自定义过滤器demo示例
2019/08/24 Javascript
JavaScript实现栈结构Stack过程详解
2020/03/07 Javascript
快速了解Vue父子组件传值以及父调子方法、子调父方法
2020/07/15 Javascript
vue组件开发之tab切换组件使用详解
2020/08/21 Javascript
vue element实现表格合并行数据
2020/11/30 Vue.js
使用Python实现下载网易云音乐的高清MV
2015/03/16 Python
Python获取网段内ping通IP的方法
2019/01/31 Python
python使用Plotly绘图工具绘制柱状图
2019/04/01 Python
pandas DataFrame行或列的删除方法的实现示例
2019/08/02 Python
Tensorflow的常用矩阵生成方式
2020/01/04 Python
pytorch 实现将自己的图片数据处理成可以训练的图片类型
2020/01/08 Python
惠普墨西哥官方商店:HP墨西哥
2016/12/01 全球购物
莱德杯高尔夫欧洲官方商店:Ryder Cup Shop
2019/08/14 全球购物
Goodee官方商店:迷你投影仪
2021/03/15 全球购物
3个CCIE对一个工程师的面试题
2012/05/06 面试题
迟到检讨书800字
2014/01/13 职场文书
咖啡馆创业计划书
2014/01/26 职场文书
学生会个人自荐书范文
2014/02/12 职场文书
奔腾年代观后感
2015/06/09 职场文书
毕业季聚会祝酒词!
2019/07/04 职场文书
辞职报告(范文三篇)
2019/08/27 职场文书
MySQL 全文索引使用指南
2021/05/25 MySQL
td 内容自动换行 table表格td设置宽度后文字太多自动换行
2022/12/24 HTML / CSS