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写日志封装类实例
Jun 28 Python
python连接字符串的方法小结
Jul 13 Python
python中lambda()的用法
Nov 16 Python
python爬虫租房信息在地图上显示的方法
May 13 Python
PyQt5实现简易电子词典
Jun 25 Python
python如何给字典的键对应的值为字典项的字典赋值
Jul 05 Python
python如何将多个PDF进行合并
Aug 13 Python
Python使用Socket实现简单聊天程序
Feb 28 Python
基于Python实现2种反转链表方法代码实例
Jul 06 Python
Python json格式化打印实现过程解析
Jul 21 Python
利用python实时刷新基金估值(摸鱼小工具)
Sep 15 Python
python中出现invalid syntax报错的几种原因分析
Feb 12 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
几行代码轻松搞定jquery实现flash8类似的连接效果
2007/05/03 Javascript
Javascript this指针
2009/07/30 Javascript
jquery1.4 教程二 ajax方法的改进
2010/02/25 Javascript
css transform 3D幻灯片特效实现步骤解读
2013/03/27 Javascript
js对象内部访问this修饰的成员函数示例
2014/04/27 Javascript
Javascript中的getUTCHours()方法使用详解
2015/06/10 Javascript
ajax如何实现页面局部跳转与结果返回
2015/08/24 Javascript
JavaScript编写页面半透明遮罩效果的简单示例
2016/05/09 Javascript
基于css3新属性transform及原生js实现鼠标拖动3d立方体旋转
2016/06/12 Javascript
详谈js中window.location.search的用法和作用
2017/02/13 Javascript
AngularJS动态菜单操作指令
2017/04/25 Javascript
angularjs实现猜大小功能
2017/10/23 Javascript
vue实现点击展开点击收起效果
2018/04/27 Javascript
nodejs中方法和模块用法示例
2018/12/24 NodeJs
vue组件中iview的modal组件爬坑问题之modal的显示与否应该是使用v-show
2019/04/12 Javascript
vue远程加载sfc组件思路详解
2019/12/25 Javascript
Vue通过getAction的finally来最大程度避免影响主数据呈现问题
2020/04/24 Javascript
[36:45]TNC vs VGJ.S 2018国际邀请赛小组赛BO2 第二场 8.18
2018/08/19 DOTA
Python中的anydbm模版和shelve模版使用指南
2015/07/09 Python
python在Windows下安装setuptools(easy_install工具)步骤详解
2016/07/01 Python
python中datetime模块中strftime/strptime函数的使用
2018/07/03 Python
python nmap实现端口扫描器教程
2020/05/28 Python
python的等深分箱实例
2019/11/22 Python
tensorflow多维张量计算实例
2020/02/11 Python
Python3.8安装Pygame教程步骤详解
2020/08/14 Python
Python利用Pillow(PIL)库实现验证码图片的全过程
2020/10/04 Python
HTML5对手机页面长按会粘贴复制禁用的解决方法
2016/07/19 HTML / CSS
在html5的Canvas上绘制椭圆的几种方法总结
2013/01/07 HTML / CSS
Hotels.com中国区:好订网
2016/08/18 全球购物
The Hut英国:英国领先的豪华在线百货商店
2019/07/26 全球购物
亚洲航空公司官方网站:AirAsia
2019/11/25 全球购物
出纳岗位职责
2013/11/09 职场文书
春节晚会主持词
2014/03/24 职场文书
党员公开承诺书和承诺事项
2014/03/25 职场文书
安全生产计划书
2014/05/04 职场文书
男方婚礼答谢词
2015/01/20 职场文书