R語言可視化——圖表嵌套(母子圖)
之前在學習ggplot的時候,一直存在著一個困惑。
就是這個函數是否允許兩個做出來的兩個相關圖表重疊嵌套(也就是在一個大圖(主圖)的邊緣位置,放置另一個縮小版的小圖)。
這個想法很奇葩,本來想著沒啥希望,鑒於該包的開發者那犀利的審美觀,估計也不能允許這種情況的發生。
不過最近瀏覽一位大神的博客,真的有這種情況的解決措施,喜出望外,趕緊在這裡分享給大家。
不過他的處理方式不是通過ggplot的內置函數,而是通過grid包中的viewport函數來實現的:
以下是具體的實現步驟:
載入包:
library(ggplot2) #用於畫圖,主圖和附圖都使用ggplot的內置數據集library(grid) #用於設定附圖的長寬及疊放在主圖的精確位置
載入並預覽數據集:
這裡我們還是使用關於鑽石的那個數據集(之前的圖表案例很多都是使用該數據集)
data(diamonds)head(diamonds)
#製作複合圖的主圖:
chart1<-ggplot(diamonds,aes(carat,price,colour=cut))+geom_point()+theme(legend.position=c(0.9,0.72),legend.background=element_rect(I(0)))
以上函數可以製作出以carat和price為主要對應關係的散點圖,同時分類變數cut通過顏色映射進行區分。最後調整了圖例位置和圖表背景。
#設定附圖長寬及其最終落在主圖上的精確位置:vie<-viewport(width_=0.669,height=0.4,x=0.7,y=0.306)
#製作附圖
chart2 <-ggplot(diamonds,aes(depth,fill=cut,alpha=.2))+geom_density()+xlim(54,70) + theme(axis.text.y=element_text(face="bold",colour="black"), axis.title.y=element_blank(), axis.text.x=element_text(face="bold",colour="black"), plot.background=element_rect(I(0),linetype=0), panel.background=element_rect(I(0)), panel.grid.major=element_line(colour=NA), panel.grid.minor=element_line(colour=NA), legend.background=element_rect(I(0),linetype=1), legend.position=c(0.85,0.72))chart2 #預覽附圖
因為附圖要放置在主圖邊緣並且縮放很大比例,為了防止其背景和網格線系統遮擋主圖的重要信息,對其主題元素進行了大量的簡化。
將主圖與附圖合成一併顯示:
print(chart2,vp=vie)
將以上代碼打包組合:
chart1<-ggplot(diamonds,aes(carat,price,colour=cut))+geom_point()+theme(legend.position=c(0.9,0.72),legend.background=element_rect(I(0)))chart1vie<-viewport(width_=0.669,height=0.4,x=0.7,y=0.306)chart2 <-ggplot(diamonds,aes(depth,fill=cut,alpha=.2))+geom_density()+xlim(54,70) + theme(axis.text.y=element_text(face="bold",colour="black"), axis.title.y=element_blank(), axis.text.x=element_text(face="bold",colour="black"), plot.background=element_rect(I(0),linetype=0), panel.background=element_rect(I(0)), panel.grid.major=element_line(colour=NA), panel.grid.minor=element_line(colour=NA), legend.background=element_rect(I(0),linetype=1), legend.position=c(0.85,0.72))print(chart2,vp=vie)
其實仔細看這種做法,裡面也不外乎圖層疊加,先做出主圖,然後通過viewport函數將附圖縮小併疊加到主圖上,不過這種方式用來展示一些需要多角度透視的數據分布問題還是很合適的,而且因為是依賴於不同的包,所有主圖與附圖之間沒有嚴格的類型限制,你所需要做的只是調整好兩個圖表的位置與大小,別讓彼此相互遮擋掩蓋重要信息就OK了。
下面我將附圖的類型更換為堆積直方圖大家看下效果:
chart1<-ggplot(diamonds,aes(carat,price,colour=cut))+geom_point()+theme(legend.position=c(0.9,0.72),legend.background=element_rect(I(0)))chart1vie<-viewport(width_=0.669,height=0.4,x=0.7,y=0.306)chart2 <-ggplot(diamonds,aes(depth,fill=color))+geom_histogram()+xlim(54,70) + theme(axis.text.y=element_text(face="bold",colour="black"), axis.title.y=element_blank(), axis.text.x=element_text(face="bold",colour="black"), plot.background=element_rect(I(0),linetype=0), panel.background=element_rect(I(0)), panel.grid.major=element_line(colour=NA), panel.grid.minor=element_line(colour=NA), legend.background=element_rect(I(0),linetype=1), legend.position=c(0.85,0.72))print(chart2,vp=vie)
聯繫方式:
wechat:ljty1991
Mail:578708965@qq.com 個人公眾號:數據小魔方(datamofang) 團隊公眾號:EasyCharts qq交流群:[魔方學院]553270834推薦閱讀:
※Python 數據可視化?
※R語言之數據可視化
※有趣!如何用Python-matplotlib繪製雙層餅圖及環形圖?
※10分鐘python圖表繪製 | seaborn入門(一):distplot與kdeplot