用Python画中国地图(下)

在上一篇文章《用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)

在展示结果之前,稍微解释一下。第2plt.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()

原文发布于微信公众号 - IT派(transfer_3255716726)

原文发表时间:2018-05-19

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏WOLFRAM

Wolfram Alpha:用IPad完成微积分运算

2132
来自专栏大数据文摘

干货 | 男朋友老是说自己R语言很6,快来用这40道题目检测他

1964
来自专栏数说工作室

换个姿势学量化!|【量化小讲堂】使用python计算各类移动平均线

作者:邢不行 原文链接: http://bbs.pinggu.org/thread-3631776-1-1.html (本文已获作者授权转载,如需转载请与原作者...

44411
来自专栏Python入门

python可视化神器——pyecharts库

pyecharts 是一个用于生成 Echarts 图表的类库。Echarts 是百度开源的一个数据可视化 JS 库。用 Echarts 生成的图可视化效果非常...

9295
来自专栏PPV课数据科学社区

【学习】使用hadoop进行大规模数据的全局排序

1. Hellow hadoop~~! Hadoop(某人儿子的一只虚拟大象的名字)是一个复杂到极致,又简单到极致的东西。 说它复杂,是因为一个hadoop...

2963
来自专栏机器之心

资源 | Facebook开源DrQA的PyTorch实现:基于维基百科的问答系统

选自GitHub 机器之心编译 参与:Panda 今年 4 月,斯坦福大学和 Facebook 人工智能研究所在 arXiv 发布了一个基于维基百科的开放域问题...

4415
来自专栏PPV课数据科学社区

用python对汽车油耗进行数据分析

- 从http://fueleconomy.gov/geg/epadata/vehicles.csv.zip 下载汽车油耗数据集并解压 - 进入jupyte...

4678
来自专栏老码农专栏

原 OSGL 工具库 - 图片处理的艺术之

1625
来自专栏崔庆才的专栏

跟繁琐的模型说拜拜!深度学习脚手架 ModelZoo 来袭!

好多天没有更新原创文章了,国庆前的一段时间确实比较忙,整个九月在参加各种面试,另外还有公司的项目,还有自己的毕设,另外还需要准备参加一些活动和讲座,时间排的很紧...

2022
来自专栏CSDN技术头条

使用hadoop进行大规模数据的全局排序

1. Hellow hadoop~~! Hadoop(某人儿子的一只虚拟大象的名字)是一个复杂到极致,又简单到极致的东西。 说它复杂,是因为一个hadoop...

3335

扫码关注云+社区

领取腾讯云代金券