来源:  张京 链接:

https://segmentfault.com/a/1190000010900212

在上一篇文章《用Python画一个中国地图》中,我们简单描述了一下如何用Python快速画出一个中国地图的轮廓,似乎没有什么实用价值,这一次我们用实际数据填充它,使它看上去更有意义。

上色

延续上一次的代码,我们这次还是只增加5行代码:

from matplotlib.patches import Polygon

ax = plt.gca()

for nshape, seg in enumerate(m.states):

poly = Polygon(seg, facecolor='r')

ax.add_patch(poly)

在展示结果之前,稍微解释一下。第2行plt.gca,函数名看上去很诡异,是因为Python里大量使用了缩写,这个gca就是Get Current Axes的缩写,实际上就是要获得当前图形的座标轴。然后我们开始一个循环,把图形文件中各个省的多边形取出来,给它一个颜色,在这里我们统一放上红色,也就是Red的缩写r,然后把这个多边形放在我们图形的座标轴上,然后就得到了下图:

糟糕,怎么能少了台湾呢?在此郑重声明:台湾是中华人民共和国不可分割的领土!加入台湾的Shape文件,然后循环一下:

m.readshapefile('TWN_adm_shp/TWN_adm0', 'taiwan', drawbounds=True)

for nshape, seg in enumerate(m.taiwan):

poly = Polygon(seg, facecolor='r')

ax.add_patch(poly)

好了,这下祖国山河一片红,看上去正确多了。

接下来,你还可以把各个省的名字打出来看一下,具体代码就不解释了:

for shapedict in m.states_info:

statename = shapedict['NL_NAME_1']

p = statename.split('|')

if len(p) > 1:

s = p[1]

else:

s = p[0]

print(s)

for shapedict in m.taiwan_info:

s = shapedict['NAME_CHINE']

print(s)

结果如下:

安徽北京重庆福建福建福建...

数据

接下来我们去国家统计局搞点数据(http://www.stats.gov.cn/tjsj/pcsj/rkpc/6rp/indexce.htm),第六次全国人口普查数据可以直接下载Excel文件,略作修改,导出成csv文件,用我们上一课讲的方法,一句话读取进来:

df = pd.read_csv('chnpop.csv')

直接输出,大概是下面这个样子:

渲染

好了,数据也有了,我们终于要开始做一些激动人心的事情了。我们希望根据各省人口的多少用深浅不同的颜色为各个省份染色,那么首先第一步,我们需要选择一个调色板,也就是色彩映射表colormap,为此,matplotlib为你准备了数不胜数的选择,我们随便选择一款国旗色红黄色调的吧:

cmap = plt.cm.YlOrRd

然后我们把每个省的数据映射到colormap上:

colors[s] = cmap(np.sqrt((pop - vmin) / (vmax - vmin)))[:3]

最后,我们把各个省的颜色描在地图上:

color = rgb2hex(colors[statenames[nshape]])poly = Polygon(seg, facecolor=color, edgecolor=color)

哒哒,我们的全国人口数量热力图就完成了!可以看到河南、四川、广东、山东几个省的颜色比较深,说明这几个省的人口总数最多,而西藏颜色最浅,代表这里的人口总数最少。

这里只是简单地举了一个例子,你还可以把各省的人口总数除以面积,得到人口密度数据,你还可以把各省的经济总量画在图上,总之,有了这个入门的方法,一切就都简单了呢。

最后,附上完整的代码供大家参考。

import matplotlib.pyplot as plt

from mpl_toolkits.basemap import Basemap

from matplotlib.patches import Polygon

from matplotlib.colors import rgb2hex

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('CHN_adm_shp/CHN_adm1', 'states', drawbounds=True)

df = pd.read_csv('chnpop.csv')

df['省名'] = df.地区.str[:2]

df.set_index('省名', inplace=True)

statenames=[]

colors={}

cmap = plt.cm.YlOrRd

vmax = 100000000

vmin = 3000000

for shapedict in m.states_info:

statename = shapedict['NL_NAME_1']

p = statename.split('|')

if len(p) > 1:

s = p[1]

else:

s = p[0]

s = s[:2]

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绘制中国_用Python画中国地图(下)相关推荐

  1. python绘制等值线图_使用python祏rfer绘制等值线图的方式适题。

    登录捍更多精彩内容~ 您应该 登录 才可以下载淮surfer怎么画等值线,没有帐号? x 本帖最簈ianz98 于 2019-6-10 16:26 编辑 几年前用VB搞过surfer自动绘制等值线图. ...

  2. python绘制等值线图_利用Python插值绘制等值线图

    最近需要根据有限的站位点绘制插值等值线图,在网上中文搜索一通,只发现了这货Matplot Basemap 画湖北地图.插值.等值线,要么就是对这货的转载,这货不提供数据的形式,但是基本的代码思路还是不 ...

  3. python绘制糖葫芦_冰糖葫芦怎么画

    冰糖葫芦是一种十分传统的小吃,一说到它,就会勾起无数人甜蜜的童年回忆,那甜甜的糖稀,裹着酸甜的山楂,咬上一口,别提有多好吃了,接下来,小编就来教大家冰糖葫芦怎么画吧. 冰糖葫芦的历史可谓源远流长,相传 ...

  4. python绘制月亮_用 Python 画一个超级月亮

    信息安全公益宣传,信息安全知识启蒙. 教程列表见微信公众号底部菜单 农历腊月十五 凌晨三点的街上 程序员给巡警解释 "同志,您误会了,我不是小偷,我是程序员." 于此同时 程序员错 ...

  5. python绘制月亮_用Python画一个超级月亮

    信息安全公益宣传,信息安全知识启蒙. 教程列表见微信公众号底部菜单 农历腊月十五 凌晨三点的街上 程序员给巡警解释 "同志,您误会了,我不是小偷,我是程序员." 于此同时 程序员错 ...

  6. python绘制月亮_用python画月亮的代码是什么?

    用python画月亮的代码是什么? 用python画月亮的代码是import turtle as t t.screensize(800,600,"#483d8b")#画布尺寸和颜色 ...

  7. 用python绘制图形_使用Python的turtle画炫酷图形

    例子一: import turtle t = turtle.Pen() turtle.bgcolor("black") sides=6 colors=["red" ...

  8. python绘制星空_用python画星空源代码是什么?

    用python画星空源代码是什么? 用python画星空源代码是from turtle import * from random import random,randint screen = Scre ...

  9. python绘制女孩_用Python画小女孩放风筝的示例

    我就废话不多说了,直接上代码吧! # coding:utf-8 2import turtle as t 3import random 4# 画心 5def xin(): 6 def curvemove ...

  10. python绘制月亮_用Python写一个嫦娥奔月,中秋快乐

    原标题:用Python写一个嫦娥奔月,中秋快乐 月是故乡明,每到中秋佳节,很多在外打工的码农因为工作不一定能回家团圆.今时今日不知有多少人为了生计.为了事业.为了理想远走他乡,在一座陌生的城市中寻求一 ...

最新文章

  1. php libdir,PHP扩展小结
  2. dx200手环使用方法_硅胶手环的缺点有哪些?
  3. CodeBlocks的一些用法和常见的问题
  4. postman 400 bad request 原因_盐城400电话
  5. 调用本地电脑摄像头并进行按P进行捕获照片并保存,按下Q退出
  6. VI操作--跳到最后一行和跳到最后一行的最后一个字符
  7. Jmeter设置代理,抓包之app请求
  8. php怎么上传函数,【后端开辟】php上传函数怎样封装
  9. 数据结构之各排序算法
  10. Abseil之Copies, Abbrv
  11. cuBLAS矩阵乘法性能分析(附代码示例)
  12. Ubuntu更新Chrome到最新的版本
  13. 程序员的超强本地构建工具
  14. linux更改网卡缓存,Linux 网卡驱动学习(四)(缓存描述符 Buffer Description)
  15. cad怎么画立体图形教学_立体图形怎么画步骤 找CAD图形中心点的方法步骤图
  16. arduino GPS 经纬度解析(C语言)
  17. 解决Linux内核问题实用技巧之-dev/mem的新玩法
  18. keil软件下载安装与新建工程
  19. Libra,一场赛博朋克噩梦!
  20. 安卓搭建http文件服务器,如何在安卓上搭建http服务器

热门文章

  1. netsetman使用教程_网络管理软件NetSetMan安装教程
  2. logback 配置 日志
  3. c51流水灯实验报告汇编语言,51单片机流水灯实验报告.doc
  4. 人员基础信息一体化采集设备
  5. 刷脸信息采集坚持用户授权最小够用的原则
  6. 若依RuoYi框架修改器
  7. K33 不是平面图_怎么用 PS 做景观平面图?
  8. noip2016海港(超级详细)
  9. Python大佬用20行代码带你打造一个微信聊天机器人(附代码)
  10. 腾讯信鸽海量移动推送服务是如何构建的