作者:戴維 · 卡爾&哈德利·威克姆
翻譯:李博
原文地址:ggmap: Spatial Visualization with ggplot2
PS:由于原文較長呕臂,故翻譯分為三次進(jìn)行吠冤。
</br>
摘要:在空間統(tǒng)計(jì)中过蹂,數(shù)據(jù)可視化的實(shí)現(xiàn),社會(huì)地標(biāo)和地理環(huán)境創(chuàng)建的疊加模型是非常有價(jià)值的悲雳,而ggmap就是一個(gè)可通過谷歌地圖中靜態(tài)地圖的空間信息秆乳,形象化展示的新工具,并通過 OpenStreet地圖,Stamen地圖或者CloudMade地圖娩梨,使用ggplot2實(shí)現(xiàn)分層制圖功能沿腰。
同時(shí),還引入了幾個(gè)新的實(shí)用的函數(shù)狈定,并允許用戶訪問谷歌地理編碼颂龙,距離矩陣和方向路線請(qǐng)求。其最終的結(jié)果是簡潔纽什、易懂且模塊化的空間圖形框架措嵌,并介紹了一些方便的空間數(shù)據(jù)分析工具。
</br>
00 - 簡要介紹
在R中芦缰,可視化空間數(shù)據(jù)是一項(xiàng)具有挑戰(zhàn)性的任務(wù)企巢。
值得慶幸的是,這項(xiàng)任務(wù)通過sp让蕾、RgoogleMaps和相關(guān)的數(shù)據(jù)包(Pebesman和Bivand浪规,2006年;探孝,Bivand等人笋婿,2008年;Loecher和柏林經(jīng)濟(jì)和法律學(xué)院顿颅,2013年)的數(shù)據(jù)結(jié)構(gòu)和繪圖方法而變得更容易缸濒。
運(yùn)用這些方法,個(gè)人就可以繪制出(比如)一個(gè)包含多邊形區(qū)域數(shù)據(jù)的基本地理信息圖或引用數(shù)據(jù)點(diǎn)的點(diǎn)圖。然而庇配,與專業(yè)的地理信息系統(tǒng)(GISs)斩跌,如ESRI的ArcGIS,可以在地圖和衛(wèi)星圖像上繪制出點(diǎn)讨永,多邊形等滔驶,并可使用下拉菜單相比,我們這些可視化還是有不盡人意的地方卿闹。
本文詳細(xì)說明了使用ggplot2圖形實(shí)現(xiàn)的分層語法揭糕,以及從Google maps、OpenStreetMap锻霎、Stamen maps或CloudMade maps(Wickham著角、2009年、2010年)中獲得靜態(tài)地圖的相關(guān)信息旋恼,來實(shí)現(xiàn)在R中空間數(shù)據(jù)可視化的一些新方法吏口。
比如使用名為ggmap的包就很容易上手。在描述ggmap的具體細(xì)節(jié)后冰更,我們將展示其在德克薩斯州休斯頓市的暴力犯罪案件中的一些應(yīng)用产徊,并對(duì)一些實(shí)用功能做了概述。
</br>
01 - 在R中繪制空間數(shù)據(jù)
區(qū)域數(shù)據(jù)對(duì)應(yīng)于具有多邊形邊界的地理區(qū)域數(shù)據(jù)蜀细。
一個(gè)典型的示例是每個(gè)郵政編碼的居民人數(shù)舟铜。若僅考慮單位面積的邊界, 我們習(xí)慣于在R中看到類似圖1(左)的區(qū)域圖奠衔。
圖1:一副典型的R區(qū)域圖——休斯頓地區(qū)的郵編(左)谆刨,同時(shí),右邊是一副典型的R空間散點(diǎn)圖——2010年1月到2010年8月在休斯頓發(fā)生的謀殺案(右)归斤。
雖然這些類型的圖很有用痊夭,但在很多情況下,并沒有我們想要的那樣翔實(shí)脏里。比如她我,在繪制郵政編碼的時(shí)候,也應(yīng)該可以看到構(gòu)成地面單位邊界的主要道路和其它地標(biāo)(事實(shí)上沒有)迫横。
點(diǎn)圖中引用空間數(shù)據(jù)的情況往往效果更差鸦难。由于我們無法輕松地對(duì)沒有任何背景信息的點(diǎn)的散點(diǎn)圖進(jìn)行上下文關(guān)聯(lián),所以通吃币可以添加一些區(qū)域數(shù)據(jù)的重疊點(diǎn)——無論何種數(shù)據(jù)都可用合蔽。結(jié)果如圖1所示(右圖)。
在大多數(shù)情況下介返,這個(gè)圖形拴事,對(duì)于在這個(gè)問題上研究了一段時(shí)間的人員來說是可以理解的沃斤,但對(duì)于讀者來說可能用處不大。
讀者必須努力將感興趣的數(shù)據(jù)與他們的位置相關(guān)聯(lián)刃宵。此外衡瓶,還有許多被遺漏的細(xì)節(jié)——大多數(shù)事件發(fā)生在地標(biāo)x的東面還是西面?它們是集中在城市的繁華區(qū)域牲证,還是傾向于在偏僻區(qū)域發(fā)生哮针?類似這樣的問題用這些圖形來回答不了,原因是我們不考慮小規(guī)模的區(qū)域邊界(例如郵政編碼或普查區(qū))坦袍。
但十厢,通過努力,可以制作出更好的地圖捂齐,地圖工具蛮放,sp或RgoogleMaps等工具更為容易;事實(shí)上,ggmap的靈感來自于RgoogleMaps(Becker等奠宜,2013; Bivand和Lewin-Koh包颁,2013)。
此外压真,最近在大量在R制圖中娩嚼,出現(xiàn)了一種優(yōu)秀的交互式GUI驅(qū)動(dòng)的空間數(shù)據(jù)分析助推器包,該包基于Bing地圖(Fellows等人滴肿,2013)岳悟。ggmap在基于ggplot2繪制框架定位的各種靜態(tài)地圖的語境信息上,又邁出了一步嘴高。
其展示結(jié)果是簡潔,且大眾可接受的一種繪圖方式和屎,并通過圖形框架的分層語法保持圖形的兼容性拴驮。其結(jié)果是類似圖2的空間圖。
圖2:使用qmplot函數(shù)進(jìn)行的Stamen Maps'terrain tile集合的空間散點(diǎn)圖柴信,本文中介紹了函數(shù)的實(shí)驗(yàn)融合套啤。
</br>
02- 圖形的分層語法
使用ggplot2制作繪圖的一個(gè)優(yōu)點(diǎn)是,ggplot2所基于的圖形分層語法(Wickham随常,2010; Wilkinson潜沦,2005)。
根據(jù)定義绪氛,分層語法要求每個(gè)圖由五個(gè)部分組成:
- 01.具有空間圖像( aesthetic mappings)的默認(rèn)數(shù)據(jù)集
- 02.一個(gè)或多個(gè)圖層唆鸡,每個(gè)圖層都具有幾何對(duì)象(“geom”),統(tǒng)計(jì)變換(“stat”)和具有空間圖像(可能默認(rèn))的數(shù)據(jù)集)
- 03.每一個(gè)空間圖像都有一個(gè)范圍(可以自動(dòng)生成)
- 04.一個(gè)坐標(biāo)系
- 05.一個(gè)規(guī)范
由于ggplot2可以實(shí)現(xiàn)圖形的分層語法枣察,所以使用ggplot2繪制的每個(gè)圖形都具有上述每個(gè)元素争占。因此燃逻,ggmap圖也具有這些元素,但是其某些元素被固定到地圖組件上:x軸為經(jīng)度臂痕,y軸為緯度伯襟,坐標(biāo)系被固定在墨卡托投影上。
使用分層語法繪制地圖的主要理論優(yōu)勢是坐標(biāo)尺度保持一致握童。在地圖涵蓋數(shù)據(jù)范圍的典型情況下姆怪,在ggmap中,緯度和經(jīng)度數(shù)值范圍會(huì)限定地圖(默認(rèn)情況下)澡绩,以及坐標(biāo)軸上的刻度稽揭。每個(gè)圖層呈現(xiàn)的顏色,填充英古,阿爾法混合和其它建立在地圖之上的各個(gè)要素都保持了尺度的一致性淀衣。
語法的一致性對(duì)于分面圖同樣重要,目的是便于相同的要素在幾個(gè)圖中進(jìn)行恰當(dāng)?shù)谋容^召调。當(dāng)然膨桥,如果用戶指定的空間數(shù)據(jù)出了問題,那么比例尺寸同樣是有問題的唠叛,比如在同一張地圖中使用多個(gè)投影只嚣,而要修復(fù)這些錯(cuò)誤是困難的。
使用語法的優(yōu)點(diǎn)是你能做的更好艺沼。由于圖形在ggplot2中完成册舞,所以用戶可以使用ggplot2的全部功能,繪制優(yōu)雅的可視內(nèi)容——幾何障般,統(tǒng)計(jì)调鲸,縮放等。在圖2中已經(jīng)看到這一點(diǎn)挽荡,qmplot的參數(shù)與ggplot2的qplot相同藐石。
</br>
03 -ggmap 的工作原理
ggmap的基本思路是使用下載的地圖圖像,使用ggplot2將其作為背景層定拟,然后在地圖上繪制數(shù)據(jù)于微,統(tǒng)計(jì)信息或模型等圖層。
在ggmap中青自,這個(gè)過程被分成兩部分:
(1)下載圖像并對(duì)它們進(jìn)行格式化株依,使用get_map完成。
(2)使用ggmap完成繪圖延窜。
qmap將這兩個(gè)函數(shù)結(jié)合起來恋腕,用于快速繪制繪圖(c.f. ggplot2的ggplot),并且qmplot嘗試將整個(gè)繪圖過程封裝成一個(gè)簡單的命令(c.f.ggplot2的qplot)逆瑞。
</br>
04 - get_map函數(shù)
在ggmap中吗坚,使用get_map函數(shù)完成地圖下載并格式化圖像祈远,以進(jìn)行繪圖準(zhǔn)備。
更具體地說商源,get_map是get_googlemap车份,get_openstreetmap,get_stamenmap和get_cloudmademap的一個(gè)復(fù)合函數(shù)牡彻,它接受一系列廣泛的參數(shù)扫沼,并返回一個(gè)分類柵格對(duì)象,供ggmap繪圖使用庄吼。
由于地圖最大的且重要的是位置信息缎除,所以get_map最為重要的參數(shù)是位置參數(shù)。
理想情況下总寻,位置是指定地圖中心經(jīng)緯度器罐,并附有參數(shù)的縮放。eg.從3到20的整數(shù)說明圍繞中心的空間范圍大小——3為陸地水平渐行,而20為單一建筑水平轰坊,位置默認(rèn)為德克薩斯州休斯頓市中心,并且縮放到10倍祟印,大致為城市規(guī)模肴沫。
當(dāng)經(jīng)緯度作為理想情況下的位置說明而使用時(shí),可操作性不是很強(qiáng)蕴忆〔遥基于這個(gè)原因,位置也接受一個(gè)字符串套鹅,無論這個(gè)字符串是否包含了地址站蝠、郵編、或者專有名稱卓鹿,都將通過編碼函數(shù)菱魔,為地圖中心賦予適當(dāng)?shù)慕?jīng)緯度坐標(biāo)。
換句話說减牺,我們并不需要知道地圖中心精確地經(jīng)緯度坐標(biāo)豌习,** get_map**能給于更為規(guī)范通俗的說明存谎,從而輕松搞定拔疚。
例如:
>geocode("the white house")
lon lat
-77.03676 38.89784
文中“the white house”是一個(gè)具體位置,文章末尾有更多關(guān)于geocode和其它實(shí)用的函數(shù)的討論既荚。
一些用戶發(fā)現(xiàn)了更為方便的邊界框規(guī)范稚失,可代替中心/縮放規(guī)范,為了適應(yīng)這種形式的規(guī)范恰聘,位置還接受左/下/右/上四個(gè)長度數(shù)字向量的規(guī)范句各。目前此設(shè)置不適用于Google地圖吸占。
然而每個(gè)地圖源都有它自己的Web應(yīng)用程序接口(API),在get_map文本中凿宾,通過計(jì)算適當(dāng)?shù)膮?shù)(如果需要)來定位/放大矾屯,并把它們傳遞給每個(gè)API的具體get_ *函數(shù)。
為確保不同來源的地圖初厚,具有統(tǒng)一的位置/縮放的規(guī)格件蚕,get_map首先抓取適當(dāng)?shù)墓雀璧貓D,確定其邊界产禾,然后下載所需要的其它地圖排作。
在 Stamen地圖和CloudMade Maps的情況下,這涉及到一個(gè)地圖合成過程(小的地圖圖片)亚情,然后合成將結(jié)果妄痪,裁剪為適當(dāng)邊界框圖。
從圖3(谷歌和開放街道地圖)中可以看到楞件,四副地圖源規(guī)范一致的排列為單一圖形框衫生。
baylor <- "baylor university"
qmap(baylor, zoom = 14)
qmap(baylor, zoom = 14, source = "osm")
上面的兩幅圖,get_map使用單一簡單的語法為Google Maps(上)和OpenStreetMaps(下)提供了相同的空間范圍履因,即使它們的API完全不同障簿。
在涉及source和maptype參數(shù)之前,需要注意的是栅迄,get_map底層API特定的get_ *函數(shù)是一個(gè)包裝器站故,它提供了更廣泛的從各自的源下載的機(jī)制。
例如毅舆,get_googlemap可以訪問Google Static Maps API的全部范圍西篓,如圖4所示。
</br>
05 - get_map的source和maptype參數(shù)
使用不同的地圖源(Google Maps憋活,OpenStreetMap岂津,Stamen Maps和CloudMade Maps)最有吸引力的方面是,制作人提供的不同地圖樣式悦即。
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’)
這些指定與get_map的maptype參數(shù)吮成,并且必須與源參數(shù)一致。一些大的道路辜梳,其它水域粱甫,還有一些地理位置的邊界。有些更適合在黑白介質(zhì)中繪圖;別人只是很高興看作瞄。
本節(jié)將介紹ggmap中可用的各種地圖樣式茶宵。
谷歌提供了四中不同類型——地形(默認(rèn)),衛(wèi)星(例如圖13)宗挥,路線圖和混合圖(例如圖12)乌庶。另一方面种蝶,OpenStreetMap只提供如圖3所示的默認(rèn)樣式。
Stamen地圖和CloudMade地圖真正的亮點(diǎn)是其風(fēng)格迥異瞒大。
Stamen Maps有三個(gè)可用的類型(類似于瓷磚) - 地形(例如圖2或13)螃征,水彩和調(diào)色劑(后兩個(gè)見圖5)
qmap(baylor, zoom = 14, source = "stamen", maptype = "watercolor")
qmap(baylor, zoom = 14, source = "stamen", maptype = "toner")
(圖5: Stamen tile sets maptype = "watercolor(水彩)" and maptype = "toner(調(diào)色劑)" )
Stamen的地形塊集與Google相似,但顯而易見的是透敌,水彩和瓷磚組與四個(gè)Google瓷磚組中的任何一個(gè)都差異巨大会傲。
例如,后者是黑白繪圖的理想選擇(圖5右)拙泽。
CloudMade地圖通過允許用戶(1)在數(shù)千個(gè)用戶設(shè)置中進(jìn)行選擇淌山,或(2)使用簡單的在線編輯器創(chuàng)建一個(gè)全新的風(fēng)格,用戶可以指定顏色顾瞻,線條等泼疑,從而進(jìn)一步獲得了瓷磚樣式( tile styling )。對(duì)于各種類型的道路荷荤,水路退渗,地標(biāo)等,都由CloudMade生成蕴纳,并可在ggmap中訪問会油。
ggmap,通過get_map(或get_cloudmademap)允許兩個(gè)選項(xiàng)古毛。這是CloudMade Maps的一個(gè)獨(dú)特功能翻翩,它真正提升了它們的適用性,并擴(kuò)展了ggmap的發(fā)展前景稻薇。使用CloudMade Maps的一個(gè)小小的缺點(diǎn)是嫂冻,用戶必須向CloudMade注冊(cè)以獲取API密鑰,然后將API密鑰通過api_key參數(shù)傳遞給get_map塞椎。 API密鑰是免費(fèi)的桨仿,可以在幾分鐘內(nèi)獲得。
圖6中可以看到兩個(gè)低光的CloudMade地圖樣式案狠。請(qǐng)注意服傍,地圖樣式僅適用于擁有它們的用戶。
Stamen Maps和CloudMade Maps都使用OpenStreetMap數(shù)據(jù)構(gòu)建骂铁。這些數(shù)據(jù)由開放社區(qū)的在線用戶提供吹零,與維基百科創(chuàng)建方式大致相同——兩者都是免費(fèi)的,都是用戶貢獻(xiàn)的从铲,兩者都易于編輯瘪校。
此外澄暮,OpenStreetMap不僅具道路和水域的數(shù)據(jù)名段,還包括個(gè)別建筑物阱扬,噴泉,停車標(biāo)志等細(xì)節(jié)伸辟。缺點(diǎn)是(像谷歌地圖)并不是所有的位置都具有相同的精確度麻惶,并且缺陷可能會(huì)在小型地圖時(shí)更為明顯。
(未完待續(xù))......
“本譯文僅供個(gè)人研習(xí)信夫、欣賞語言之用窃蹋,謝絕任何轉(zhuǎn)載及用于任何商業(yè)用途。本譯文所涉法律后果均由本人承擔(dān)静稻。本人同意簡書平臺(tái)在接獲有關(guān)著作權(quán)人的通知后警没,刪除文章≌裢澹”