R數據可視化--ggplot2定位之分面


分面也就是切割數據生成一系列小聯號圖,每個小圖表示不同的數據子集。本篇將討論如何較好的微調分面,特別是與位置標度相近的方法。

在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")) ##分面

  

除標注方式外,當兩個變量得因子水平幾乎完全交叉,而部分變量組合缺失時,兩種繪圖方式也就會有所不同。此時,並列圖形得用處不大,因為它只是對條形局部地分割,沒有任何標簽。而分面就實用很多,它能控制分割方式時局部得還是全局得。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM