绘图: matplotlib Basemap简介

在数据可视化过程中,我们常常需要将数据根据其采集的地理位置在地图上显示出来。比如说我们会想要在地图上画出城市,飞机的航线,乃至于军事基地等等。通常来说,一个地理信息系统都会带有这样的功能。今天我们讨论如何在Python上实现,并且使用免费的工具包。

matplotlib是Python常用的数据绘制包。它基于numpy的数组运算功能。matplotlib绘图功能强大,可以轻易的画出各种统计图形,比如散点图,条行图,饼图等。matplotlib常与numpy和scipy相配合,用于许多研究领域。他们是免费工具,但其功能足可以与科研界的大佬Matlab竞争。

Basemap是Matplotlib的一个子包,负责地图绘制。在数据可视化过程中,我们常需要将数据在地图上画出来。比如说我们在地图上画出城市人口,飞机航线,军事基地,矿藏分布等等。这样的地理绘图有助于读者理解空间相关的信息。

我们下面用Basemap画出亚洲主要城市的人口。如下图,人口的数量用圆圈的大小表示:

数据如下(我从Wikipedia上整理的,你可以随意使用)。将数据保存在文件major_city:

Shanghai 23019148  31.23N  121.47E  China
Mumbai   12478447  18.96N  72.82E   India
Karachi  13050000  24.86N  67.01E   Pakistan
Delhi    16314838  28.67N  77.21E   India
Manila   11855975  14.62N  120.97E  Philippines
Seoul    23616000  37.56N  126.99E  Korea(South)
Jakarta  28019545   6.18S  106.83E  Indonesia
Tokyo    35682460  35.67N  139.77E  Japan
Peking   19612368  39.91N  116.39E  China

第一列是城市名,第二列是人口,第三第四列为纬度和经度,最后一列为所在国家。

下面是我的Python代码,用以绘制上面的地图:

# Written by Vamei, http://www.cnblogs.com/vamei/
# Feel free to use or modify this script.

from mpl_toolkits.basemap import Basemap
import matplotlib.pyplot as plt
import numpy as np

#============================================# read data
names = []
pops  = []
lats  = []
lons  = []
countries = []
for line in file("../data/major_city"):
    info = line.split()
    names.append(info[0])
    pops.append(float(info[1]))
    lat  = float(info[2][:-1])
    if info[2][-1] == 'S': lat = -lat
    lats.append(lat)
    lon  = float(info[3][:-1])
    if info[3][-1] == 'W': lon = -lon + 360.0
    lons.append(lon)
    country = info[4]
    countries.append(country)

#============================================
# set up map projection with
# use low resolution coastlines.
map = Basemap(projection='ortho',lat_0=35,lon_0=120,resolution='l')
# draw coastlines, country boundaries, fill continents.
map.drawcoastlines(linewidth=0.25)
map.drawcountries(linewidth=0.25)
# draw the edge of the map projection region (the projection limb)
map.drawmapboundary(fill_color='#689CD2')
# draw lat/lon grid lines every 30 degrees.
map.drawmeridians(np.arange(0,360,30))
map.drawparallels(np.arange(-90,90,30))
# Fill continent wit a different color
map.fillcontinents(color='#BF9E30',lake_color='#689CD2',zorder=0)
# compute native map projection coordinates of lat/lon grid.
x, y = map(lons, lats)
max_pop = max(pops)
# Plot each city in a loop.
# Set some parameters
size_factor = 80.0
y_offset    = 15.0
rotation    = 30
for i,j,k,name in zip(x,y,pops,names):
    size = size_factor*k/max_pop
    cs = map.scatter(i,j,s=size,marker='o',color='#FF5600')
    plt.text(i,j+y_offset,name,rotation=rotation,fontsize=10)

plt.title('Major Cities in Asia & Population')
plt.show()

程序分为两个部分,第一部分为从文件读取数据并处理。第二部分才是真正用basemap绘图。

地图的大小、投影方法等重要信息,是在Basemap()的调用中实现的:

map = Basemap(projection='ortho',lat_0=35,lon_0=120,resolution='l')

projection参数规定了投影方法。改变投影方法,绘图结果也将非常不同。

城市所在位置是经纬度。我们想要把经纬度对应图像的像素点,需要转换:

x, y = map(lons, lats)

这个语句转换为图像上的位置。

最后,调用绘制散点图的方法scatter():

cs = map.scatter(i,j,s=size,marker='o',color='#FF5600')

在地图上画出数据。

总结

matplotlib中的Basemap是很好用的,具有专业标准的地图绘制工具。它可以与matplotlib的一般绘图功能结合,在地图上绘制数据。

文中需要的软件包:

numpy, matplotlib, mpl_toolkits

可以使用pip来下载安装各个包。

在Ubuntu的repository中,你可以找到python-matplotlib包。

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

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏YoungGy

MMD_4a_CollaborativeFiltering

Overview history long tail types of rs model key problems Content-based System m...

21860
来自专栏数据派THU

带你和Python与R一起玩转数据科学: 探索性数据分析(附代码)

本系列将介绍如何在现在工作中用两种最流行的开源平台玩转数据科学。先来看一看数据分析过程中的关键步骤 – 探索性数据分析。

14320
来自专栏华章科技

用 Python 20 秒画完小猪佩奇“社会人”!附效果视频+完整代码

导读:今年社交平台上最火的带货女王是谁?范冰冰?杨幂?Angelababy?不,是猪猪女孩小猪佩奇。

25950
来自专栏数据小魔方

R语言可视化——多边形与数据地图填充

ggplot函数中有一类特殊的图表类型叫做多边形,很难用传统的视角来定义它属于哪一类图表,因为它能够呈现信息多种多样。 特别是在做某些比较高阶的图表——地图时,...

35540
来自专栏大数据文摘

小白学数据 | 28张小抄表大放送:Python,R,大数据,机器学习

20220
来自专栏数据小魔方

think-cell chart系列16——树状分布图

今天跟大家分享think-cell chart系列的第16篇——树状分布图。 大家不要困惑于该图表的名称——树状分布图,其实它用的技巧非常简单(就是基本图表的组...

54640
来自专栏灯塔大数据

洞察|美国大选倒计时:R 语言和蒙特卡洛算法预测希拉里赢面高达89%

距总统大选不到一周,来预测一下竞选结果还是很有挺有趣的。虽然关于选举,有的是博客和网站的预测,但确切告诉你他们究竟用了什么模型,或者告诉你怎么做这个预测的却寥...

38690
来自专栏IT派

“表”解机器学习

导语:在过去的几个月里,作者一直在专注于整理归纳AI的各类小要点。在被越来越多的朋友同事问及时,我决定将这些总结和心得的完整版分享给大家。为了增加内容的趣味性和...

36550
来自专栏FreeBuf

浅析PRODIGAL:真实企业中的内部威胁检测系统

0x00 写在前面 2013年2月份美国白宫发布了一份总统备忘录,专门就当前面临的内部威胁(Insider Threats)进行了分析,并且督促行政部门紧急出台...

207100
来自专栏iOSDevLog

iOS ARKit教程:用裸露的手指在空中画画

最近,Apple公布了名为ARKit的新增强现实(AR)库。对于许多人来说,它看起来只是另一个优秀的AR库,而不是一个值得关注的技术破坏者。但是,如果你看一下过...

16930

扫码关注云+社区

领取腾讯云代金券