ggplot2多維分面多圖層對應規則

今天只給大家講一個知識點,是屬於ggplot2高階用法中的分面與多圖層關係如何對應,這個用法之前困擾我很久,也是最近幫朋友做東西才發現這個漏洞,於是感覺分享給大家。

ggplot2的多維分面系統非常完美,可以讓我們非常方便的將一個多維度的複雜圖形按照某個維度的類別進行矩陣化,使得單個類別的信息更加清晰明了,數據呈現直觀易懂。

通常我們可以通過如下步驟做出一個基於地理位置的分面圖來。

library(ggplot2) nlibrary(plyr) nlibrary(maptools) nlibrary(Cairo) nlibrary(RColorBrewer) nlibrary(dplyr)n

CHN_adm2 <- readShapePoly("D:/R/rstudy/CHN_adm/CHN_adm2.shp") nCHN_adm2_1 <- fortify(CHN_adm2) ndata1 <- CHN_adm2@data ndata2 <- data.frame(id=row.names(data1),data1) nchina_map_data <- join(CHN_adm2_1,data2, type = "full") ndongsansheng <-subset(china_map_data,NAME_1==c("Heilongjiang","Jilin","Liaoning")) ndongsansheng$NAME_1<-as.character(dongsansheng$NAME_1)n

mydata<-read.csv("D:/R/rstudy/State/dongsansheng.csv",header=T)ndongsansheng<-within(dongsansheng,{nNAME_1[NAME_1=="Heilongjiang"]="黑龍江"nNAME_1[NAME_1=="Jilin"]="吉林"nNAME_1[NAME_1=="Liaoning"]="遼寧"n})n

ggplot()+ ngeom_polygon(data=dongsansheng,aes(x=long,y=lat,group=group),colour="grey40",fill="white") +n facet_grid(.~NAME_1,scales = "free")+n coord_map("polyconic")+n theme_void(base_size=18)n

然而問題來了,以上圖形僅僅基於同一個圖層進行維度分面,倘若我有如下需求,不僅要對地圖進行分面,而且要在單個區域地圖上呈現一些點信息、線條的信息,這就意味著我們需要在保持分面的基礎上,疊加圖層,那麼我們給分面函數指定的分面規則是否能夠作用於第二個圖層呢,或者說想要讓分面函數同事控制所有圖層應該 如何進行參數設定呢,分面參數的控制許可權到底有多高呢?

帶著以上疑問,我們先嘗試著在原始分面圖層的基礎上疊加一個散點圖層。

midpos <- function(x) mean(range(x,na.rm=TRUE))ncentres <- ddply(dongsansheng,.(NAME_2),colwise(midpos,.(long,lat)))nmydata<-mydata%>%merge(centres)nggplot() + geom_polygon(data=dongsansheng,aes(x=long,y=lat,group=group),colour="grey40",fill="white") +n geom_point(data=mydata,aes(x=long,y=lat,size=zhibiao),colour="red",alpha=.5)+n facet_grid(.~NAME_1,scales = "free")+n coord_map("polyconic")+n scale_size_area(max_size=8)+n theme_void(base_size=18)n

然而遺憾的是,我們得到的結果是這樣的,分面函數僅僅控制了第一個圖層(也就是地圖的圖層),卻對第二個圖層(散點圖層沒有任何影響),這不是我們想要的結果,我們想要的是這個分面參數同事完成地圖和散點圖的對應區域分割、匹配。

實際上以上結果並不難解釋,因為我們在分面參數設定是,參數設置的依據是第一個圖層的數據源中的NAME_1欄位,但是我們並沒有保證第二個圖層中有這個同屬性,同名稱的欄位。

事實上為了進行接下來的案例講解,我確實在散點圖的數據源中設定了一個跟多邊形(也就是第一個圖層)數據源的NAME_1同屬性的欄位(裡面記錄的都是類別相同的省份名稱),為了對比效果暫時命名為Province。但是分面函數只能在以上兩個數據框中找到第一個圖層數據源中含有NAME_1變數,而第二個圖層的數據源中儘管有同性質的變數,但是名稱不同,分面函數是無法識別的,因為忽略了對圖層二的分面操作。

接下來將圖層二中的省份名稱變數更改為更圖層一中名稱相同,再看下結果:

mydata<-mydata%>%rename(NAME_1=Province)nggplot() +ngeom_polygon(data=dongsansheng,aes(x=long,y=lat,group=group),colour="grey40",fill="white") +n geom_point(data=mydata,aes(x=long,y=lat,size=zhibiao),colour="red",alpha=.5)+n facet_grid(.~NAME_1,scales = "free")+n coord_map("polyconic")+n scale_size_area(max_size=8)+n theme_void(base_size=18)n

這下效果一目了然,分面函數很順利的識別了通過設定的分面依據欄位NAME_1,在圖層一、圖層二中均探測到了同名欄位,而且欄位結構類別均一致,分面操作成功。

這個知識點相對難理解,屬於ggplot2高階用法中比較深奧的部分,與此相同的還有分面參數的控制許可權範圍問題,即分面參數的控制許可權範圍到底有多高,是否可以控制ggplot父函數內設定的同名參數,關於這一點兒,我先挖個坑,以後有時間再填,如果你感興趣,可以自己通過以上提示,使用今天的案例數據修改參數,自己探索,相信在實踐中提升技能,你學到的才是硬實力。

好了乾貨完了,接下來打一波廣告:

之前很多熱情的小夥伴兒們一直在問我有木有開課程的打算,因為自己一直在忙,再加上錄製課程比較麻煩,一直動沒有動靜,最近機緣巧合,跟知名的大數據在線分享平台——天善智能有了合作,打算做一個關於ggplot2的微課分享。

課程時長很短,大約兩個小時,時間定在9月12日晚8:00~10:00,內容是ggplot2入門,當然我口中的入門你絕對無法從百度、谷歌和知乎的所謂雜貨鋪里尋到,不過如果你願意一絲不苟的去閱讀源文檔,那麼我所講的內容你也許都可以學到,但是基於我一年的高強度實戰經驗,也許我可以幫你你理解的更更深入一些,不太會講也不願意講天花亂墜的宣傳詞,不做任何承諾,能學到什麼,全憑悟性和造化。

兩個小時雖然很短,但是也要賺一口喝水的錢對吧,不然對不起知識,定價19.9!

內容嗎,無外乎這些:(時間有限不應定能夠全部都涉及到)

1、ggplot2圖層語法的核心理念

2、ggplot函數與geom_xxx函數間的父子繼承關係

3、美學映射參數寫在ggplot函數內與寫在geom_xxx內的差異

3、美學映射參數寫在aes函數內部和寫在aes函數外部的差異

4、顏色標度一共有幾種類型和寫法,在不同模塊中是否能夠共用

5、如何結合實際業務與引用場景進行顏色標度選擇

6、多圖層疊加時,如何解決顏色標度衝突的問題

7、分面函數的許可權控制

8、主題框架與模塊間的繼承關係

9、主題函數更新與替換方案

10、圖形輸出與高清抗鋸齒渲染

其實這些問題都是之前我學習過程中走過的彎路,隨著練習的案例越來越多,這些問題一步步全都解決了,其實如果你能有心看完我的所有關於ggplot講解部分,差不多這些問題也都能全部理解。

閱讀原文報名:


推薦閱讀:

在Power Pivot里計算期初期末庫存
猴子訓練營:學習數據分析的意義和實踐計劃
【感恩回饋】贈書贈課程,共40名,快來領:熱烈慶賀偷懶的技術榮獲噹噹網辦公類暢銷榜第2名
剖析用戶生命周期和價值

TAG:R编程语言 | 数据可视化 | 数据分析 |