這裡介紹如何使用 R 的 ggplot2 繪圖套件,輕鬆畫出高品質的各種統計圖形。

ggplot 是以繪圖文法概念為基礎所發展出來的一套 R 繪圖系統,可繪製各種高品質圖形的 R 繪圖套件,是一套相當受歡迎的繪圖工具。

在使用上,ggplot 這種繪圖系統不同於以往傳統式的 R 繪圖方式,使用者不會受限於既有的固定功能,可以依照自己的需求組合各種圖形組件、任意調整圖形,產生各種變化,相當富有彈性,而其畫出來的圖形品質也非常好,通常使用預設的設定值就可以很容易地產生出版品水準的圖形。


在傳統的 R 繪圖系統之下,一般的繪圖工具所提供的只是一些固定的繪圖功能,頂多加上一些微調參數讓使用者做些微的調整,若要自行設計新的圖形,使用者能使用的繪圖組件只有資料點、線條等低階的元素,既有的高階圖形完全無法重複使用。

ggplot 系統之下,繪圖文法的設計可以讓使用者以更高階的思維模式來設計繪圖,有許多既有的高階圖形元素可以使用,例如資料的呈現以及統計上的資料轉換方式等,使用者只要運用這些 ggplot 系統下的元件,就可以快速組裝出適用於自己的圖形。

以下我們將從 ggplot 繪圖系統的基礎概念開始介紹,敘述如何使用這個系統中的各種繪圖組件創建各式各樣的圖形,同時也會提供各種常用圖形的範例,縱使在不熟悉 ggplot 的繪圖概念之下,也可以畫出自己需要的圖形。

ggplot 繪圖文法

繪圖文法(grammar of graphics)的概念最早是由 Wilkinson 所提出來的,其主要用來解釋統計圖形(statistical graphic)的概念,而後來 Wickham 則是以 Wilkinson 的繪圖文法理論為基礎,做了一些調整後應用於 R 語言中,發展出了 ggplot 這個繪圖系統。

ggplot 系統將圖形視為一個從資料開始的一連串轉換,轉換的過程中間有很多道程序,包含幾何圖案、顏色與大小等美學屬性、統計量的計算與座標系統等,一個圖形就是原始資料結合這些轉換之後的結果。

ggplot-grammar-of-graphics-stack-1

ggplot 繪圖架構

  • 資料來源(data):指定原始資料來源的 data frame。
  • 美學對應(aesthetic):指定原始資料與圖形之間的對應關係,例如哪一個變數要當作 x 座標變數,而哪一個要當作 y 座標變數,還有資料繪圖時的樣式等。
  • 幾何圖案(geometry):要用什麼幾何圖形繪製資料,例如點、線條、多邊形等。
  • 繪圖面(facet):指定如何將資料分散在多張子圖形中繪製,以利互相比較。
  • 統計轉換(statistical transformation):指定如何以將資料轉換為各種統計量,例如將連續型資料轉為離散型的類別。
  • 座標系統(coordinate system):指定繪圖時所使用的座標系統,除了常見的笛卡兒直角座標系統,也可以使用極坐標或地圖投影(map projection)。
  • 主題(theme):控制資料以外的繪圖組件,例如座標軸、說明文字等。

簡單的圖形只要有資料來源、美學對應以及幾何圖案的設定就可以畫出來了,而其餘轉換則是可以依照需求自行增減,以下我們將陸續介紹各種轉換的組件與使用方式。

安裝 ggplot2 套件

在使用 ggplot 繪圖之前,請先安裝 ggplot2 這個 R 套件,這個套件在 R 官方的套件庫中就有收錄,使用 install.packages 安裝即可:

install.packages("ggplot2")

接著載入 ggplot2 套件:

library(ggplot2)

qplot 函數

qplot 函數是 ggplot 系統中最基本的一個繪圖函數,它的設計類似傳統 plot 函數,方便讓初次使用 ggplot 的使用者快速上手,繪製一些基本的圖形。

這裡我們以一組 R 內建的 diamonds 資料集來示範 qplot 的用法,這組資料預設就內建在 ggplot2 套件中,在 ggplot2 套件安裝後即可使用。

diamonds 資料集中包含了大約五萬多顆鑽石的資料,其中包含鑽石的 4C 品質指標,亦即顏色(color)、淨度(clarity)、切磨(Cut)與克拉(carat),另外還包含了幾個鑽石的尺寸資訊,詳細說明可參考 diamonds 的線上手冊。

首先我們用 head 稍微看一下 diamonds 資料集中的實際資料:

head(diamonds)

由於 diamonds 資料集的資料有五萬多筆,有些圖形會需要使用較少量的資料做示範,所以我們另外抽樣出 100 筆,儲存在 diamonds.subset 這個 data frame 中:

set.seed(5)
diamonds.subset <- diamonds[sample(nrow(diamonds), 100), ]

基本用法

qplot 的用法與傳統的 plot 類似,前兩個參數分別是 x 軸與 y 軸的座標資料:

qplot(diamonds$carat, diamonds$price)
r-package-ggplot2-tutorial-qplot-1

散佈圖

另外也可以使用 data 參數指定資料來源的 data frame,這種方式會讓指令比較簡潔:

qplot(carat, price, data = diamonds)
r-package-ggplot2-tutorial-qplot-2

散佈圖

這張圖顯示了鑽石的價格(price)與它的克拉數(carat)有明顯的關係,不過這個關係看起來不是線性的,我們可以將變數透過對數(log)轉換一下:

qplot(log(carat), log(price), data = diamonds)
r-package-ggplot2-tutorial-qplot-3

散佈圖

經過對數轉換之後,看起來就呈現比較好的線性關係。

我們也可以使用多個變數進行運算之後,作為 x 軸或 y 軸的座標值:

qplot(carat, x * y * z, data = diamonds)
r-package-ggplot2-tutorial-qplot-4

散佈圖

這裡我們拿 diamondsxyz 三個變數相乘,當作 y 軸的座標,畫出與 carat 的關係圖,看起來大部分鑽石的體積都跟重量成正比,也就是密度都差不多,不過也有許多 outliers。

圖形樣式

qplot 有提供一些參數可以讓使用者更改資料點的顏色、大小等樣式,而且在使用上會比傳統的 plot 函數更方便,在使用 plot 更改資料點的樣式時,使用者必須自行將類別型的資料轉換為 plot 可以接受的數值或名稱(例如 redblue 等),而 qplot 則是可以自動處理這些繁瑣的動作,並且在圖形上加入圖示說明(legend)。

假設我們想要依據 diamonds 中的 color 變數來替資料點著色,區別不同顏色的鑽石,可以使用 color 參數:

qplot(carat, price, data = diamonds.subset, color = color)
r-package-ggplot2-tutorial-qplot-5

散佈圖

若要以資料點的形狀區分資料,可使用 shape

qplot(carat, price, data = diamonds.subset, shape = cut)
r-package-ggplot2-tutorial-qplot-6

散佈圖

資料點的顏色與形狀都是屬於 ggplot 系統上的美學對應。

這裡的鑽石資料總共有五萬多筆,一次畫在同一張圖形上會造成大量的資料點重疊問題,看不出實際的資料分佈,我們將資料點加上透明度的參數,這樣可以比較容易辨識實際的資料分佈情況:

qplot(carat, price, data = diamonds, alpha = I(1/10))
r-package-ggplot2-tutorial-qplot-7

散佈圖

qplot(carat, price, data = diamonds, alpha = I(1/100))
r-package-ggplot2-tutorial-qplot-8

散佈圖

隨著資料類型的不同,適合的資料呈現方式也不同,例如類別型的資料就適合使用顏色、形狀來區隔,而若是連續型的資料則可以使用資料點的大小來表示;至於資料量的多寡也會有影響,資料量多的時候,除了使用透明度的技巧,也可以考慮以繪圖面(facet)繪出多張圖形的方式,避免過多的資料擠在同一張圖上難以區分。