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调用新浪微博API项目实践
Jul 28 Python
python的变量与赋值详细分析
Nov 08 Python
Tensorflow 利用tf.contrib.learn建立输入函数的方法
Feb 08 Python
Python迭代器和生成器定义与用法示例
Feb 10 Python
DataFrame中去除指定列为空的行方法
Apr 08 Python
Python之list对应元素求和的方法
Jun 28 Python
python利用tkinter实现屏保
Jul 30 Python
对Django url的几种使用方式详解
Aug 06 Python
Django模板语言 Tags使用详解
Sep 09 Python
python集合常见运算案例解析
Oct 17 Python
python实现的分析并统计nginx日志数据功能示例
Dec 21 Python
ITK 实现多张图像转成单个nii.gz或mha文件案例
Jul 01 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实现分页显示
2015/11/03 PHP
PHP7基于curl实现的上传图片功能
2018/05/11 PHP
php正则表达式使用方法整理集合
2020/01/31 PHP
基于PHP实现邮箱验证激活过程详解
2020/10/28 PHP
基于php解决json_encode中文UNICODE转码问题
2020/11/10 PHP
jscript之Read an Excel Spreadsheet
2007/06/13 Javascript
Javascript生成json的函数代码(可以用php的json_decode解码)
2012/06/11 Javascript
js实现两个值相加alert出来精确到指定位
2013/09/25 Javascript
JavaScript中判断对象类型的几种方法总结
2013/11/11 Javascript
httpclient模拟登陆具体实现(使用js设置cookie)
2013/12/11 Javascript
jQuery聚合函数实例
2015/05/21 Javascript
js正则表达式验证邮件地址
2015/11/12 Javascript
jquery实现简单的表单验证
2015/11/17 Javascript
jquery基础知识第一讲之认识jquery
2016/03/17 Javascript
react-router 路由切换动画的实现示例
2018/12/03 Javascript
后台使用freeMarker和前端使用vue的方法及遇到的问题
2019/06/13 Javascript
js实现for循环跳过undefined值示例
2019/07/02 Javascript
jQuery实现的上拉刷新功能组件示例
2020/05/01 jQuery
[48:11]完美世界DOTA2联赛 Magma vs GXR 第二场 11.07
2020/11/10 DOTA
详解Python3 中hasattr()、getattr()、setattr()、delattr()函数及示例代码数
2018/04/18 Python
Python3爬虫爬取英雄联盟高清桌面壁纸功能示例【基于Scrapy框架】
2018/12/05 Python
opencv python统计及绘制直方图的方法
2019/01/21 Python
对Django项目中的ORM映射与模糊查询的使用详解
2019/07/18 Python
520使用Python实现“我爱你”表白
2020/05/20 Python
Python Selenium模块安装使用教程详解
2020/07/09 Python
python爬虫中url管理器去重操作实例
2020/11/30 Python
利用Opencv实现图片的油画特效实例
2021/02/28 Python
Kneipp克奈圃美国官网:德国百年精油配方的传承
2018/02/07 全球购物
教师演讲稿范文
2014/01/08 职场文书
软件部经理岗位职责范本
2014/02/25 职场文书
检讨书1000字
2014/10/11 职场文书
劳模先进事迹材料
2014/12/24 职场文书
领导视察通讯稿
2015/07/18 职场文书
python-for x in range的用法(注意要点、细节)
2021/05/10 Python
一条 SQL 语句执行过程
2022/03/17 MySQL
Vue Element plus使用方法梳理
2022/12/24 Vue.js