ggmap:使用ggplot2進行空間可視化繪圖(下篇)
作者:戴維 · 卡爾&哈德利·威克姆
翻譯:李博
原文地址:ggmap: Spatial Visualization with ggplot2PS:由於原文較長,故翻譯分為三次進行。
======================================
09.ggmap的實用函數
ggmap有幾個實用函數,可以幫助探索空間數據分析。
001.geocode函數
從地址轉換到經度/緯度坐標的方式,實際上是對空間數據進行可視化的必要條件。但問題是,這一過程幾乎總是要通過使用必要的地理信息系統(GIS)、同時需要保存結果並將其導入到R中,最後在R外部完成。
而geocode(地理編碼)函數將該過程簡化為R中一行命令。
geocode是一個向量化函數,它接受字元串並返回地理信息的數據集。在output =「simple」的默認情況下,只返回經緯度。
這些實際上是Mercator對1984年世界大地測量系統(WGS84)的普遍預測,這是Google Maps使用球形地球模型的來源。當output=「more」時,會返回一個較大的數據集,該數據集提供了更多的Google地理編碼信息:
> geocode("baylor university", output = "more")lon lat type loctype address north south east1 -97.11441 31.54872 university approximate [long address] 31.55823 31.53921 -97.0984west postal_code country administrative_area_level_21 -97.13042 76706 united states mclennanadministrative_area_level_1 locality street streetNo point_of_interest1 texas waco s 5th st 1311 <NA>
#在個人電腦上運行後情況
> library(ggmap)#谷歌地圖API服務條款。Google Maps API Terms of Service: http://developers.google.com/maps/terms.> geocode("baylor university", output = "more")Information from URL : http://maps.googleapis.com/maps/api/geocode/json?address=baylor%20university&sensor=false lon lat type loctype1 -97.11431 31.54984 establishment approximate address north south east west1 1301 s university parks dr, waco, tx 76798, usa 31.55119 31.54849 -97.11297 -97.11566 street_number route locality administrative_area_level_21 1301 South University Parks Drive Waco McLennan County administrative_area_level_1 country postal_code1 Texas United States 76798
特別是,各級政府機構的報告。若設定output=「all"時,則返回整個JSON對象,該對象由谷歌地理編碼API解析。參考下面的代碼。
## output = "all"的時,返回詳細信息情況(節選一部分)。> library(ggmap)> geocode("baylor university", output = "all")Information from URL : http://maps.googleapis.com/maps/api/geocode/json?address=baylor%20university&sensor=false$results$results[[1]]$results[[1]]$address_components$results[[1]]$address_components[[1]]$results[[1]]$address_components[[1]]$long_name[1] "1301"$results[[1]]$address_components[[1]]$short_name[1] "1301"$results[[1]]$address_components[[1]]$types[1] "street_number"
地理編碼API有一些防止濫用的要求限制。
一個未指明的短期rate(見圖文)以及24小時2500個請求的限制,通過隱藏的全局變數可以在一定程度上進行檢測。
GooglegGocodeQueryCount和輸出函數geocodequerycheck,geocode使用它們監控自己的進度,要麼(1)根據使用情況調整運行速度或(2)如果查詢超出限制則彈出一個錯誤提示,值得注意是,revgeocode共享相同的請求響應,同時是由相同的變數和函數監測。
要了解更多關於谷歌地理編碼、距離矩陣,和API方向的使用規則,請參考文獻中列出的網站。
002.revgeocode函數
在某些情況下,將經度/緯度坐標轉換為物理地址是很有用的,使用revgeocode函數這樣做是可能的,不過這將依賴於Google地理編碼API。
> gc <- geocode("baylor university")> (gc <- as.numeric(gc))[1] -97.11441 31.54872> revgeocode(gc)[1] "S 1st St, Baylor University, Waco, TX 76706, USA"Like geocode , more output can be provided as well –> revgeocode(gc, output = "more")address route establishment neighborhood locality1 [long address] S 1st St Baylor University Baylor Wacoadministrative_area_level_2 administrative_area_level_1 country postal_code1 McLennan Texas United States 76706
因此,除了反向地理編碼的物理位置(即:地址),revgeocode可以報告在不同尺寸級別上的情況。最後,output="all"選項可以返回 Google報告的整個JSON對象。
003.mapdist函數
在空間環境中,計算人們常說的「距離」的能力,是很了不起的事,因此這也為GIS輸送了大量的分析人員。使用Google Distance Matrix AI,ggmap能夠為Google提供駕駛,騎自行車或步行路線的距離。除了距離之外,Google還會報告預計的剩餘時間。輸出結果存放在易於使用的數據集中。
例如:
> from <- c("houston", "houston", "dallas")> to <- c("waco, texas", "san antonio", "houston")> mapdist(from, to)from to m km miles seconds minutes hours1 houston waco, texas 298004 298.004 185.1797 11907 198.45 3.3075002 houston san antonio 320764 320.764 199.3227 11997 199.95 3.3325003 dallas houston 387389 387.389 240.7235 14592 243.20 4.053333
自己運行後情況
> library(ggmap)載入需要的程輯包:ggplot2Google Maps API Terms of Service: http://developers.google.com/maps/terms.Please cite ggmap if you use it: see citation("ggmap") for details.> from <- c("houston", "houston", "dallas")> to <- c("waco, texas", "san antonio", "houston")> mapdist(from, to)by using this function you are agreeing to the terms at :http://code.google.com/apis/maps/documentation/distancematrix/Information from URL : http://maps.googleapis.com/maps/api/distancematrix/json?origins=dallas&destinations=houston&mode=driving&sensor=falseInformation from URL : http://maps.googleapis.com/maps/api/distancematrix/json?origins=houston&destinations=waco+texas%7Csan+antonio&mode=driving&sensor=false from to m km miles seconds minutes hours1 houston waco, texas 298587 298.587 185.5420 10332 172.2000 2.8700002 houston san antonio 317170 317.170 197.0894 10474 174.5667 2.9094443 dallas houston 385035 385.035 239.2607 12476 207.9333 3.465556
上面默認的運輸工具是汽車。然而,其它模式也是可用的。輸入的形式,可以是物理地址(理想),或(「白宮」),或地理坐標(即反向地理編碼)。當輸出默認為上面所看到的數據集格式時,設置output=「all」,則從谷歌獲取完整的JSON對象。
Distance Matrix API將用戶限制為每個查詢100個請求,每10秒100個請求,每24小時2500個請求。在能夠輕鬆監控這些限制的情況下,導出函數distQueryCheck可幫助用戶跟蹤其剩餘的查詢次數。它依賴於隱藏的全局變數".GoogleDistQueryCount(谷歌距離查詢數量) "
> distQueryCheck()2495 distance queries remaining.> .GoogleDistQueryCounttime url elements1 2012-03-16 00:12:11 [url used] 12 2012-03-16 00:16:10 [url used] 2
如果用戶超過了查詢上限,mapdist要麼(1)暫停,直到到短期的請求限制已經失效或(2)報錯,如果沒有查詢的話。因此,它幾乎與用於地理編碼的原理相同。如果用戶認為這不正確,則mapdist參數規範「override_limit = TRUE」可以覆蓋。
mapdist輸出的數據集非常便於用ggplot2繪圖。圖11提供一個例子。從一個位置到附近好幾個位置的距離,(1)可以使用mapdist進行測定。(2)使用cut可以進行分類,(3)使用一個qmap組合進行繪圖。比如:geom_text 和geom_rect。可以用布景對行程時間分類。完整的代碼在ggmap文檔的示例部分中。
圖11004.route函數
route函數提供構成兩個位置之間路線序列的地圖距離。每條路線都具有開始和結束經度/緯度坐標,以及與mapdist報告的相同單位的距離和持續時間。按照序列組成的路線集,構成了一個單獨的,並可使用geom_leg繪製的路線。
在圖12中可以看到,使用geom_leg繪製路線,就是一個很好例證,其中在相同的兩個位置之間繪製了三條路線。這些可以使用route函數中的「alternatives = TRUE」參數獲得。備選方案要求是,從起點到目的地的多條路線;返回值添加到一個附加變數數據集中,用於路由標識符(A,B,C等)。
legs_df <- route(』marrs mclean science, baylor university』,』220 south 3rd street, waco, tx 76701』,alternatives = TRUE)qmap(』424 clay avenue, waco, tx』, zoom = 15, maptype = 』hybrid』,base_layer = ggplot(aes(x = startLon, y = startLat), data = legs_df)) +geom_leg(aes(x = startLon, y = startLat, xend = endLon, yend = endLat,colour = route),alpha = 3/4, size = 2, data = legs_df) +labs(x = 』Longitude』, y = 』Latitude』, colour = 』Route』) +facet_wrap(~ route, ncol = 3) + theme(legend.position = 』top』)
與地圖距離一樣,在給定時間內可以請求的路線同樣受到限制。留下的查詢數由「.GoogleRouteQueryCount」變數與「routeQueryCheck」函數進行監控。
繪製形狀文件
作為最後一個例子,這可能太常見了以至於被忽略,用ggmap繪製形狀文件是一件輕而易舉的工作,可以通過幾種方式完成。最簡單的方法是使用fortify(ggplot2),並通過點/路徑/多邊形圖層添加到地圖方法,將形狀文件轉換為數據框。可以通過簡單的更多的Geom層來添加附加層。
圖13顯示繪製美國2000年人口普查,以及完整代碼的基本示例。
# get an example shape file#獲取一個示例形狀文件download.file(』http://www.census.gov/geo/cob/bdy/tr/tr00shp/tr48_d00_shp.zip』,destfile = 』census.zip』)# unzip, and load tools#解壓縮和載入工具unzip(』census.zip』); library(maptools); library(gpclib); library(sp);gpclibPermit()# read data into R#讀取數據到R中shapefile <- readShapeSpatial(』tr48_d00.shp』,proj4string = CRS("+proj=longlat +datum=WGS84"))# convert to a data.frame for use with ggplot2/ggmap and plot#轉換數據框,使用 ggplot2/ggmap 進行繪圖data <- fortify(shapefile)qmap(』texas』, zoom = 6, maptype = 』satellite』) +geom_polygon(aes(x = long, y = lat, group = group), data = data,colour = 』white』, fill = 』black』, alpha = .4, size = .3)
結論和方向展望
建立在ggplot2之上,ggmap為可視化空間數據提供了幾個新的有用工具。從理論上說,分層圖形的語法嘗試強制繪圖的兼容性,從而實現良好的繪圖實踐。但實際上,在ggplot2上構建ggmap可以使結果更好,因為ggplot2的全部功能都接受了考驗。
未來的一些發展方向,應該在ggmap存儲包中。新的osmar包集成了R和OpenStreetMap數據結構,Stamen Maps和CloudMade Maps被渲染,從而打開了使用ggmap(Eugster和Rug)在R上繪製地圖或衛星圖像的可能性。或者,與R中的其它空間包集成的,可以為空間數據分析提供幾個非常實用的工具。最後,Google Elevation API和Places API提供了更多有趣的探索,可以像其它Google API一樣融入ggmap框架,為用戶提供額外的功能,而且可以免費提供地理數據。
感謝和參考資料略,詳見原文。
(全文完)
=========================================
翻譯後記:
斷斷續續接近半個多月的翻譯,昨天終於完成,今天屬於整理髮布。
5月28日發布翻譯的第一部分,6月2日發布翻譯第二部分,到今天6月11日發布第三部分。完整的18頁PDF,硬是讓我拆成了三篇,專業的理論文章,確實較難理解。
遇到的困難,一個是原文的專業術語和大量的縮寫,讓我在嘗試過程中陷入糾結,雖然藉助google進行輔助翻譯,但是要表達出作者的本意,我還是打了很大折扣。
二是文中大量的長句,對於我這不及格的英文水平,看到長長的句子,就開始發懵,想拆成小的部分,都難以做到。即使查到每個單詞的意思,可想表達的意思就是連不起來,反覆的捋順,通過口語化再進行書面表達。
三是有幸學過一段時間R語言,對涉及R語言中的相關函數和包的翻譯及理解,使得在相關翻譯中才勉強可為。同時也從側面反應了個人在中文使用上的局限,尤其在文字表達和邏輯理解方面欠缺,這需要逐步加強。
最後,非常感謝大數據社群的小夥伴。在知乎上得到了來自社群小夥伴的鼓勵,猴子老師的鞭策,讓我一步一步的完成翻譯。同時感謝身邊同事的包容,感謝jc,小羅,木恆的大力支持,謝謝你們。有你們在,我會堅定的走下去。
推薦閱讀:
※Apache kylin內部解剖
※業務人員不知道如何提出 BI 需求,老闆不重視 BI 項目怎麼辦?
※知識本體與大數據處理續
※數據分析探索之旅(一):學習數據分析的初衷與規劃
※24頁PPT詳解數據分析師成長之路 ---來自 陳丹奕 11月24 微課分享課件