R 世界的諸多套件當中,有兩個高級繪圖套件非常受到歡迎,分別是「 lattice 」與「 ggplot2 」。
和 R 內建的圖形函數相比,兩者都納入更多子功能可以繪製複雜的圖形,不過作圖的基本原理並不相同,其中 lattice 除了 2D 繪圖之外,還能繪製 3D 圖形,但就美觀來說, ggplot2 的潛力是讓人驚艷不已的,豆瓣的網友甚至暱稱為「文藝繪圖」的工具。
ggplot2 的由來
2005 年發佈的 ggplot2 套件,它的作者 Hadley Wickham 目前在 Rice 大學統計系任教,在 R 社群中是相當知名的英雄人物,截至本文撰寫為止設計了 30 個以上的 R 套件。
關於 R 的使用者為何應該選擇 ggplot2 , Wickham 在自己的 github 上提出了一些意見,有興趣的人可以參觀參觀。
ggplot2 的繪圖邏輯
套件 ggplot2 實際上有兩個繪圖函數,「 qplot() 」以及「 ggplot() 」,指令略有不同但繪圖結果相同,本文僅以 ggplot() 來做介紹。
ggplot() 的繪圖概念和 R 的內建繪圖函數不同,正規的 ggplot() 教學經常提到資料映射( mapping )的概念,不過在此筆者嘗試用更白話一點的方式(也許不甚精確)來說明。
ggplot() 的繪圖可以想成就是拿著紙筆畫圖,一開始必須先準備一張畫紙,接著才塗上顏料,而且較晚著色的顏料會蓋在原先的圖案上頭,也就是具有修圖軟體像是 illustrator 、 Photoshop 中「圖層( layer )」的概念。
從下面這張自製的摘要可以窺見 ggplot() 與搭配使用的各函數之間關係,暫先不一一說明,假若自學時對於各主要函數的意義感到疑惑,回頭參考它可能會有點幫助:
ggplot() 的基本語法如下:
ggplot(data = NULL, …)
乍看之下令人有點意外,傳聞中功能強大的 ggplot() 本身函數語法非常簡易,只要輸入資料就好,不過這套簡略的語法背後其實是為了更大的彈性而設計,那就是 ggplot() 允許同時使用多個 data.frame 資料來繪圖,而且做法還相當簡單,如此一來附加在圖標中的資訊就有了無限可能,其中也包含許多使用 MS Excel 等軟體目前做不出來的效果。
繪圖步驟 1 : 用 ggplot() 準備畫布
ggplot(data=, x=, y=,colour=)
# data 指定預設資料集
# x 指定 x 軸
# y 指定 y 軸
# colour 依照指定的變數,按照不同分類給予不同顏色
str(CO2)
Classes ‘nfnGroupedData’, ‘nfGroupedData’,
‘groupedData’ and ‘data.frame’: 84
obs. of 5 variables:#共有5個變數包含84個樣本
$Plant : Ord.factor w/ 12 levels
“Qn1″<“Qn2″<“Qn3″<..: 1 1 1 1 1 1 1 2 2#Factor代表分類變數,如Qn1、Qn2…,共有12個分類
$Type : Factor w/ 2 levels “Quebec","Mississippi": 1 1 1 1 1 1 1 1 1 1 …
# Factor代表分類變數,如Quebec、Mississippi…,共有2個分類
$Treatment: Factor w/ 2 levels “nonchilled","chilled": 1 1 1 1 1 1 1 1 1 1 …
# Factor代表分類變數,如nonchilled、chilled…,共有2個分類
$conc : num 95 175 250 350 500 675 1000 95 175 250 …
# num代表數值變數
$uptake : num 16 30.4 34.8 37.2 35.3 39.2 39.7 13.6 27.3 37.1 …
# num代表數值變數
> justdoit<-ggplot(data=CO2)
# 設新變數 justdoit ,預設使用 CO2 資料
> justdoit
錯誤: No layers in plot
繪圖步驟 2 : 用 geom 、 aes ()繪製圖形
如果輸入上述指令卻收到錯誤訊息「 No layers in plot 」,一切純屬正常。
前面提過, ggplot() 只負責產生畫布而已,要產生圖形,還得靠「 geom (幾何圖形)」、「 aes (外觀設定)」兩大幫手加上新圖層,這就是 ggplot() 與 R 內建繪圖函數最大的差異。
geom 的功能是在圖中產生點、線、三角等圖形,而 aes 的作用則是管理座標軸、顏色變化等等。
假如想要畫一張簡單的盒鬚圖( Box-plot ),那麼可以使用 geom_boxplot() 函數,並配合 aes() 函數指定散佈圖的資料來源、座標變數以及用來分類顏色的變數如下:
> justdoit + geom_boxplot(data=CO2,
aes(x=conc, y=uptake, colour=Plant))
# 以+號連結不同圖層
# 指定boxplot繪圖的資料為CO2,x軸為conc變數、y軸為uptake變數,並依照Plant變數的分類來上色

> justdoit
+geom_boxplot(data=CO2, aes(x=conc,
y=uptake, colour=Plant))+geom_point(data=CO2, aes(x=conc, y=uptake,
colour=Plant))#最後一行才是新增加的部分

繪圖步驟 3 : 用 stat 增加統計資訊
> justdoit
+geom_boxplot(data=CO2, aes(x=conc, y=uptake,
colour=Plant))+geom_point(data=CO2, aes(x=conc, y=uptake,
colour=Plant))+stat_smooth(data=CO2, aes(x=conc,
y=uptake))#最後一行才是新增加的部分
更多精彩內容,千萬別錯過:
* 統計R語言實作筆記系列 – 2D視覺化進階 GGPLOT()的基本架構(二)
* 統計R語言實作筆記系列 – 用 SHINY 套件極速打造你的商業智慧分析網站!
* 統計R語言實作筆記系列- 直線ABLINE()、曲線CURVE()與多邊形POLYGON()
* EXCEL 交互參照必學神器, 用 LOOKUP 系列函數一鍵搞定資料比對 : HLOOKUP篇
期待續集:)
感謝支持:)
前一陣子實在太忙了~
續集來囉
http://wendellandservicescience.blogspot.tw/2014/01/r-2d-ggplot2.html