您好,登錄后才能下訂單哦!
本篇內容主要講解“ggplot2怎么通過顏色信號來對多邊形進行填充”,感興趣的朋友不妨來看看。本文介紹的方法操作簡單快捷,實用性強。下面就讓小編來帶大家學習“ggplot2怎么通過顏色信號來對多邊形進行填充”吧!
ggplot2所有圖層對象中,geom_ploygon()幾何圖層對象最為復雜,也最為特殊:
復雜在哪兒呢?
這種幾何對象所定義的多邊形(特別是在地理信息數(shù)據(jù)里面),領土邊界是基于行政區(qū)劃、行政區(qū)劃再細分為單個多邊形(也就是group),單個多邊形又是一組經(jīng)緯度坐標點構成(按照order排序)。
所以說geom_ploygon()所要顯式聲明的參數(shù)至少需要四個:
data(地理信息數(shù)據(jù)框)
long(經(jīng)度簡寫)
lat(維度簡寫)
group(多邊形分組變量)
即該圖層至少需要這四個參數(shù)才能保證可以輸出一張具有完成地理信息邊界的地圖出來。
注意了,我這里所說的完整的地理信息邊界,并不帶表行政邊界,地理信息邊界僅僅描述地球上實際存在的地理單位輪廓,所以這張圖僅僅是地理輪廓的描述,而無法看到國界線。
那么國界線是通過什么定義的呢?
國家線通常需要在group的基礎上,施加id(該id將同屬一個國家的不同group歸類為一個編號),當然我們也可以將id匹配上國家(行政區(qū)劃)的實際名稱(通常獲取的數(shù)據(jù)地圖素材都會同時匹配上id和行政區(qū)劃名稱,甚至還有很多附加信息:ios編碼、簡寫、拼音、英文名稱等等)。
那么問題來了,為啥之前所說的order沒有在geom_polygon()參數(shù)中進行顯式聲明呢?
邊界點不聲明順序,軟件如何知道該按照什么樣的順序來進行打印呢?
這個問題是個好問題,一語中的,確實,order變量十分重要,但是通常獲取的地理信息文件中,order變量是已經(jīng)按照group分組變量排序過的,即通常所用到的地理信息數(shù)據(jù)框中,所有的邊界點經(jīng)緯度信息,是先按group分組,組內按照order排序,這樣保證最后繪制出的地理信息邊界點不會出現(xiàn)錯亂,不同多邊形有連接線等這種我們不想看到的情形。
當這種group和order順序定義之后,軟件首先將所有的經(jīng)緯度坐標點按照group順序打印,即先打印group順序排在第一的多邊形,group內部按照order的順序,依次打印左邊點,單個group但因完畢之后,這組點就被定義為一組,組標識即為group的名稱(可以為數(shù)值、浮點或者文本,主要能夠區(qū)分開組別就可以)。
當所有的組內經(jīng)緯度點都按照此規(guī)則打印一遍之后,我們就可以看到整個地理信息邊界的輪廓。
此時地理信息輪廓定義完成,那么接下來需要進行顏色映射,顏色映射規(guī)則很簡單,不同的國家(或者行政區(qū)劃)對應一個ID或者區(qū)劃名稱,每一個區(qū)劃名稱(或者國家,這里統(tǒng)稱為id)則對應若干個group(之所有是若干個,是因為這里的對應關系可能是一一對應,也可能是一對多的關系,因為之前在講述如何從json素材提取地理信息數(shù)據(jù)框已經(jīng)講述過原理,有些國家或者行政區(qū)僅有一個輪廓,而有些國家或者地區(qū)有多個地理上相互分離的領土,比如愛爾蘭、英國、中國的海南島、臺灣省、以及東南沿海諸多海島等)。
而每一個id(國家或者地區(qū))會對應一個數(shù)值型(或者因子型變量),當你在給ID賦值指標變量的時候,就已經(jīng)完成了group到顏色之間的對應映射關系。
我們只需要一個fill\colour美學映射屬性指定給一個指標變量(數(shù)值型或者因子型),指定之后,軟件會在打印每一個地理多邊形同事,給這個多邊形指定填充色(或者輪廓色)。因為可能存在一個id對應多個多邊形(group)的情況,所以這些同屬一個id的多邊形都會被填充(或者輪廓色)同一個數(shù)量級的填充色(或者輪廓色)。
所以到這里,我們再回頭看以上內容:
一副完整的,帶有行政區(qū)劃與指標變量映射關系的geom_polygon()的圖層完整的語法需要指定以下一個參數(shù):
gggplot(data=mydata)+
geom_polygon(aes(x=long,y=lat,group=group,fill/colour=zhibiao))
以上是最為典型的數(shù)據(jù)地圖做法,fill/colour的顏色映射結果會根據(jù)zhibiao變量的性質進行映射形式調整,即如果zhibiao是連續(xù)型變量,那么最終就會按照連續(xù)漸變色進行填充,圖例也是練習漸變的圖例,指標是分類或者因子型,則會按照離散漸變進行填充。(至于這兩種顏色映射方法的具體規(guī)則和原理,以后會講到)。
沒有考慮order并不代表,order不重要,事實上,order是非常重要的一個變量,只是它已經(jīng)被提前考慮過了(因為太重要了),所以我們需要再考慮它,但是倘若數(shù)據(jù)順序因為某種原因而被打亂了,那么我們需要自己重新排序。
通常只需追加一句代碼:
dplyr::arrange(mymapdata,group,order)
即先按照group分組,組內按照order排序,這樣既可保證最終的數(shù)據(jù)是符合幾何圖層映射規(guī)則,能被正確映射出來的。
接下來我用幾個圖形來展示以上所說的所有的原理:
library(maps)
library("ggplot2")
library("ggthemes")
library("ggthemes")
library("RColorBrewer")
world_map<-map_data("world")
head(world_map)
ggplot(world_map)+
geom_polygon(aes(x=long,y=lat))
以上我未指定分組變量,所以自然映射結果出現(xiàn)這種情況,即軟件將所有點全部連在一起。
ggplot(data=world_map)+
geom_polygon(aes(x=long,y=lat,group=group),colour="white")
指定分組之后,勾勒出了地理信息輪廓,事實上此時你并不知道國家的分界線(你只是基于常識,記得那個國家在那個位置,但是精確的領土分界是無法得知的,相信我~)
world_map[world_map$region=="Taiwan",]$region<-"China"
ggplot(data=world_map)+
geom_polygon(aes(x=long,y=lat,group=group,fill=region),color="grey95")+
theme_map() %+replace% theme(legend.position ="none")
此時通過region映射之后的地圖,呈現(xiàn)的才是相對精確的行政區(qū)劃邊界信息。
(這里說明以下,所用地圖僅用于案例演示使用,限于經(jīng)濟能力,無法獲得高精度地圖,如果出現(xiàn)邊界線糾紛問題,不代表官方觀點)。
當然,你可以將顏色映射在行政區(qū)劃的輪廓線上。(但是只這樣往往是不可取的,因為輪廓線顏色色彩占比太少,不利于肉眼識別,區(qū)分度不高)
ggplot(data=world_map)+
geom_polygon(aes(x=long,y=lat,group=group,color=region),fill="grey95")+
theme_map() %+replace% theme(legend.position ="none")
以上使用的region(即地區(qū)ID)映射,因為此份地圖有將近200+個國家行政區(qū),免不了顏色重復,而且通常我們并不必要將每一個國家和地區(qū)都指定一個單獨的顏色。
更有意義的做法是,根據(jù)不同國家或者地區(qū)的某個指標進行連續(xù)漸變填充或者離散顏色填充。
region<-unique(world_map$region)
zhibiao<-runif(251,0,500)
mydata<-data.frame(region,zhibiao)
mydata$factor<-cut(mydata$zhibiao,breaks=c(0,100,200,300,400,500),labels=c("0~100","100~200","200~300","300~400","400~500"),order=TRUE,include.lowest = FALSE)
mynewmapdata<-merge(world_map,mydata)%>%dplyr::arrange(group,order)
連續(xù)漸變:
ggplot(data=mynewmapdata)+
geom_polygon(aes(x=long,y=lat,group=group,fill=zhibiao),colour="grey95")+
scale_fill_gradient(low="white",high="steelblue") +
theme_map() %+replace% theme(legend.position ="none")
離散填充:
ggplot(data=mynewmapdata)+
geom_polygon(aes(x=long,y=lat,group=group,fill=factor),colour="grey95")+
scale_fill_brewer(palette="Greens",guide=FALSE)+
theme_map() %+replace% theme(legend.position ="none")
到此,相信大家對“ggplot2怎么通過顏色信號來對多邊形進行填充”有了更深的了解,不妨來實際操作一番吧!這里是億速云網(wǎng)站,更多相關內容可以進入相關頻道進行查詢,關注我們,繼續(xù)學習!
免責聲明:本站發(fā)布的內容(圖片、視頻和文字)以原創(chuàng)、轉載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權請聯(lián)系站長郵箱:is@yisu.com進行舉報,并提供相關證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權內容。