最近我一直嘗試利用R繪制地圖,我從網上找到了上百種不同的實現方法,然而其中卻沒有適用於我的數據的方法。最終,我從以下幾個博客【1】中找到了靈感。我在整合這些資源的基礎上,通過不斷的試驗和修正得到了一個較好地解決方案。這個方案就是本篇博文的主要內容。
本篇博文中展示了如何利用 ggplot2 來繪制分級統計地圖,同時還介紹了如何更改圖例、顏色等參數指標,以及如何導出圖像文件。
繪制分級統計地圖需要一些軟件包,你最好確認你的電腦中已經安裝並加載了它們。我們利用 maptools 庫中的 readShapeSpatial() 函數來讀取形狀數據。形狀數據是儲存了經緯度等地圖信息的空間向量數據。好消息是,你可以免費下載這些數據!比如,你可以在這個網站中【2】下載全球各個 國家的形狀數據。
我的項目是對印度的數據進行繪圖分析,所以我下載了印度的形狀數據並將它們導入到 R 中。
我們所導入的形狀數據是一個空間類型的數據,我們可以檢查它的變量名來觀測它包含哪些內容。比如我們可以輸出各個邦的名稱:
現在我們已經得到目標數據。接下來我將會編造一些數據,你也可以導入 csv 格式的數據或者從你估計的模型中提取數據。最重要的一點是,新導入的數據中 id 號碼必須和形狀數據中的 id 一致,因為我們等會要合並這兩個數據集。
[譯者注]此處代碼有誤,原數據的ID編碼為1287-1321,所以“id=1:num.states”應改為“id=1286+(1:num.states)”。
現在我們需要整合形狀數據和目標數據集。首先,我們利用 ggplot 中的 fortify() 函數將形狀數據轉換成數據框格式的數據。該函數可以根據特定的識別變量將數據轉化成數據框格式。
[譯者注]此處顯示的 ID 數據與原數據集的 ID 數據不一致。
我們可以看到這是一個常見的數據框格式的數據,其中列向量包含了經緯度數據。
接下來我們根據 ID 數據合並兩個數據集,並保證空間數據集中沒有缺失值。更重要的是,我們需要根據變量 order 對數據集進行排序。
我們准備利用 ggplot()、geom_polygon() 和 coord_map() 函數來繪圖。
上一部分只是繪圖的開始,我們還可以通過調整其他參數使圖形變得更漂亮。首先,我們可以利用 ggmap() 庫中的 theme_nothing() 來刪除背景和網格線,同時還需要設置 legend 的參數繪制圖例。當然,我們還可以更改圖例和整個圖像的標題。
接下來,我們將配色改為“YlGn”(從黃色到綠色過渡)。你可以通過 display.brewer.all() 函數來觀察具體配色情況。
我們也可以利用 scales 庫中的 pretty_breaks() 函數來獲取最佳分割點。如果你不喜歡 pretty_breaks() 的方法,你還可以通過 scale_fill_gradient() 來實 現:scale_fill_gradient(name=”var”,limits=c(0,100),low=”white”,high=”red”)
如果你想要將數值表示為暗色而不是亮色,那麼你們可以在 scale_fill_distiller() 中加入 trans=”reverse”。
如果你面對的是離散型變量,那麼你應該采用 scale_fill_manual() 函數:
此外,你還可以將各個邦的名稱也繪制到地圖上。首先,你需要識別出每個邦名對應的經緯度數據。本文中,我們利用 aggregate() 函數計算每個州經緯度取值范圍的均值並作為對應邦名的坐標。
雖然這張圖看起來有點亂,但是通過其他設置它將變得非常有用。當然你還可以利用 geom_text() 在地圖中添加一些重要的識別信息。
最後,我們可以用兩種方法導出地圖數據。
方法一:利用 Cairo 來導出地圖。(MAC需要安裝 X11)
首先我們將圖像保存到對象中,然後利用 ggsave() 將該對象轉化成 png 文件。
方法二:利用 pdf() 函數將對象保存為 pdf 文件
【1】 http://www.kevjohnson.org/making-maps-in-r/ ;
http://blog.revolutionanalytics.com/2009/11/choropleth-challenge-result.html
【2】http://www.diva-gis.org/gdata
http://rforpublichealth.blogspot.de/2015/10/mapping-with-ggplot-create-nice.html
原文作者:Slawa Rokicki
翻譯:Fibears