作者:戴維 · 卡爾&哈德利·威克姆
翻譯:李博
原文地址: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)勢(shì)是坐標(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)人的通知后,刪除文章。”