這裡介紹如何使用 R 的 ggplot2
繪圖套件,輕鬆畫出高品質的各種統計圖形。
ggplot
是以繪圖文法概念為基礎所發展出來的一套 R 繪圖系統,可繪製各種高品質圖形的 R 繪圖套件,是一套相當受歡迎的繪圖工具。
在使用上,ggplot
這種繪圖系統不同於以往傳統式的 R 繪圖方式,使用者不會受限於既有的固定功能,可以依照自己的需求組合各種圖形組件、任意調整圖形,產生各種變化,相當富有彈性,而其畫出來的圖形品質也非常好,通常使用預設的設定值就可以很容易地產生出版品水準的圖形。
在傳統的 R 繪圖系統之下,一般的繪圖工具所提供的只是一些固定的繪圖功能,頂多加上一些微調參數讓使用者做些微的調整,若要自行設計新的圖形,使用者能使用的繪圖組件只有資料點、線條等低階的元素,既有的高階圖形完全無法重複使用。
在 ggplot
系統之下,繪圖文法的設計可以讓使用者以更高階的思維模式來設計繪圖,有許多既有的高階圖形元素可以使用,例如資料的呈現以及統計上的資料轉換方式等,使用者只要運用這些 ggplot
系統下的元件,就可以快速組裝出適用於自己的圖形。
以下我們將從 ggplot
繪圖系統的基礎概念開始介紹,敘述如何使用這個系統中的各種繪圖組件創建各式各樣的圖形,同時也會提供各種常用圖形的範例,縱使在不熟悉 ggplot
的繪圖概念之下,也可以畫出自己需要的圖形。
ggplot
繪圖文法
繪圖文法(grammar of graphics)的概念最早是由 Wilkinson 所提出來的,其主要用來解釋統計圖形(statistical graphic)的概念,而後來 Wickham 則是以 Wilkinson 的繪圖文法理論為基礎,做了一些調整後應用於 R 語言中,發展出了 ggplot
這個繪圖系統。
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)
另外也可以使用 data
參數指定資料來源的 data frame,這種方式會讓指令比較簡潔:
qplot(carat, price, data = diamonds)
這張圖顯示了鑽石的價格(price
)與它的克拉數(carat
)有明顯的關係,不過這個關係看起來不是線性的,我們可以將變數透過對數(log
)轉換一下:
qplot(log(carat), log(price), data = diamonds)
經過對數轉換之後,看起來就呈現比較好的線性關係。
我們也可以使用多個變數進行運算之後,作為 x
軸或 y
軸的座標值:
qplot(carat, x * y * z, data = diamonds)
這裡我們拿 diamonds
的 x
、y
、z
三個變數相乘,當作 y
軸的座標,畫出與 carat
的關係圖,看起來大部分鑽石的體積都跟重量成正比,也就是密度都差不多,不過也有許多 outliers。
圖形樣式
qplot
有提供一些參數可以讓使用者更改資料點的顏色、大小等樣式,而且在使用上會比傳統的 plot
函數更方便,在使用 plot
更改資料點的樣式時,使用者必須自行將類別型的資料轉換為 plot
可以接受的數值或名稱(例如 red
、blue
等),而 qplot
則是可以自動處理這些繁瑣的動作,並且在圖形上加入圖示說明(legend)。
假設我們想要依據 diamonds
中的 color
變數來替資料點著色,區別不同顏色的鑽石,可以使用 color
參數:
qplot(carat, price, data = diamonds.subset, color = color)
若要以資料點的形狀區分資料,可使用 shape
:
qplot(carat, price, data = diamonds.subset, shape = cut)
資料點的顏色與形狀都是屬於 ggplot
系統上的美學對應。
這裡的鑽石資料總共有五萬多筆,一次畫在同一張圖形上會造成大量的資料點重疊問題,看不出實際的資料分佈,我們將資料點加上透明度的參數,這樣可以比較容易辨識實際的資料分佈情況:
qplot(carat, price, data = diamonds, alpha = I(1/10))
qplot(carat, price, data = diamonds, alpha = I(1/100))
隨著資料類型的不同,適合的資料呈現方式也不同,例如類別型的資料就適合使用顏色、形狀來區隔,而若是連續型的資料則可以使用資料點的大小來表示;至於資料量的多寡也會有影響,資料量多的時候,除了使用透明度的技巧,也可以考慮以繪圖面(facet)繪出多張圖形的方式,避免過多的資料擠在同一張圖上難以區分。