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中对列表排序实例
Jan 04 Python
Python基于Pymssql模块实现连接SQL Server数据库的方法详解
Jul 20 Python
opencv python 傅里叶变换的使用
Jul 21 Python
python导入pandas具体步骤方法
Jun 23 Python
Python3批量生成带logo的二维码方法
Jun 24 Python
Python 获取指定文件夹下的目录和文件的实现
Aug 30 Python
Python中list循环遍历删除数据的正确方法
Sep 02 Python
pytorch载入预训练模型后,实现训练指定层
Jan 06 Python
Python中sys模块功能与用法实例详解
Feb 26 Python
Python任务自动化工具tox使用教程
Mar 17 Python
python传到前端的数据,双引号被转义的问题
Apr 03 Python
python如何爬取动态网站
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
PHP5.3.1 不再支持ISAPI
2010/01/08 PHP
Javascript 阻止javascript事件冒泡,获取控件ID值
2009/06/27 Javascript
javascript基础知识大集锦(一) 推荐收藏
2011/01/13 Javascript
jQuery $.data()方法使用注意细节
2012/12/31 Javascript
jQuery prev ~ siblings选择器使用介绍
2013/08/09 Javascript
JS检测输入字符是否包含非法字符的示例代码
2014/02/11 Javascript
JS获取随机数函数可自定义最小值最大值
2014/05/08 Javascript
jQuery通过控制节点实现仅在前台通过get方法完成参数传递
2015/02/02 Javascript
JS+CSS实现自适应选项卡宽度的圆角滑动门效果
2015/09/15 Javascript
JS定义类的六种方式详解
2016/05/12 Javascript
js阻止浏览器默认行为的简单实例
2016/05/15 Javascript
基于jQuery实现页面搜索功能
2020/03/26 Javascript
javascript图片预览和上传(兼容IE)
2017/03/15 Javascript
Vuex实现计数器以及列表展示效果
2018/03/10 Javascript
Javascript中prototype与__proto__的关系详解
2018/03/11 Javascript
jQuery滑动效果实现方法分析
2018/09/05 jQuery
python实现JAVA源代码从ANSI到UTF-8的批量转换方法
2015/08/10 Python
python分布式环境下的限流器的示例
2017/10/26 Python
Python实现多条件筛选目标数据功能【测试可用】
2018/06/13 Python
基于Python实现用户管理系统
2019/02/26 Python
python itchat实现调用微信接口的第三方模块方法
2019/06/11 Python
Python 字符串池化的前提
2020/07/03 Python
马来西亚和新加坡巴士票在线预订:CatchThatBus
2018/11/17 全球购物
意大利比基尼品牌:MISS BIKINI
2019/11/02 全球购物
美国轻奢时尚购物网站:REVOLVE(支持中文)
2020/07/18 全球购物
小学校园活动策划
2014/01/30 职场文书
股权转让协议书
2014/04/12 职场文书
十佳中学生事迹材料
2014/06/02 职场文书
装修施工安全责任书
2014/07/24 职场文书
2014年财务部工作总结
2014/11/11 职场文书
有关三国演义的读书笔记
2015/06/25 职场文书
车辆管理制度范本
2015/08/05 职场文书
2017大学生寒假社会实践心得体会
2016/01/14 职场文书
青年教师听课心得体会
2016/01/15 职场文书
pytorch Dropout过拟合的操作
2021/05/27 Python
vue特效之翻牌动画
2022/04/20 Vue.js