分面也就是切割數據生成一系列小聯號圖,每個小圖表示不同的數據子集。本篇將討論如何較好的微調分面,特別是與位置標度相近的方法。
在qplot中可以選擇分面系統。2維分面使用face_grid,1維分面使用face_wrap。
分面通常會占用大量空間,因此本篇使用mpg數據集的子集來進行展示。
> library(ggplot2) > mpg2 <- subset(mpg,cyl != 5 &drv %in% c("4","f"))
1.網格分面
網格分面在2維網格中展示圖形,輸入分面表達式時,你需要設定哪些變量作為分面繪圖的行,哪些變量作為列,規則如下:
- 不進行分面,我們將得到一個單獨的面板
> qplot(cty,hwy,data=mpg2) + facet_null()
- 一行多列 :". ~ a"
電腦屏幕通常較寬,因此這個方向最合適數據的展示。另外,因為坐標軸相同,這個方向也有助於y位置的比較。
qplot(cty,hwy,data=mpg2) + facet_grid(. ~ cyl)
- 一列多行:"b ~ ."
橫坐標軸相同,利於x位置的比較,尤其是對數據分布的比較。
> qplot(cty,data=mpg2,geom="histogram",binwidth=2) + facet_grid(cyl ~ .)
- 多行多列:"a ~ b"
我們通常都將因子水平數目最大的變量按列排放,這樣可以充分利用屏幕的寬高比。
> qplot(cty,hwy,data=mpg2) + facet_grid(drv ~ cyl)
從以上圖形我們可以看出,變量在某行或者某列一起出現時,圖形只會展示數據中出現的變量組合。而變量在行和列都出現時,圖形將展示所有變量組合,包括原始數據中都沒有出現的組合。不過這也可能會導致出現空白面板。
邊際圖:可以參考margins來繪制邊際圖。設定margins=TRUE可展示所有的邊際圖,或者margins=c("sex","age"),列出你要展示的邊際圖的變量名稱。也可以使用grand_row或grand_col來生成行或列的邊際圖。
邊際圖的分組方式與其他面板中分組方式相同:默認使用圖層中所有分類變量的交互作用。下面第三張圖表示對每個驅動類型添加彩色平滑線。
> p <- qplot(displ,hwy,data=mpg2) + geom_smooth(method = "lm",se=F) > p + facet_grid(cyl ~ drv) > p + facet_grid(cyl ~ drv,margins = T)
> qplot(displ,hwy,data=mpg2) + geom_smooth(aes(colour=drv),method="lm",se=F)+
+ facet_grid(cyl ~ drv,margins=T)
2.標度控制
對於上述分面,可以通過調整參數scales來控制面板的位置標度是固定的還是允許變化的。
- scales = "fixed":x和y的標度在所有面板中都相同
- scales = "free":x和y的標度在每個面板都可以變化
- scales = "free_x":x的標度可變,y的尺度固定
- scales = "free_y": y的標度可變,x的尺度固定‘
下面展示了固定標度與自由標度間的差異:
> library(ggplot2) > p <- qplot(cty,hwy,data=mpg) > p + facet_wrap(~ cyl) ##下圖左 每個分面中固定標度即橫縱坐標范圍相同 > p + facet_wrap(~ cyl,scales="free") ##下圖右 自由標度即橫縱坐標范圍可變 >
固定標度可以讓我們在相同的基准上對子集進行比較,觀察在哪些地方各子集有相似的總體模式。而自由標度可以幫助我們發現更多細節,它在展示不同量綱的時間序列時非常有用。
> library(reshape2) > em <- melt(economics,id = "date") > qplot(date,value,data=em,geom="line",group=variable)+ + facet_grid(variable~.,scale="free_y") >
上圖展示了自由標度在展示不同量綱的時間序列時非常有用。
3.分組與分面
與通過調整圖形屬性不同(比如顏色、形狀或大小)來分組分組不同,分面提供了另外一種分組途徑。依據子集相對位置的不同,這兩種繪圖技巧都有相應的優缺點。
在分面圖形中,每個組別都在單獨的面板中,相隔較遠,組間無重疊。因此組與組之間重疊嚴重時,分面圖形有一定的好處。不過這也會導致組間的細微差別難以被發現。使用圖形屬性區分各組時,各組將會離得很近甚至可能重疊,不過細微得差別將會容易被發現。下圖展示了兩者優缺點得互補。
> library(ggplot2) > xmaj <- c(0.3,0.5,1,3,5) > xmin <- as.vector(outer(1:10,10^c(-1,0))) > ymai <- c(500,1000,5000,10000) > ymin <- as.vector(outer(1:10,10^c(2,3,4))) > dplot <- ggplot(subset(diamonds,color %in% c("D","E","G","J")),aes(carat,price,colour=color)) + + scale_x_log10(breaks = xmaj,labels = xmaj,minor = xmin)+ + scale_y_log10(breaks=ymai,labels=ymai,minor=ymin)+ + scale_colour_hue(limits = levels(diamonds$color))+ + theme(legend.position="none") > dplot + geom_point()
> dplot + geom_point()+facet_grid(.~color)
> dplot + geom_smooth(method=lm,se=F,fullrange=T)
> dplot + geom_smooth(method=lm,se=F,fullrange=T)+facet_grid(.~color)
在散點圖中,僅使用顏色區分各組,我們可能還沒注意到圖形重疊了,但是回歸線卻可以讓我們看到D、E、和G被分組在一起,與J組相距甚遠。
4.並列與分面
分面可繪制出與圖形並列類似得圖形效果。
> qplot(color,data=diamonds,geom="bar",fill=cut,position="dodge") ##並列 > qplot(cut,data=diamonds,geom="bar",fill=cut)+facet_grid(.~color)+ + theme(axis.text.x=element_text(angle=90,hjust=1,size=8,colour="grey50")) ##分面
除標注方式外,當兩個變量得因子水平幾乎完全交叉,而部分變量組合缺失時,兩種繪圖方式也就會有所不同。此時,並列圖形得用處不大,因為它只是對條形局部地分割,沒有任何標簽。而分面就實用很多,它能控制分割方式時局部得還是全局得。