數據地圖多圖層對象的顏色標度重疊問題解決方案

一篇舊文,解決一個困擾已經的小技術問題,權當是學習ggplot2以來的整理回顧與查漏補缺。

今天這一篇是昨天推送的基礎上進行了進一步的深化,主要講如何在離散顏色填充的地圖上進行氣泡圖圖層疊加。

為了使得案例前後一致,仍然使用昨天的數據集。

載入包:

library("ggplot2")library("plyr")library("maptools")library("sp")library("ggthemes")

導入中國省界地圖:

china_map<-readShapePoly("D:/R/rstudy/CHN_adm/bou2_4p.shp")data1<- china_map@data data2<- data.frame(id=row.names(data1),data1)

數據格式轉化及業務數據合併:

china_map1 <- fortify(china_map) china_map_data <- join(china_map1,data2, type = "full") mydata <- read.csv("D:/R/rstudy/Province/geshengzhibiao.csv")china_data <- join(china_map_data, mydata, type="full")

各省省會城市經緯度數據:

province_city <- read.csv("D:/R/rstudy/Province/chinaprovincecity.csv")

###根據自己的數據量級和具體業務需要設置分割點

mydata<-mydata[,-c(5,6)]mydata$zhibiao<-rnorm(33,100,50)mydata$zhibiao<-abs(mydata$zhibiao)mydata$zhibiao2<-round(mydata$zhibiao,0)mydata$fau <- cut(mydata$zhibiao, breaks = c(0,50,100,150,200,250))

###將轉換的分段因子變數重新命名為我們需要的分段閥值:

mydata$fam<-factor(mydata$fau,levels=c((0,50],(50,100],(100,150],(150,200],(200,250]),labels=c(0~50,50~100,100~150,150~200,200~250),order=TRUE)

#將業務數據與地理信息數據合併:

china_data <- join(china_map_data, mydata, type="full") windowsFonts(myFont = windowsFont("微軟雅黑"))

離散標度填充:

ggplot(china_data, aes(x = long, y = lat, group = group,fill =fam)) + geom_polygon(colour="white")+ scale_fill_brewer(palette="Blues") + ###Blues&Greens coord_map("polyconic") + ggtitle("某公司2015~2016年度營業狀況分布圖")+ guides(fill=guide_legend(reverse=TRUE,title=NULL))+ theme_map() %+replace% theme(legend.position = c(0.08,0.4),legend.text.align=1)

在離散顏色標度的基礎上添加各省份散點圖:

ggplot() + geom_polygon(data=china_data, aes(x=long,y=lat,group=group,fill=fam),colour="white")+ geom_point(data=province_city,aes(x=jd,y=wd),colour="red")+ scale_fill_brewer(palette="Blues") + ###Blues&Greens coord_map("polyconic") + ggtitle("某公司2015~2016年度營業狀況分布圖")+ #寫入標題 guides(fill=guide_legend(reverse=TRUE,title=NULL))+ theme_map() %+replace% theme(legend.position = c(0.08,0.4),legend.text.align=1)

更該散點圖為氣泡圖:

province_city$PerforamA<-round(rnorm(34,100,30),0)province_city$PerforamB<-round(rnorm(34,100,30),0)

ggplot() + geom_polygon(data=china_data, aes(x=long,y=lat,group=group,fill=fam),colour="white")+ geom_point(data=province_city,aes(x=jd,y=wd,size=PerforamA),shape=21,fill="#8E0F2E",colour="black",alpha=0.6)+ scale_fill_brewer(palette="Blues") + ###Blues&Greens scale_size_area(max_size=6)+ coord_map("polyconic") + ggtitle("某公司2015~2016年度營業狀況分布圖")+ #寫入標題 guides(fill=guide_legend(reverse=TRUE,title=NULL),size=guide_legend(reverse=TRUE,title=NULL))+ theme_map() %+replace% theme(legend.position = c(0.08,0.4),legend.text.align=1)

本來打算再繼續在氣泡圖的基礎上進行顏色漸變填充呢,可以試了一下,這樣的話前面的底圖離散顏色標度填充的的時候已經使用過了一個fill屬性設置選項,而要對氣泡圖進行顏色漸變填充就要再使用一次fill屬性,可是目前為止我還不知道如何在多圖層中出現多個fill屬性的時候如何識別並分別進行標度設置,當我運行如下代碼時,軟體無法識別兩個顏色標度設置分別對應的指標,因而圖表無法跑出來:

ggplot() + geom_polygon(data=china_data, aes(x=long,y=lat,group=group,fill=fam),colour="white")+ scale_fill_brewer(palette="Blues") + ###Blues&Greens geom_point(data=province_city,aes(x=jd,y=wd,size=PerforamA,fill=PerforamB),shape=21,fill="#8E0F2E",colour="black",alpha=0.6)+ scale_size_area(max_size=6)+ scale_fill_gradient2(low="DarkCyan", mid="Azure", high="Sienna", midpoint=median(province_city$PerforamB))+ coord_map("polyconic") + ggtitle("某公司2015~2016年度營業狀況分布圖")+ #寫入標題 guides(fill=guide_legend(reverse=TRUE,title=NULL),size=guide_legend(reverse=TRUE,title=NULL))+ theme_map() %+replace% theme(legend.position = c(0.08,0.4),legend.text.align=1)

Scale for fill is already present. Adding another scale for fill, which will replace the existing scale.Error: Discrete value supplied to continuous scale

實在是太遺憾了,不知道哪位大神知道如何處理多圖層相同的fill屬性,可以告知在下,這裡先行謝過了。

那麼這個問題真的那麼難解決嗎,倘若放在半年以前,確實如此,那個時候為此糾結了很久,一直耿耿於懷,可是如今的我,水平已經今非昔比了哈哈哈(容我傲嬌一下~)

其實問題是這樣的,該圖表對象的需要三層顏色標度映射。

  • 最底層的離散填充標度;

  • 氣泡圖的大小標度:

  • 氣泡圖的填充標度;

困擾我的問題是,底層的多邊形填充使用了一次fill屬性,而氣泡的顏色填充又使用了一次fill屬性,所以兩個顏色標度——

撞車了……

軟體無法識別兩個標度參數:

  • scale_fill_brewer(palette="Blues")

  • scale_fill_gradient2(low="DarkCyan", mid="Azure", high="Sienna")

分別是作用於那個圖層的:

  • geom_polygon()

  • geom_point()

所以自己就崩潰罷工了~

當時想的方法是,是否可以給兩個fill標度進行組合或者命名,最後也沒搞定該如何進行區分。

前不久跟我的一個朋友聊天,聊起這個問題,也沒有直接的解決方法, 可以聊天過程中突然發現了一條線索,R語言環境中的形狀一共有25種,其中1~20種僅有colour屬性而沒有fill屬性,21~25種既有colour屬性又有fill屬性,而我平時作圖使用氣泡圖的時候,用慣了21號形狀(主要是擁有兩個顏色調整參數,比較利於後期屬性調整)。

所以針對這個案例,使用21號形狀的fill屬性進行氣泡內顏色標度映射,必然與多邊形的fill映射衝撞,那麼現在問題就好辦了,放棄使用21號形狀,選擇一個只有colour屬性映射的形狀編號進行映射。

其中16、19號都符合要求,我隨表挑選一個16號吧……

ggplot() + geom_polygon(data=china_data, aes(x=long,y=lat,group=group,fill=fam),colour="white")+ scale_fill_brewer(palette="Greens") + ###Blues&Greens geom_point(data=province_city,aes(x=jd,y=wd,size=PerforamA,colour=PerforamB),shape=16)+ scale_size_area(max_size=6)+ scale_colour_gradient(low="white",high="#D73434")+ coord_map("polyconic") + ggtitle("某公司2015~2016年度營業狀況分布圖")+ #寫入標題 guides(fill=guide_legend(reverse=TRUE,title=NULL),size=guide_legend(reverse=TRUE,title=NULL))+ theme_map() %+replace% theme(legend.position = c(0.08,0.4),legend.text.align=1)

聯繫方式:

微信:ljty1991

博客主頁:raindus home

個人公眾號:數據小魔方(datamofang)

團隊公眾號:EasyCharts

qq交流群:[魔方學院]553270834

推薦閱讀:

數據分析領域裡,R和Python到底哪個市場需求大?
數據分析學習階段小結
我為什麼要在Excel和R之間徘徊——數據分析者的基本修養
簡單數據分析
【數據獲取】文件讀取與R數據集

TAG:R编程语言 | 数据可视化 | 地图 |