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实现的系统实用log类实例
Jun 30 Python
使用Python绘制图表大全总结
Feb 11 Python
Python面向对象程序设计之继承与多继承用法分析
Jul 13 Python
python中cPickle类使用方法详解
Aug 27 Python
Python3中lambda表达式与函数式编程讲解
Jan 14 Python
python抓取需要扫微信登陆页面
Apr 29 Python
python pickle存储、读取大数据量列表、字典数据的方法
Jul 07 Python
Python 一键获取百度网盘提取码的方法
Aug 01 Python
Python lxml模块的基本使用方法分析
Dec 21 Python
Python综合应用名片管理系统案例详解
Jan 03 Python
Python过滤序列元素的方法
Jul 31 Python
利用Python实现Json序列化库的方法步骤
Sep 09 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
深入探讨:Nginx 502 Bad Gateway错误的解决方法
2013/06/03 PHP
Laravel 修改验证异常的响应格式实例代码详解
2020/05/25 PHP
ExtJs 表单提交登陆实现代码
2010/08/19 Javascript
Summernote实现图片上传功能的简单方法
2016/07/11 Javascript
超实用的javascript时间处理总结
2016/08/16 Javascript
AngularJS监听路由的变化示例代码
2016/09/23 Javascript
使用BootStrap实现悬浮窗口的效果
2016/12/13 Javascript
bootstrap table表格客户端分页实例
2017/08/07 Javascript
使用mint-ui实现省市区三级联动效果的示例代码
2018/02/09 Javascript
vue实现裁切图片同时实现放大、缩小、旋转功能
2018/03/02 Javascript
jQuery实现带3D切割效果的轮播图功能示例【附源码下载】
2019/04/04 jQuery
微信小程序停止其他视频播放当前视频的实例代码
2019/12/25 Javascript
JS中箭头函数与this的写法和理解
2021/01/14 Javascript
javascript代码实现简易计算器
2021/01/25 Javascript
Pthon批量处理将pdb文件生成dssp文件
2015/06/21 Python
Python访问纯真IP数据库脚本分享
2015/06/29 Python
python中使用xlrd读excel使用xlwt写excel的实例代码
2018/01/31 Python
Python回文字符串及回文数字判定功能示例
2018/03/20 Python
python图片验证码识别最新模块muggle_ocr的示例代码
2020/07/03 Python
阻止移动设备(手机、pad)浏览器双击放大网页的方法
2014/06/03 HTML / CSS
复古斯堪的纳维亚儿童服装:Baby go Retro
2017/09/09 全球购物
New Balance天猫官方旗舰店:始于1906年,百年慢跑品牌
2017/11/15 全球购物
EMU Australia澳大利亚官网:澳大利亚本土雪地靴品牌
2019/07/24 全球购物
客服实习的个人自我鉴定
2013/10/20 职场文书
家长会学生家长演讲稿
2013/12/29 职场文书
校园学雷锋活动月总结
2014/03/09 职场文书
公司授权委托书格式范文
2014/10/02 职场文书
乡镇党的群众路线教育实践活动个人整改方案
2014/10/31 职场文书
财务统计员岗位职责
2015/04/14 职场文书
乡镇安全生产月活动总结
2015/05/08 职场文书
2016年元旦主持词
2015/07/06 职场文书
2015秋季运动会通讯稿
2015/07/18 职场文书
我对PyTorch dataloader里的shuffle=True的理解
2021/05/20 Python
解析原生JS getComputedStyle
2021/05/25 Javascript
详解Vue slot插槽
2021/11/20 Vue.js
Pandas数据结构之Series的使用
2022/03/31 Python