您好,登錄后才能下訂單哦!
這篇文章將為大家詳細講解有關如何理解R語言可視化中ggplot所支持的數據地圖素材類型,文章內容質量較高,因此小編分享給大家做個參考,希望大家閱讀完這篇文章后對相關知識有一定的了解。
做了這么多數據地圖,是時候該總結一些心得和理念了,今天討論ggplot2所支持的數據地圖素材格式。
library("plyr")
library("dplyr")
library("rgdal")
library("sf")
library(maptools)
library("ggplot2")
library("ggthemes")
library("geojsonio")
options(stringsAsFactors=FALSE,warn=FALSE,encoding="UTF-8")
今天來跟大家分享一下關于ggplot2系統制作數據地圖的源數據支持問題,一直覺得這個問題很重要。
其實分享過這么多期的數據地圖,我所用的數據地圖素材無外乎以下三種:
傳統的shp素材;
json素材;
地圖包內置地圖素材。
其中因為第三種素材的格式跟我們導入的shp空間數據集格式一致,這里重點講解前兩種數據源。
雖然從數據存儲格式上來講我們分為shp素材、json素材,但是由于在R語言中使用ggplot2作圖,所支持的數據集對象大致又可分為兩類,它們都可以由shp、json數據文件轉化而來。
sp:SpatialPolygonDataFrame
sf:Simple feature list column
所以說數據文件格式和空間數據集對象格式的關系可以這么表述:
這兩種格式的數據集所描述的信息差不多是一致的。第一種格式(sp)是R語言繪圖比較傳統的數據格式,它將地理信息數據分割為兩大塊:描述層和映射層。
在數據存放時,描述層記錄各個地理區域的名稱、ID、編號、簡寫、iOS編碼,以及其他標識信息和度量變量,描述層是一個dataframe,我們可以用data@data來提取描述層的數據框。
而對應的幾何映射層,是每一個行政區域的多邊形邊界點,這些邊界點按照order排序,按照group分組。多邊形邊界點信息是一個多層嵌套的list結構,但是我們仍然可以通過fortity函數將其轉化為數據框。
即sp空間數據對象是一個dataframe(描述層)和polygons(幾何映射層)兩個對象的組合對象。
而sf對象將這種控件數據格式件進行了更加整齊的布局,使用st_read()導入的空間數據對象完全是一個整齊的數據框,擁有整齊的行列,這些行列中包含著數據描述和幾何多邊形的邊界點信息。其中最大的特點是,它將每一個行政區劃所對應的幾何邊界點封裝成了一個list對象的記錄,這條記錄就像其他普通的文本記錄、數值記錄一樣,被排列在對應行政區劃描述的單元格中。
這樣做的好處是,我們不必要自己做這種從描述層到幾何映射層的對應關系的鏈接,因為對應關系本身就已經存在。然后如果是第一種sp格式的話,在制作ggplot2地圖過程中,我們需要分離描述層和幾何映射層,并為兩者指定連接的id(主鍵),如果算上你要將自己的業務數據和描述層數據合并這一動作的話,那么總共我們需要合并兩次數據。(倘若描述層均沒有對應的id,你需要為其構造虛擬id,這一次合并算上的話,那么就需要三次合并)。
然而在sf對象中我們僅需指定一次合并即可,即描述層和業務指標數據的合并。
接下來通過案例演示來解釋以上原理:
通常我們制作一個數據地圖的方式如下:
shapefile文件導入:
setwd("D:/R/rstudy/CHN_adm")
china_map<-readShapePoly("CHN_adm1.shp")
Warning message:
use rgdal::readOGR or sf::st_read
當我使用sp包導入shp數據集時,R提示以上warning,也就意味著這種傳統的方式在不久的將來就會被遺棄,而且建議使用rgdal::readOGR和sf::st_read 來導入。(這也是我今天講這篇內容的意義所在,真不好說sp包哪天就停止服務了,之前那那些寫過的代碼可能全部都要掛掉!)
rgdal包可以替代sp包導入shp數據(事實上它也支持json數據的導入,似不似很強大),而sf包則是新崛起,支持sf對象格式導入的包,而且ggplot2率先給這個包開了綠燈,直接創建了geom_sf圖層(之后會講到)
china_map<-readOGR("CHN_adm1.shp",stringsAsFactors=FALSE)
OGR data source with driver: ESRI Shapefile
Source: "CHN_adm1.shp", layer: "CHN_adm1"
with 32 features
It has 9 fields
同樣我用rgdal包導入該素材,不僅沒有警示,而且還給出詳細的數據格式描述信息。
此時按照舊方法,我需要分別提取出描述層的dataframe和幾何映射層的數據框。
mydata<-china_map@data
mymapdata<-fortify(china_map)
這樣通過提取和轉化之后,描述層是一個行政區域描述信息的數據框,幾何映射層轉化為一個包含經緯度指標,group分組標量,order排序變量以及ID的數據框。
如果我們需要制作填色地圖,那么我們需要先將自己的業務指標和描述層數據進行整理和并,并將合并后的數據與幾何映射層的數據框進行合并。
這里我虛擬一個指標。
mydata$zhibiao<-runif(32,10,20)
將其與幾何映射層進行合并:
mynewmapdata<-merge(mymapdata[,c(-4,-5)],mydata[,c("ID_1","NAME_1","zhibiao")],by.x="id",by.y="ID_1")
此時即可進行多邊形的填色映射。
ggplot()+
geom_polygon(data=mynewmapdata,aes(x=long,y=lat,group=group,fill=zhibiao),col="grey95")+
scale_fill_gradient(low="white",high="steelblue") +
coord_map("polyconic") +
theme_map()
如果是要添加點映射的話,只需再增加一個geom_point()的圖層。
這樣的步驟看起來確實很繁雜,針對這種sp格式的地圖數據,如果你不想做復雜的合并整理構成,ggplot2幾何圖層對象中有一個簡化版的函數——geom_map()。
這個函數雖然使用了兩個分離的數據框:描述層,幾何映射層,但是它可以允許你通過指定兩者之間的關鍵詞(主鍵)來完成這種合并對接過程。而不需要做復雜的拼接合并。(幾何映射層的關鍵詞必須命名為region,而描述層的關鍵字命名無要求,但是需顯聲明指定)
ggplot(mydata,aes(map_id=ID_1))+
geom_map(aes(fill=zhibiao),map=mymapdata %>% rename(region=id))+
scale_fill_gradient(low="white",high="steelblue") +
expand_limits(x=mynewmapdata$long,y=mynewmapdata$lat)+
coord_map("polyconic")+
theme_map()
以上代碼免去了繁雜的合并轉化過程,節省了大量代碼,是數據格式制作地圖的極佳替代方案。
接下來談論下sf格式,這種格式的數據既可以來源于json格式數據,也可以來源于shp格式數據,非常自由。
china_map<-st_read("CHN_adm1.shp",stringsAsFactors=FALSE,quiet=TRUE)
使用這種格式數據進行地圖制作,僅需合并一下業務數據(這里我就直接生成了):
china_map$zhibiao<-runif(32,10,20)
china_map <- sf::st_transform(china_map, "+init=epsg:4326")
ggplot(china_map)+
geom_sf(aes(fill=zhibiao),col="grey95")+
scale_fill_gradient(low="white",high="steelblue") +
coord_sf()+
theme_map()
關于json素材的導入,我在之前講leaflet數據地圖素材時已經講過這幾種情況,這里不再贅述。
R語言中可以制作數據地圖的包有很多(我長用到的):
#需要自己準備數據地圖素材:
map()
ggplot(china_map1)+geom_line() #只能做輪廓圖
ggplot(china_map1)+geom_ploygon()
ggplot(china_map1)+geom_sf()
ggplot(china_map1)+gg_map()
可以調用在線地圖庫素材:
ggmap()
leaflet()
REmap()
關于如何理解R語言可視化中ggplot所支持的數據地圖素材類型就分享到這里了,希望以上內容可以對大家有一定的幫助,可以學到更多知識。如果覺得文章不錯,可以把它分享出去讓更多的人看到。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。