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)勢是坐標(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)系作者
  • 序言:七十年代末杀迹,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子押搪,更是在濱河造成了極大的恐慌树酪,老刑警劉巖,帶你破解...
    沈念sama閱讀 221,888評(píng)論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件大州,死亡現(xiàn)場離奇詭異续语,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)厦画,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,677評(píng)論 3 399
  • 文/潘曉璐 我一進(jìn)店門疮茄,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人根暑,你說我怎么就攤上這事娃豹。” “怎么了购裙?”我有些...
    開封第一講書人閱讀 168,386評(píng)論 0 360
  • 文/不壞的土叔 我叫張陵懂版,是天一觀的道長。 經(jīng)常有香客問我躏率,道長躯畴,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 59,726評(píng)論 1 297
  • 正文 為了忘掉前任薇芝,我火速辦了婚禮蓬抄,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘夯到。我一直安慰自己嚷缭,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 68,729評(píng)論 6 397
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著阅爽,像睡著了一般路幸。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上付翁,一...
    開封第一講書人閱讀 52,337評(píng)論 1 310
  • 那天简肴,我揣著相機(jī)與錄音,去河邊找鬼百侧。 笑死砰识,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的佣渴。 我是一名探鬼主播辫狼,決...
    沈念sama閱讀 40,902評(píng)論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢(mèng)啊……” “哼辛润!你這毒婦竟也來了予借?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,807評(píng)論 0 276
  • 序言:老撾萬榮一對(duì)情侶失蹤频蛔,失蹤者是張志新(化名)和其女友劉穎灵迫,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體晦溪,經(jīng)...
    沈念sama閱讀 46,349評(píng)論 1 318
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡瀑粥,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,439評(píng)論 3 340
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了三圆。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片狞换。...
    茶點(diǎn)故事閱讀 40,567評(píng)論 1 352
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖舟肉,靈堂內(nèi)的尸體忽然破棺而出修噪,到底是詐尸還是另有隱情,我是刑警寧澤路媚,帶...
    沈念sama閱讀 36,242評(píng)論 5 350
  • 正文 年R本政府宣布黄琼,位于F島的核電站,受9級(jí)特大地震影響整慎,放射性物質(zhì)發(fā)生泄漏脏款。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,933評(píng)論 3 334
  • 文/蒙蒙 一裤园、第九天 我趴在偏房一處隱蔽的房頂上張望撤师。 院中可真熱鬧,春花似錦拧揽、人聲如沸鲸鹦。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,420評(píng)論 0 24
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至衰伯,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間闰歪,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,531評(píng)論 1 272
  • 我被黑心中介騙來泰國打工蓖墅, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留库倘,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 48,995評(píng)論 3 377
  • 正文 我出身青樓论矾,卻偏偏與公主長得像教翩,于是被迫代替她去往敵國和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子贪壳,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,585評(píng)論 2 359

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