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异常学习笔记
Feb 03 Python
Python中在脚本中引用其他文件函数的实现方法
Jun 23 Python
Python 实现链表实例代码
Apr 07 Python
python读取二进制mnist实例详解
May 31 Python
Python实现识别手写数字大纲
Jan 29 Python
python抓取文件夹的所有文件
Feb 27 Python
Python从单元素字典中获取key和value的实例
Dec 31 Python
anaconda如何查看并管理python环境
Jul 05 Python
python内存监控工具memory_profiler和guppy的用法详解
Jul 29 Python
TensorFlow内存管理bfc算法实例
Feb 03 Python
python 获取剪切板内容的两种方法
Nov 28 Python
python和Appium的移动端多设备自动化测试框架
Apr 26 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
德劲1107的电路分析与打磨
2021/03/02 无线电
PHP 的几个配置文件函数
2006/12/21 PHP
ThinkPHP框架安全实现分析
2016/03/14 PHP
Laravel框架实现调用百度翻译API功能示例
2019/05/30 PHP
用javascript父窗口控制只弹出一个子窗口
2007/04/10 Javascript
Javascript & DHTML 实例编程(教程)(三)初级实例篇1—上传文件控件实例
2007/06/02 Javascript
javascript数组的使用
2013/03/28 Javascript
checkbox设置复选框的只读效果不让用户勾选
2013/08/12 Javascript
jtable列中自定义button示例代码
2013/11/21 Javascript
整理Javascript流程控制语句学习笔记
2015/11/29 Javascript
js 求时间差的实现代码
2016/04/26 Javascript
bootstrap日历插件datetimepicker使用方法
2016/12/14 Javascript
js实现漫天星星效果
2017/01/19 Javascript
基于JavaScript实现复选框的全选和取消全选
2017/02/09 Javascript
微信小程序 合法域名校验出错详解及解决办法
2017/03/09 Javascript
vue实现导航栏效果(选中状态刷新不消失)
2017/12/13 Javascript
JS变量提升及函数提升实例解析
2020/09/03 Javascript
[02:44]DOTA2英雄基础教程 魅惑魔女
2014/01/07 DOTA
Python HTTP客户端自定义Cookie实现实例
2017/04/28 Python
django的auth认证,authenticate和装饰器功能详解
2019/07/25 Python
python3获取url文件大小示例代码
2019/09/18 Python
Python全栈之列表数据类型详解
2019/10/01 Python
python实现单目标、多目标、多尺度、自定义特征的KCF跟踪算法(实例代码)
2020/01/08 Python
python自动化unittest yaml使用过程解析
2020/02/03 Python
python3中使用__slots__限定实例属性操作分析
2020/02/14 Python
Pycharm中import torch报错的快速解决方法
2020/03/05 Python
利用Python实现朋友圈中的九宫格图片效果
2020/09/03 Python
JD Sports法国:英国篮球和运动时尚的领导者
2017/09/28 全球购物
英语老师推荐信
2014/02/26 职场文书
雷锋电影观后感
2015/06/10 职场文书
工作态度怎么写
2015/06/25 职场文书
创业不要错过,这4种餐饮新模式
2019/07/18 职场文书
解决Golang中goroutine执行速度的问题
2021/05/02 Golang
解决numpy和torch数据类型转化的问题
2021/05/23 Python
浅谈Web Storage API的使用
2021/06/23 Javascript
mysql聚集索引、辅助索引、覆盖索引、联合索引的使用
2022/02/12 MySQL