1.映射
在上一節練習ggplot繪圖的藝術-2:ggplot2的繪圖思想中,我們已經涉及到了映射的概念。
所謂映射,就是數據集中的數據關聯到相應的圖形屬性過程中一種對應關系。
映射主要分為以下幾種類型:
- 顏色類:color(顏色或邊框顏色)、fill(填充顏色)和alpha(透明度)
- 形狀類:linetype(線型)、size(點的大小或線的寬度)和shape(形狀)
- 位置類:x、y、xmin、xmax、ymin、ymax、xend、yend
- 特殊類:一類是group和order,另一類是字符串映射
下面,就以上述的映射關系進行演示:
#加載所需的包
library(ggplot2)
library(dplyr)
#使用ggplot2進行繪圖,建立相應的映射關系
ggplot(data = dexp, aes(x = Sample, y = Expression))+
geom_point(aes(color = Gene,
size = Length,
shape = Group))
以上代碼作出圖的效果如下:
2.分組
在ggplot中我們大概可以把幾何對象分為2種:
- 個體幾何對象:繪制的圖像中的每一個點對應數據框中的每一個觀測值,如geom_point
- 群組幾何對象:繪制的圖像中的每一個對象,對應數據框中多個觀測值的統計結果,如geom_boxplot(用于繪制箱線圖)
所以在使用類似于geom_boxplot這一類群組幾何對象時,需要進行分組,ggplot默認以離散型變量分組。
變量按其數值表現是否連續,分為連續變量和離散變量。離散變量指變量值可以按一定順序一一列舉,通常以整數位取值的變量。在一定區間內可以任意取值的變量叫連續變量,其數值是連續不斷的,相鄰兩個數值可作無限分割,即可取無限個數值。
#繪制背景圖層
p <- ggplot(data = dexp, aes(x = Sample, y = Expression))
#添加箱線圖層,默認以離散型變量Sample進行分組
p + geom_boxplot()
#繪制背景圖層
p <- ggplot(data = dexp, aes(x = Sample, y = Expression))
#添加箱線圖層,指定以Group進行分組
p + geom_boxplot(aes(group = Group))
3.分面
在進行生物信息學數據處理時,我們有時需要按不同的變量進行分組,分別繪制圖形。比如,在上面的例子中。我們如果想要以Group分組,分別繪制基因的表達信息,實現一頁多圖的效果,如何實現呢?這就要涉及到ggplot中的另一個非常重要的概念:分面。
ggplot中實現分面有兩個函數:facet_wrap和facet_grad。
(1)facet_wrap:以一個變量進行分面
facet_wrap(facets, nrow = NULL, ncol = NULL, scales = "fixed",
shrink = TRUE, labeller = "label_value", as.table = TRUE,
switch = NULL, drop = TRUE, dir = "h", strip.position = "top")
重要參數:
- facets:分面參數如~Group,表示用Group變量進行數據分類
- nrow:繪制圖形的行數
- ncol:繪制圖形的列數,一般nrow/ncol只設定一個即可
- scales:
fixed,小圖都使用統一的坐標
free:每個小圖按照自己的數據自由調整坐標
free_x:自由調整X軸刻度范圍
free_y:自由調整y軸刻度范圍
ggplot(data = dexp, aes(x = Sample, y = Expression))+
geom_point(aes(color = Gene,
size = Length,
shape = Group))+
facet_wrap(~Group, scales = "free")
效果如下:
#以基因進行分面,繪制每個基因的表達量
ggplot(data = dexp, aes(x = Sample, y = Expression))+
geom_point()+
facet_wrap(~Gene, scales = "free", nrow = 10)
結果如下:
(2)facet_grid:同時以兩個變量進行分面
facet_grid(facets, margins = FALSE, scales = "fixed", space = "fixed",shrink = TRUE, labeller = "label_value", as.table = TRUE,switch = NULL, drop = TRUE)
與facet_wrap不同的重要參數:
- facets:應用兩個變量分面,如Gene~Group,意為按Gene分行,按Group分列
- margins:True,包含所有數據的組
- space:每張小圖的坐標軸寬度,值同scales
以兩個變量Gene和Group進行分面:
dexp_small<-filter(dexp, Gene %in% paste("G", 1:10, sep = ""))
ps <- ggplot(data = dexp_small, aes(x = Sample, y = Expression))
ps + geom_point(aes(color = Length))+
facet_grid(Gene~Group,scales = "free")
結果如下: