分類: R

R 資料探索與基本繪圖

R 繪圖系統

R 具備了相當完整的繪圖功能,而其繪圖系統大致可分為三大類:

basegrid 系統

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 時難免都會接觸到,所以還是對它們需要有基本的認識。

以下我們介紹各種常見的基本圖型在三種系統的繪圖方式。

散佈圖(Scatter Plots)

散佈圖應該是最簡單也最常用的圖形,主要可以用來檢視不同資料之間的關係。

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,而第二個參數則是指定資料與圖形的對應關係,其中 aesggplot 系統中專門用來指定資料與圖形對應關係的函數,在建立基本的繪圖物件之後,我們再加上一個 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 函數,他可以讓圖形以矩陣的形式呈現。

ggplotlattice 一樣可以將繪製出來的圖形儲存於變數之中,進行逐步修改:

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)

散佈圖與迴歸線

Page: 1 2 3 4 5 6 7

G. T. Wang

個人使用 Linux 經驗長達十餘年,樂於分享各種自由軟體技術與實作文章。

Share
Published by
G. T. Wang

Recent Posts

[DIY] 自製凡士林火種

這裡介紹如何利用簡單的凡士林與...

3 年 ago

[DIY] 自製火影木葉、砂忍者村標誌雕刻木牌

本篇記錄我用路邊撿來的樟木與龍...

3 年 ago

收集龍眼木修剪枝幹用於木頭工藝

最近打算帶著阿玄做一些木工作品...

3 年 ago

[DIY] 樟木手工自製迷你手裏劍(忍者武器)

本篇記錄阿玄第一次使用木工工具...

3 年 ago

[DIY] 龍眼木手工自製木槌

本篇記錄我用自己砍的龍眼木還有...

3 年 ago

[DIY] 樟木手工自製苦無(忍者武器)

本篇記錄我自己用樟木的枝幹,以...

3 年 ago