溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶服務(wù)條款》

如何理解R語(yǔ)言可視化中g(shù)gplot所支持的數(shù)據(jù)地圖素材類型

發(fā)布時(shí)間:2021-11-22 09:31:55 來(lái)源:億速云 閱讀:450 作者:柒染 欄目:大數(shù)據(jù)

這篇文章將為大家詳細(xì)講解有關(guān)如何理解R語(yǔ)言可視化中g(shù)gplot所支持的數(shù)據(jù)地圖素材類型,文章內(nèi)容質(zhì)量較高,因此小編分享給大家做個(gè)參考,希望大家閱讀完這篇文章后對(duì)相關(guān)知識(shí)有一定的了解。

做了這么多數(shù)據(jù)地圖,是時(shí)候該總結(jié)一些心得和理念了,今天討論ggplot2所支持的數(shù)據(jù)地圖素材格式。

library("plyr")

library("dplyr")

library("rgdal")

library("sf")

library(maptools)

library("ggplot2")

library("ggthemes")

library("geojsonio")

options(stringsAsFactors=FALSE,warn=FALSE,encoding="UTF-8")

今天來(lái)跟大家分享一下關(guān)于ggplot2系統(tǒng)制作數(shù)據(jù)地圖的源數(shù)據(jù)支持問(wèn)題,一直覺(jué)得這個(gè)問(wèn)題很重要。

其實(shí)分享過(guò)這么多期的數(shù)據(jù)地圖,我所用的數(shù)據(jù)地圖素材無(wú)外乎以下三種:

  • 傳統(tǒng)的shp素材;

  • json素材;

  • 地圖包內(nèi)置地圖素材。

其中因?yàn)榈谌N素材的格式跟我們導(dǎo)入的shp空間數(shù)據(jù)集格式一致,這里重點(diǎn)講解前兩種數(shù)據(jù)源。

雖然從數(shù)據(jù)存儲(chǔ)格式上來(lái)講我們分為shp素材、json素材,但是由于在R語(yǔ)言中使用ggplot2作圖,所支持的數(shù)據(jù)集對(duì)象大致又可分為兩類,它們都可以由shp、json數(shù)據(jù)文件轉(zhuǎn)化而來(lái)。

  • sp:SpatialPolygonDataFrame

  • sf:Simple feature list column

所以說(shuō)數(shù)據(jù)文件格式和空間數(shù)據(jù)集對(duì)象格式的關(guān)系可以這么表述:

如何理解R語(yǔ)言可視化中g(shù)gplot所支持的數(shù)據(jù)地圖素材類型

這兩種格式的數(shù)據(jù)集所描述的信息差不多是一致的。第一種格式(sp)是R語(yǔ)言繪圖比較傳統(tǒng)的數(shù)據(jù)格式,它將地理信息數(shù)據(jù)分割為兩大塊:描述層和映射層。

在數(shù)據(jù)存放時(shí),描述層記錄各個(gè)地理區(qū)域的名稱、ID、編號(hào)、簡(jiǎn)寫(xiě)、iOS編碼,以及其他標(biāo)識(shí)信息和度量變量,描述層是一個(gè)dataframe,我們可以用data@data來(lái)提取描述層的數(shù)據(jù)框。

而對(duì)應(yīng)的幾何映射層,是每一個(gè)行政區(qū)域的多邊形邊界點(diǎn),這些邊界點(diǎn)按照order排序,按照group分組。多邊形邊界點(diǎn)信息是一個(gè)多層嵌套的list結(jié)構(gòu),但是我們?nèi)匀豢梢酝ㄟ^(guò)fortity函數(shù)將其轉(zhuǎn)化為數(shù)據(jù)框。

即sp空間數(shù)據(jù)對(duì)象是一個(gè)dataframe(描述層)和polygons(幾何映射層)兩個(gè)對(duì)象的組合對(duì)象。

而sf對(duì)象將這種控件數(shù)據(jù)格式件進(jìn)行了更加整齊的布局,使用st_read()導(dǎo)入的空間數(shù)據(jù)對(duì)象完全是一個(gè)整齊的數(shù)據(jù)框,擁有整齊的行列,這些行列中包含著數(shù)據(jù)描述和幾何多邊形的邊界點(diǎn)信息。其中最大的特點(diǎn)是,它將每一個(gè)行政區(qū)劃所對(duì)應(yīng)的幾何邊界點(diǎn)封裝成了一個(gè)list對(duì)象的記錄,這條記錄就像其他普通的文本記錄、數(shù)值記錄一樣,被排列在對(duì)應(yīng)行政區(qū)劃描述的單元格中。

這樣做的好處是,我們不必要自己做這種從描述層到幾何映射層的對(duì)應(yīng)關(guān)系的鏈接,因?yàn)閷?duì)應(yīng)關(guān)系本身就已經(jīng)存在。然后如果是第一種sp格式的話,在制作ggplot2地圖過(guò)程中,我們需要分離描述層和幾何映射層,并為兩者指定連接的id(主鍵),如果算上你要將自己的業(yè)務(wù)數(shù)據(jù)和描述層數(shù)據(jù)合并這一動(dòng)作的話,那么總共我們需要合并兩次數(shù)據(jù)。(倘若描述層均沒(méi)有對(duì)應(yīng)的id,你需要為其構(gòu)造虛擬id,這一次合并算上的話,那么就需要三次合并)。

然而在sf對(duì)象中我們僅需指定一次合并即可,即描述層和業(yè)務(wù)指標(biāo)數(shù)據(jù)的合并。

接下來(lái)通過(guò)案例演示來(lái)解釋以上原理:

通常我們制作一個(gè)數(shù)據(jù)地圖的方式如下:

shapefile文件導(dǎo)入:

setwd("D:/R/rstudy/CHN_adm")

china_map<-readShapePoly("CHN_adm1.shp")

Warning message:

use rgdal::readOGR or sf::st_read 

當(dāng)我使用sp包導(dǎo)入shp數(shù)據(jù)集時(shí),R提示以上warning,也就意味著這種傳統(tǒng)的方式在不久的將來(lái)就會(huì)被遺棄,而且建議使用rgdal::readOGR和sf::st_read 來(lái)導(dǎo)入。(這也是我今天講這篇內(nèi)容的意義所在,真不好說(shuō)sp包哪天就停止服務(wù)了,之前那那些寫(xiě)過(guò)的代碼可能全部都要掛掉!)

rgdal包可以替代sp包導(dǎo)入shp數(shù)據(jù)(事實(shí)上它也支持json數(shù)據(jù)的導(dǎo)入,似不似很強(qiáng)大),而sf包則是新崛起,支持sf對(duì)象格式導(dǎo)入的包,而且ggplot2率先給這個(gè)包開(kāi)了綠燈,直接創(chuàng)建了geom_sf圖層(之后會(huì)講到)

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包導(dǎo)入該素材,不僅沒(méi)有警示,而且還給出詳細(xì)的數(shù)據(jù)格式描述信息。

此時(shí)按照舊方法,我需要分別提取出描述層的dataframe和幾何映射層的數(shù)據(jù)框。

mydata<-china_map@data

mymapdata<-fortify(china_map)

這樣通過(guò)提取和轉(zhuǎn)化之后,描述層是一個(gè)行政區(qū)域描述信息的數(shù)據(jù)框,幾何映射層轉(zhuǎn)化為一個(gè)包含經(jīng)緯度指標(biāo),group分組標(biāo)量,order排序變量以及ID的數(shù)據(jù)框。

如果我們需要制作填色地圖,那么我們需要先將自己的業(yè)務(wù)指標(biāo)和描述層數(shù)據(jù)進(jìn)行整理和并,并將合并后的數(shù)據(jù)與幾何映射層的數(shù)據(jù)框進(jìn)行合并。

這里我虛擬一個(gè)指標(biāo)。

mydata$zhibiao<-runif(32,10,20)

將其與幾何映射層進(jìn)行合并:

mynewmapdata<-merge(mymapdata[,c(-4,-5)],mydata[,c("ID_1","NAME_1","zhibiao")],by.x="id",by.y="ID_1")

此時(shí)即可進(jìn)行多邊形的填色映射。

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()

如何理解R語(yǔ)言可視化中g(shù)gplot所支持的數(shù)據(jù)地圖素材類型

如果是要添加點(diǎn)映射的話,只需再增加一個(gè)geom_point()的圖層。

這樣的步驟看起來(lái)確實(shí)很繁雜,針對(duì)這種sp格式的地圖數(shù)據(jù),如果你不想做復(fù)雜的合并整理構(gòu)成,ggplot2幾何圖層對(duì)象中有一個(gè)簡(jiǎn)化版的函數(shù)——geom_map()。

這個(gè)函數(shù)雖然使用了兩個(gè)分離的數(shù)據(jù)框:描述層,幾何映射層,但是它可以允許你通過(guò)指定兩者之間的關(guān)鍵詞(主鍵)來(lái)完成這種合并對(duì)接過(guò)程。而不需要做復(fù)雜的拼接合并。(幾何映射層的關(guān)鍵詞必須命名為region,而描述層的關(guān)鍵字命名無(wú)要求,但是需顯聲明指定)

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()

如何理解R語(yǔ)言可視化中g(shù)gplot所支持的數(shù)據(jù)地圖素材類型

以上代碼免去了繁雜的合并轉(zhuǎn)化過(guò)程,節(jié)省了大量代碼,是數(shù)據(jù)格式制作地圖的極佳替代方案。

接下來(lái)談?wù)撓聅f格式,這種格式的數(shù)據(jù)既可以來(lái)源于json格式數(shù)據(jù),也可以來(lái)源于shp格式數(shù)據(jù),非常自由。

china_map<-st_read("CHN_adm1.shp",stringsAsFactors=FALSE,quiet=TRUE)

使用這種格式數(shù)據(jù)進(jìn)行地圖制作,僅需合并一下業(yè)務(wù)數(shù)據(jù)(這里我就直接生成了):

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()

如何理解R語(yǔ)言可視化中g(shù)gplot所支持的數(shù)據(jù)地圖素材類型

關(guān)于json素材的導(dǎo)入,我在之前講leaflet數(shù)據(jù)地圖素材時(shí)已經(jīng)講過(guò)這幾種情況,這里不再贅述。

R語(yǔ)言中可以制作數(shù)據(jù)地圖的包有很多(我長(zhǎng)用到的):

#需要自己準(zhǔn)備數(shù)據(jù)地圖素材:

map()

ggplot(china_map1)+geom_line()  #只能做輪廓圖

ggplot(china_map1)+geom_ploygon()

ggplot(china_map1)+geom_sf()

ggplot(china_map1)+gg_map()

可以調(diào)用在線地圖庫(kù)素材:

ggmap()

leaflet()

REmap()

關(guān)于如何理解R語(yǔ)言可視化中g(shù)gplot所支持的數(shù)據(jù)地圖素材類型就分享到這里了,希望以上內(nèi)容可以對(duì)大家有一定的幫助,可以學(xué)到更多知識(shí)。如果覺(jué)得文章不錯(cuò),可以把它分享出去讓更多的人看到。

向AI問(wèn)一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI