統計R語言實作筆記系列 – 2D視覺化進階 ggplot()的基本架構(一)

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() 的基本語法如下:

ggplot(data = NULL, …)

乍看之下令人有點意外,傳聞中功能強大的 ggplot() 本身函數語法非常簡易,只要輸入資料就好,不過這套簡略的語法背後其實是為了更大的彈性而設計,那就是 ggplot() 允許同時使用多個 data.frame 資料來繪圖,而且做法還相當簡單,如此一來附加在圖標中的資訊就有了無限可能,其中也包含許多使用 MS Excel 等軟體目前做不出來的效果。

繪圖步驟 1 : 用 ggplot() 準備畫布

為了這個彈性,ggplot()本身並不會產出圖表,只是建構出繪圖的「畫布」,常用於畫布的參數包括 data 、 x 、 y 、 colour 。

ggplot(data=, x=, y=,colour=)

#  data 指定預設資料集

#  x  指定 x 軸

#  y  指定 y 軸

#  colour 依照指定的變數,按照不同分類給予不同顏色

除了 data 外,各參數的定義並非必需,例如只有定義 x 而沒有指定 y ,那麼繪製長條圖時 y 會自動填入計數資料,從另一個角度說,不正確的預設定義會導致某些繪圖失敗,假如遇到這種情況,不必太過喪氣,應該先回頭檢查該資料的統計尺度是否適合想畫的圖形。
直接來看個範例,使用 R 內建的資料集「 CO2 」,先用 str() 函數取得變數的基本說明:

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代表數值變數

接著用 ggplot() 準備我們的第一張畫布:

> 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 的作用則是管理座標軸、顏色變化等等。

ggplot-範例-aes-geom

假如想要畫一張簡單的盒鬚圖( Box-plot ),那麼可以使用 geom_boxplot() 函數,並配合 aes() 函數指定散佈圖的資料來源、座標變數以及用來分類顏色的變數如下:

> justdoit + geom_boxplot(data=CO2,

aes(x=conc, y=uptake, colour=Plant))

# 以+號連結不同圖層

# 指定boxplot繪圖的資料為CO2,x軸為conc變數、y軸為uptake變數,並依照Plant變數的分類來上色

ggplot-範例-盒鬚圖-boxplot
由於 ggplot() 的繪圖邏輯是基於圖層的概念,因此後來增加的圖案會蓋在原先的圖形上,例如增加一個圖層係由 geom_point() 函數所繪製的散佈圖,那麼資料點就會在盒鬚圖上,若是顛倒順序,則盒鬚圖會蓋住資料點。

> justdoit

+geom_boxplot(data=CO2, aes(x=conc,
y=uptake, colour=Plant))

+geom_point(data=CO2, aes(x=conc, y=uptake,
colour=Plant))

#最後一行才是新增加的部分

ggplot-範例-盒鬚圖-boxplot-加上文字

繪圖步驟 3 : 用 stat 增加統計資訊

stat 是 ggplot() 繪圖時另一個重要的函數,可以把比較複雜的統計運算的結果呈現在圖形上,以新增一條 conc 對應 uptake 變數的平滑線 stat_smooth() 為例,並當作新的「圖層」覆蓋上去:

> 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))

#最後一行才是新增加的部分

ggplot-範例-盒鬚圖-boxplot-加上平滑線

更多精彩內容,千萬別錯過:

* 統計R語言實作筆記系列 – 2D視覺化進階 GGPLOT()的基本架構(二)

* 統計R語言實作筆記系列 – 用 SHINY 套件極速打造你的商業智慧分析網站!

* 統計R語言實作筆記系列- 直線ABLINE()、曲線CURVE()與多邊形POLYGON()

* 統計R語言實作筆記系列 – 2D視覺化入門

* EXCEL 交互參照必學神器, 用 LOOKUP 系列函數一鍵搞定資料比對 : HLOOKUP篇

(Visited 27,927 times, 32 visits today)

Wendell.Huang

科技公司嫌棄太活潑,消費品牌挑剔太沉悶..., 經常必須解釋自己在學什麼, 不小心就摔破對方眼鏡的跨領域玩家。

10 Comments

發表迴響

你的電子郵件位址並不會被公開。 必要欄位標記為 *