ggmap: 使用 ggplot2 进行空间可视化绘图(上篇)

浏览: 3149

作者:戴维 · 卡尔 & 哈德利 · 威克姆,翻译:李博。

原文地址:ggmap: Spatial Visualization with ggplot2

原文发布于作者知乎、简书,欢迎大家关注支持。本文已获作者授权原创形式发布,欢迎点击【阅读原文】查看!    

知乎:https://www.zhihu.com/people/li-bo-90-94/pins/posts     

简书:http://www.jianshu.com/u/43365c904dba

PS:由于原文较长,故翻译分为三次进行(会进行多次修正)。

  摘要

在空间统计中,数据可视化的实现,社会地标和地理环境创建的叠加模型是非常有价值的,而 ggmap 就是一个可通过谷歌地图中静态地图的空间信息,形象化展示的新工具,并通过 OpenStreet 地图,Stamen 地图或者 CloudMade 地图,使用 ggplot2 实现分层制图功能。

同时,还引入了几个新的实用的函数,并允许用户访问谷歌地理编码,距离矩阵和方向路线请求。其最终的结果是简洁、易懂且模块化的空间图形框架,并介绍了一些方便的空间数据分析工具。

00 简要介绍

在 R 中,可视化空间数据是一项具有挑战性的任务。

值得庆幸的是,这项任务通过 sp、RgoogleMaps 和相关的数据包 (Pebesman 和 Bivand,2006 年;,Bivand 等人,2008 年;Loecher 和柏林经济和法律学院,2013 年) 的数据结构和绘图方法而变得更容易。

运用这些方法,个人就可以绘制出 (比如) 一个包含多边形区域数据的基本地理信息图或引用数据点的点图。然而,与专业的地理信息系统(GISs),如 ESRI 的 ArcGIS,可以在地图和卫星图像上绘制出点,多边形等,并可使用下拉菜单相比,我们这些可视化还是有不尽人意的地方。

本文详细说明了使用 ggplot2 图形实现的分层语法,以及从 Google maps、OpenStreetMap、Stamen maps 或 CloudMade maps(Wickham、2009 年、2010 年) 中获得静态地图的相关信息,来实现在 R 中空间数据可视化的一些新方法。

比如使用名为 ggmap 的包就很容易上手。在描述 ggmap 的具体细节后,我们将展示其在德克萨斯州休斯顿市的暴力犯罪案件中的一些应用,并对一些实用功能做了概述。

01 在R中绘制空间数据

区域数据对应于具有多边形边界的地理区域数据。

一个典型的示例是每个邮政编码的居民人数。若仅考虑单位面积的边界, 我们习惯于在 R 中看到类似图 1(左) 的区域图。

image.png

图 1: 一副典型的 R 区域图——休斯顿地区的邮编 (左),同时,右边是一副典型的 R 空间散点图——2010 年 1 月到 2010 年 8 月在休斯顿发生的谋杀案 (右)。

虽然这些类型的图很有用,但在很多情况下,并没有我们想要的那样翔实。比如,在绘制邮政编码的时候,也应该可以看到构成地面单位边界的主要道路和其它地标(事实上没有)。

点图中引用空间数据的情况往往效果更差。由于我们无法轻松地对没有任何背景信息的点的散点图进行上下文关联,所以通常可以添加一些区域数据的重叠点——无论何种数据都可用。结果如图 1 所示(右图)。

在大多数情况下,这个图形,对于在这个问题上研究了一段时间的人员来说是可以理解的,但对于读者来说可能用处不大。

读者必须努力将感兴趣的数据与他们的位置相关联。此外,还有许多被遗漏的细节——大多数事件发生在地标 x 的东面还是西面?它们是集中在城市的繁华区域,还是倾向于在偏僻区域发生?类似这样的问题用这些图形来回答不了,原因是我们不考虑小规模的区域边界(例如邮政编码或普查区)。

但,通过努力,可以制作出更好的地图,地图工具,sp 或 RgoogleMaps 等工具更为容易; 事实上,ggmap 的灵感来自于 RgoogleMaps(Becker 等,2013; Bivand 和 Lewin-Koh,2013)。

此外,最近在大量在 R 制图中,出现了一种优秀的交互式 GUI 驱动的空间数据分析助推器包,该包基于 Bing 地图(Fellows 等人,2013)。ggmap 在基于 ggplot2 绘制框架定位的各种静态地图的语境信息上,又迈出了一步。

其展示结果是简洁,且大众可接受的一种绘图方式,并通过图形框架的分层语法保持图形的兼容性。其结果是类似图 2 的空间图。

image.png


图 2:使用 qmplot 函数进行的 Stamen Maps'terrain tile 集合的空间散点图,本文中介绍了函数的实验融合。

02 图形的分层语法

使用 ggplot2 制作绘图的一个优点是,ggplot2 所基于的图形分层语法(Wickham,2010; Wilkinson,2005)。

根据定义,分层语法要求每个图由五个部分组成:

01. 具有空间图像( aesthetic mappings)的默认数据集

02. 一个或多个图层,每个图层都具有几何对象(“geom”),统计变换(“stat”)和具有空间图像(可能默认)的数据集)

03. 每一个空间图像都有一个范围(可以自动生成)

04. 一个坐标系

05. 一个规范

由于 ggplot2 可以实现图形的分层语法,所以使用 ggplot2 绘制的每个图形都具有上述每个元素。因此,ggmap 图也具有这些元素,但是其某些元素被固定到地图组件上:x 轴为经度,y 轴为纬度,坐标系被固定在墨卡托投影上。

使用分层语法绘制地图的主要理论优势是坐标尺度保持一致。在地图涵盖数据范围的典型情况下,在 ggmap 中,纬度和经度数值范围会限定地图(默认情况下),以及坐标轴上的刻度。每个图层呈现的颜色,填充,阿尔法混合和其它建立在地图之上的各个要素都保持了尺度的一致性。

语法的一致性对于分面图同样重要,目的是便于相同的要素在几个图中进行恰当的比较。当然,如果用户指定的空间数据出了问题,那么比例尺寸同样是有问题的,比如在同一张地图中使用多个投影,而要修复这些错误是困难的。

使用语法的优点是你能做的更好。由于图形在 ggplot2 中完成,所以用户可以使用 ggplot2 的全部功能,绘制优雅的可视内容——几何,统计,缩放等。在图 2 中已经看到这一点,qmplot 的参数与 ggplot2 的 qplot 相同。

03 ggmap的工作原理

ggmap 的基本思路是使用下载的地图图像,使用 ggplot2 将其作为背景层,然后在地图上绘制数据,统计信息或模型等图层。

在 ggmap 中,这个过程被分成两部分:

(1)下载图像并对它们进行格式化,使用 get_map 完成。
(2)使用 ggmap 完成绘图。

qmap 将这两个函数结合起来,用于快速绘制绘图(c.f. ggplot2 的 ggplot),并且 qmplot 尝试将整个绘图过程封装成一个简单的命令(c.f.ggplot2 的 qplot)。

04 get_map函数

在 ggmap 中,使用 get_map 函数完成地图下载并格式化图像,以进行绘图准备。

更具体地说,get_map 是 get_googlemap,get_openstreetmap,get_stamenmap 和 get_cloudmademap 的一个复合函数,它接受一系列广泛的参数,并返回一个分类栅格对象,供 ggmap 绘图使用。

由于地图最大的且重要的是位置信息,所以 get_map 最为重要的参数是位置参数。

理想情况下,位置是指定地图中心经纬度,并附有参数的缩放。eg. 从 3 到 20 的整数说明围绕中心的空间范围大小——3 为陆地水平,而 20 为单一建筑水平,位置默认为德克萨斯州休斯顿市中心,并且缩放到 10 倍,大致为城市规模。

当经纬度作为理想情况下的位置说明而使用时,可操作性不是很强。基于这个原因,位置也接受一个字符串,无论这个字符串是否包含了地址、邮编、或者专有名称,都将通过编码函数,为地图中心赋予适当的经纬度坐标。

换句话说,我们并不需要知道地图中心精确地经纬度坐标, get_map 能给于更为规范通俗的说明,从而轻松搞定。

例如:

>geocode("the white house")

          lon            lat

-77.03676 38.89784

文中 “the white house” 是一个具体位置,文章末尾有更多关于 geocode 和其它实用的函数的讨论。

一些用户发现了更为方便的边界框规范,可代替中心 / 缩放规范,为了适应这种形式的规范,位置还接受左 / 下 / 右 / 上四个长度数字向量的规范。目前此设置不适用于 Google 地图。

然而每个地图源都有它自己的 Web 应用程序接口(API),在 get_map 文本中,通过计算适当的参数(如果需要)来定位 / 放大,并把它们传递给每个 API 的具体 get_ * 函数。

为确保不同来源的地图,具有统一的位置 / 缩放的规格,get_map 首先抓取适当的谷歌地图,确定其边界,然后下载所需要的其它地图。

在 Stamen 地图和 CloudMade Maps 的情况下,这涉及到一个地图合成过程(小的地图图片),然后合成将结果,裁剪为适当边界框图。

从图 3(谷歌和开放街道地图)中可以看到,四副地图源规范一致的排列为单一图形框。

baylor <- "baylor university"

qmap(baylor, zoom = 14)

image.png

qmap(baylor, zoom = 14, source = "osm")

image.png

图 3(下)

上面的两幅图,get_map 使用单一简单的语法为 Google Maps(上)和 OpenStreetMaps(下)提供了相同的空间范围,即使它们的 API 完全不同。

在涉及 source 和 maptype 参数之前,需要注意的是,get_map 底层 API 特定的 get_ * 函数是一个包装器,它提供了更广泛的从各自的源下载的机制。

例如,get_googlemap 可以访问 Google Static Maps API 的全部范围,如图 4 所示。

05 get_map 的 source 和 maptype 参数

使用不同的地图源(Google Maps,OpenStreetMap,Stamen Maps 和 CloudMade Maps)最有吸引力的方面是,制作人提供的不同地图样式。

##确保已经安装"ggmap"和"ggplot2"两个包

library(ggplot2)

library(ggmap)

set.seed(500)

df <- round(data.frame(

x = jitter(rep(-95.36, 50), amount = .3),

y = jitter(rep( 29.76, 50), amount = .3)

), digits = 2)

map <- get_googlemap(’houston’, markers = df, path = df, scale = 2)

ggmap(map, extent = ’device’)

##我在实际运行中,’houston’、’device’要使用"",双引号。否则运行出错,但原文件就是单引号,不知道是何原因。

image.png

这些指定与 get_map 的 maptype 参数,并且必须与源参数一致。一些大的道路,其它水域,还有一些地理位置的边界。有些更适合在黑白介质中绘图; 别人只是很高兴看。

本节将介绍 ggmap 中可用的各种地图样式。

谷歌提供了四中不同类型——地形(默认),卫星(例如图 13),路线图和混合图(例如图 12)。另一方面,OpenStreetMap 只提供如图 3 所示的默认样式。

Stamen 地图和 CloudMade 地图真正的亮点是其风格迥异。

Stamen Maps 有三个可用的类型(类似于瓷砖) - 地形(例如图 2 或 13),水彩和调色剂(后两个见图 5)

qmap(baylor, zoom = 14, source = "stamen", maptype = "watercolor")

qmap(baylor, zoom = 14, source = "stamen", maptype = "toner")

image.png

(图 5: Stamen tile sets maptype ="watercolor(水彩)"and maptype ="toner(调色剂)")

Stamen 的地形块集与 Google 相似,但显而易见的是,水彩和瓷砖组与四个 Google 瓷砖组中的任何一个都差异巨大。

例如,后者是黑白绘图的理想选择(图 5 右)。

CloudMade 地图通过允许用户(1)在数千个用户设置中进行选择,或(2)使用简单的在线编辑器创建一个全新的风格,用户可以指定颜色,线条等,从而进一步获得了瓷砖样式( tile styling )。对于各种类型的道路,水路,地标等,都由 CloudMade 生成,并可在 ggmap 中访问。

ggmap,通过 get_map(或 get_cloudmademap)允许两个选项。这是 CloudMade Maps 的一个独特功能,它真正提升了它们的适用性,并扩展了 ggmap 的发展前景。使用 CloudMade Maps 的一个小小的缺点是,用户必须向 CloudMade 注册以获取 API 密钥,然后将 API 密钥通过 api_key 参数传递给 get_map。 API 密钥是免费的,可以在几分钟内获得。

图 6 中可以看到两个低光的 CloudMade 地图样式。请注意,地图样式仅适用于拥有它们的用户。

Stamen Maps 和 CloudMade Maps 都使用 OpenStreetMap 数据构建。这些数据由开放社区的在线用户提供,与维基百科创建方式大致相同——两者都是免费的,都是用户贡献的,两者都易于编辑。

此外,OpenStreetMap 不仅具道路和水域的数据,还包括个别建筑物,喷泉,停车标志等细节。缺点是(像谷歌地图)并不是所有的位置都具有相同的精确度,并且缺陷可能会在小型地图时更为明显。


推荐 0
本文由 EasyCharts 创作,采用 知识共享署名-相同方式共享 3.0 中国大陆许可协议 进行许可。
转载、引用前需联系作者,并署名作者且注明文章出处。
本站文章版权归原作者及原出处所有 。内容为作者个人观点, 并不代表本站赞同其观点和对其真实性负责。本站是一个个人学习交流的平台,并不用于任何商业目的,如果有任何问题,请及时联系我们,我们将根据著作权人的要求,立即更正或者删除有关内容。本站拥有对此声明的最终解释权。

0 个评论

要回复文章请先登录注册