【R】用 ggplot2 绘制漂亮的分级统计地图
最近我一直嘗試?yán)肦繪制地圖,我從網(wǎng)上找到了上百種不同的實現(xiàn)方法,然而其中卻沒有適用于我的數(shù)據(jù)的方法。最終,我從以下幾個博客【1】中找到了靈感。我在整合這些資源的基礎(chǔ)上,通過不斷的試驗和修正得到了一個較好地解決方案。這個方案就是本篇博文的主要內(nèi)容。
本篇博文中展示了如何利用 ggplot2 來繪制分級統(tǒng)計地圖,同時還介紹了如何更改圖例、顏色等參數(shù)指標(biāo),以及如何導(dǎo)出圖像文件。
數(shù)據(jù)預(yù)處理
繪制分級統(tǒng)計地圖需要一些軟件包,你最好確認(rèn)你的電腦中已經(jīng)安裝并加載了它們。我們利用 maptools 庫中的 readShapeSpatial() 函數(shù)來讀取形狀數(shù)據(jù)。形狀數(shù)據(jù)是儲存了經(jīng)緯度等地圖信息的空間向量數(shù)據(jù)。好消息是,你可以免費下載這些數(shù)據(jù)!比如,你可以在這個網(wǎng)站中【2】下載全球各個 國家的形狀數(shù)據(jù)。
我的項目是對印度的數(shù)據(jù)進行繪圖分析,所以我下載了印度的形狀數(shù)據(jù)并將它們導(dǎo)入到 R 中。
我們所導(dǎo)入的形狀數(shù)據(jù)是一個空間類型的數(shù)據(jù),我們可以檢查它的變量名來觀測它包含哪些內(nèi)容。比如我們可以輸出各個邦的名稱:
現(xiàn)在我們已經(jīng)得到目標(biāo)數(shù)據(jù)。接下來我將會編造一些數(shù)據(jù),你也可以導(dǎo)入 csv 格式的數(shù)據(jù)或者從你估計的模型中提取數(shù)據(jù)。最重要的一點是,新導(dǎo)入的數(shù)據(jù)中 id 號碼必須和形狀數(shù)據(jù)中的 id 一致,因為我們等會要合并這兩個數(shù)據(jù)集。
[譯者注]此處代碼有誤,原數(shù)據(jù)的ID編碼為1287-1321,所以“id=1:num.states”應(yīng)改為“id=1286+(1:num.states)”。
現(xiàn)在我們需要整合形狀數(shù)據(jù)和目標(biāo)數(shù)據(jù)集。首先,我們利用 ggplot 中的 fortify() 函數(shù)將形狀數(shù)據(jù)轉(zhuǎn)換成數(shù)據(jù)框格式的數(shù)據(jù)。該函數(shù)可以根據(jù)特定的識別變量將數(shù)據(jù)轉(zhuǎn)化成數(shù)據(jù)框格式。
[譯者注]此處顯示的 ID 數(shù)據(jù)與原數(shù)據(jù)集的 ID 數(shù)據(jù)不一致。
我們可以看到這是一個常見的數(shù)據(jù)框格式的數(shù)據(jù),其中列向量包含了經(jīng)緯度數(shù)據(jù)。
接下來我們根據(jù) ID 數(shù)據(jù)合并兩個數(shù)據(jù)集,并保證空間數(shù)據(jù)集中沒有缺失值。更重要的是,我們需要根據(jù)變量 order 對數(shù)據(jù)集進行排序。
基礎(chǔ)繪圖
我們準(zhǔn)備利用 ggplot()、geom_polygon() 和 coord_map() 函數(shù)來繪圖。
高階繪圖
上一部分只是繪圖的開始,我們還可以通過調(diào)整其他參數(shù)使圖形變得更漂亮。首先,我們可以利用 ggmap() 庫中的 theme_nothing() 來刪除背景和網(wǎng)格線,同時還需要設(shè)置 legend 的參數(shù)繪制圖例。當(dāng)然,我們還可以更改圖例和整個圖像的標(biāo)題。
接下來,我們將配色改為“YlGn”(從黃色到綠色過渡)。你可以通過 display.brewer.all() 函數(shù)來觀察具體配色情況。
我們也可以利用 scales 庫中的 pretty_breaks() 函數(shù)來獲取最佳分割點。如果你不喜歡 pretty_breaks() 的方法,你還可以通過 scale_fill_gradient() 來實 現(xiàn):scale_fill_gradient(name=”var”,limits=c(0,100),low=”white”,high=”red”)
其他參數(shù):
如果你想要將數(shù)值表示為暗色而不是亮色,那么你們可以在 scale_fill_distiller() 中加入 trans=”reverse”。
如果你面對的是離散型變量,那么你應(yīng)該采用 scale_fill_manual() 函數(shù):
此外,你還可以將各個邦的名稱也繪制到地圖上。首先,你需要識別出每個邦名對應(yīng)的經(jīng)緯度數(shù)據(jù)。本文中,我們利用 aggregate() 函數(shù)計算每個州經(jīng)緯度取值范圍的均值并作為對應(yīng)邦名的坐標(biāo)。
雖然這張圖看起來有點亂,但是通過其他設(shè)置它將變得非常有用。當(dāng)然你還可以利用 geom_text() 在地圖中添加一些重要的識別信息。
導(dǎo)出地圖數(shù)據(jù)
最后,我們可以用兩種方法導(dǎo)出地圖數(shù)據(jù)。
方法一:利用 Cairo 來導(dǎo)出地圖。(MAC需要安裝 X11)
首先我們將圖像保存到對象中,然后利用 ggsave() 將該對象轉(zhuǎn)化成 png 文件。
方法二:利用 pdf() 函數(shù)將對象保存為 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
總結(jié)
以上是生活随笔為你收集整理的【R】用 ggplot2 绘制漂亮的分级统计地图的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 如何查询送修的 iPhone 维修状态?
- 下一篇: 如何解决php Snoopy.class