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