作者:戴維 · 卡爾&哈德利·威克姆
翻譯:李博
原文地址:ggmap: Spatial Visualization with ggplot2
PS:由于原文較長,故翻譯分為三次進行。
</br>
摘要:在空間統計中,數據可視化的實現,社會地標和地理環境創建的疊加模型是非常有價值的,而ggmap就是一個可通過谷歌地圖中靜態地圖的空間信息,形象化展示的新工具,并通過 OpenStreet地圖,Stamen地圖或者CloudMade地圖,使用ggplot2實現分層制圖功能。
同時,還引入了幾個新的實用的函數,并允許用戶訪問谷歌地理編碼,距離矩陣和方向路線請求。其最終的結果是簡潔、易懂且模塊化的空間圖形框架,并介紹了一些方便的空間數據分析工具。
</br>
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的具體細節后,我們將展示其在德克薩斯州休斯頓市的暴力犯罪案件中的一些應用,并對一些實用功能做了概述。
</br>
01 - 在R中繪制空間數據
區域數據對應于具有多邊形邊界的地理區域數據。
一個典型的示例是每個郵政編碼的居民人數。若僅考慮單位面積的邊界, 我們習慣于在R中看到類似圖1(左)的區域圖。
圖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的空間圖。
圖2:使用qmplot函數進行的Stamen Maps'terrain tile集合的空間散點圖,本文中介紹了函數的實驗融合。
</br>
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相同。
</br>
03 -ggmap 的工作原理
ggmap的基本思路是使用下載的地圖圖像,使用ggplot2將其作為背景層,然后在地圖上繪制數據,統計信息或模型等圖層。
在ggmap中,這個過程被分成兩部分:
(1)下載圖像并對它們進行格式化,使用get_map完成。
(2)使用ggmap完成繪圖。
qmap將這兩個函數結合起來,用于快速繪制繪圖(c.f. ggplot2的ggplot),并且qmplot嘗試將整個繪圖過程封裝成一個簡單的命令(c.f.ggplot2的qplot)。
</br>
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)
qmap(baylor, zoom = 14, source = "osm")
上面的兩幅圖,get_map使用單一簡單的語法為Google Maps(上)和OpenStreetMaps(下)提供了相同的空間范圍,即使它們的API完全不同。
在涉及source和maptype參數之前,需要注意的是,get_map底層API特定的get_ *函數是一個包裝器,它提供了更廣泛的從各自的源下載的機制。
例如,get_googlemap可以訪問Google Static Maps API的全部范圍,如圖4所示。
</br>
05 - get_map的source和maptype參數
使用不同的地圖源(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參數,并且必須與源參數一致。一些大的道路,其它水域,還有一些地理位置的邊界。有些更適合在黑白介質中繪圖;別人只是很高興看。
本節將介紹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")
(圖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不僅具道路和水域的數據,還包括個別建筑物,噴泉,停車標志等細節。缺點是(像谷歌地圖)并不是所有的位置都具有相同的精確度,并且缺陷可能會在小型地圖時更為明顯。
(未完待續)......
“本譯文僅供個人研習、欣賞語言之用,謝絕任何轉載及用于任何商業用途。本譯文所涉法律后果均由本人承擔。本人同意簡書平臺在接獲有關著作權人的通知后,刪除文章。”