R 具備了相當完整的繪圖功能,而其繪圖系統大致可分為三大類:
base
與 grid
系統base
是最早期的 R 繪圖系統,功能比較簡單、上手也很容易,但擴充性較差,若要繪製較複雜的圖形會有一些困難。而由於 base
繪圖系統在使用上有些限制,所以後來又發展出一套 grid
繪圖系統,它可以讓使用者以較低階的方式繪圖,例如繪製點、線或是方塊等,雖然 grid
的彈性很大,但是對於資料量比較大的圖形,要用這麼低階的方式畫圖還是會有困難。
lattice
系統lattice
是根據 grid
為基礎所發展出來的一套繪圖系統,對於各種常見的圖形提供了比較高階的繪圖函數,跟傳統的 base
系統相較之下,lattice
主要有兩個特點:
base
是直接畫在螢幕上的),也就是說在 lattice
系統之下,使用者可以對畫出來的圖形做進一步的修改,然後再重新畫出新的結果,對於一系列相類似的圖組也可以使用這樣的技巧加速繪圖的速度,另外也可以把繪圖結果儲存下來,供日後使用。lattice
的第二個特色則是一張圖形中可以包含多個子繪圖區域,亦即使用者可以將多張子圖形直接放在同一張圖中一起比較,省去了自己手動合併多張圖形的困擾。ggplot2
系統ggplot2
也是一個以 grid
所發展出來的繪圖系統,承襲了 lattice
的兩大特色,並加入了繪圖文法的概念,其名稱中的 gg
所代表的是 grammar of graphics,意指將圖形拆解成許多組件的繪圖系統,語法與傳統式的單一函數呼叫繪圖有些不同,而其所產生的圖形也比前兩種繪圖系統美觀。
很不幸地這三種 R 繪圖系統在大部分的狀況下都不相容,雖然最新的 ggplot2
繪圖系統的功能相當完整,而且畫出的圖形也比較漂亮,多數的圖形都可以使用 ggplot2
來完成,但是由於舊的兩個繪圖系統已經在 R 中存在相當長一段時間,有非常大量的 R 套件在繪圖的功能上都是使用這兩個舊系統,所以在使用 R 時難免都會接觸到,所以還是對它們需要有基本的認識。
以下我們介紹各種常見的基本圖型在三種系統的繪圖方式。
散佈圖應該是最簡單也最常用的圖形,主要可以用來檢視不同資料之間的關係。
base
系統在 base
系統可以使用 plot
函數來畫出資料的散佈圖。
plot(iris$Petal.Length, iris$Petal.Width)
plot
函數有許多可調整的參數,col
參數可以調整資料點的顏色,顏色可以使用名稱或是類似 HTML 的十六進位碼來指定,而 pch
可以更換資料點的樣式:
plot(iris$Petal.Length, iris$Petal.Width, col = "red", pch = 8)
若要以 base
繪圖系統將多張圖畫在一起,需要先以 layout
先設定排版方式,雖然可行,但是會比較麻煩一點:
par(mar = c(3, 3, 0.5, 0.5), oma = rep.int(0, 4), mgp = c(2, 1, 0)) species <- levels(iris$Species) plot_numbers <- seq_along(species) layout(matrix(plot_numbers, ncol = 3, byrow = TRUE)) for(s in species) { data.by.species <- subset(iris, Species == s) with(data.by.species, plot(Sepal.Length, Sepal.Width)) }
關於 plot
函數的詳細使用方式,可以參考 R plot 繪圖函數。
lattice
系統在 lattice
繪圖系統中,若要繪製散佈圖則可使用 xyplot
,這個函數是以公式(formula)的方式來指定 x 與 y 軸的資料(關於公式的寫法,可以參考 R 機率分佈與線性模型):
library(lattice) xyplot(Petal.Width ~ Petal.Length, iris)
大部分 xyplot
的參數使用方式跟 base
系統的 plot
相同:
xyplot(Petal.Width ~ Petal.Length, iris, col = "red", pch = 8)
由於 xyplot
是使用公式的方式指定繪圖用的資料,如果要將資料先分組後再畫出每一組的圖形,使用公式的做法非常簡潔:
xyplot(Petal.Width ~ Petal.Length | Species, iris)
layout
參數可以整圖形的排版:
xyplot(Petal.Width ~ Petal.Length | Species, iris, layout = c(3, 1))
使用 lattice
繪圖系統所繪製的圖形可以儲存在變數中,在圖形畫出來之後,還可以陸續更新:
my.plot <- xyplot(Petal.Width ~ Petal.Length | Species, iris, layout = c(3, 1)) my.plot2 <- update(my.plot, col = "red", pch = 8) my.plot2
ggplot2
系統ggplot2
的繪圖方式與以往的繪圖系統有一個根本上的差異,每一張圖都會以 ggplot
函數來建立基本的 ggplot
繪圖物件,並指定資料來源以及資料與圖形之間的對應關係,接著再用加號(+
)連接後續的繪圖類型與細部參數:
library(ggplot2) ggplot(iris, aes(x = Petal.Length, y = Petal.Width)) + geom_point()
ggplot
的第一個參數是指定資料來源的 data frame,而第二個參數則是指定資料與圖形的對應關係,其中 aes
是 ggplot
系統中專門用來指定資料與圖形對應關係的函數,在建立基本的繪圖物件之後,我們再加上一個 geom_point
指定以資料點的方式繪製散佈圖。
若要改變資料點的顏色與樣式,可以在 geom_point
函數中加上一修調整的參數:
ggplot(iris, aes(x = Petal.Length, y = Petal.Width)) + geom_point(color = "red", shape = 8)
若要將資料分組繪圖,可以在繪圖指令的最後加上一個 facet_wrap
,其用法與 lattice
系統類似,也是以公式的方式指定資料:
ggplot(iris, aes(x = Petal.Length, y = Petal.Width)) + geom_point() + facet_wrap(~ Species, ncol = 3)
這裡所使用的公式 ~ Species
代表以 Species
變數分組,若要以多個變數分組,則可以使用類似 ~ var1 + var2 + var3
這樣的寫法。如果要對兩個變數來分組,也可以使用 facet_grid
函數,他可以讓圖形以矩陣的形式呈現。
ggplot
跟 lattice
一樣可以將繪製出來的圖形儲存於變數之中,進行逐步修改:
my.ggplot <- ggplot(iris, aes(x = Petal.Length, y = Petal.Width)) + geom_point() my.ggplot <- my.ggplot + geom_abline(intercept = -0.3631, slope = 0.4158)