ggmap:使用ggplot2進(jìn)行空間可視化繪圖(上篇)

作者:戴維 · 卡爾&哈德利·威克姆
翻譯:李博
原文地址: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

圖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

圖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)
圖3(上)
qmap(baylor, zoom = 14, source = "osm")
圖3(下)

上面的兩幅圖,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’)
圖4

這些指定與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

(圖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)人的通知后,刪除文章。”

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 228,505評(píng)論 6 533
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 98,556評(píng)論 3 418
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事。” “怎么了?”我有些...
    開封第一講書人閱讀 176,463評(píng)論 0 376
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經(jīng)常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 63,009評(píng)論 1 312
  • 正文 為了忘掉前任,我火速辦了婚禮,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 71,778評(píng)論 6 410
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 55,218評(píng)論 1 324
  • 那天,我揣著相機(jī)與錄音,去河邊找鬼。 笑死,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 43,281評(píng)論 3 441
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 42,436評(píng)論 0 288
  • 序言:老撾萬榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 48,969評(píng)論 1 335
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 40,795評(píng)論 3 354
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 42,993評(píng)論 1 369
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 38,537評(píng)論 5 359
  • 正文 年R本政府宣布,位于F島的核電站,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 44,229評(píng)論 3 347
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 34,659評(píng)論 0 26
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 35,917評(píng)論 1 286
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 51,687評(píng)論 3 392
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 47,990評(píng)論 2 374

推薦閱讀更多精彩內(nèi)容