前言
ggplot2是R語言最為強大的作圖軟件包,強於其自成一派的數據可視化理念。當熟悉了ggplot2的基本套路后,數據可視化工作將變得非常輕松而有條理。
本文主要對ggplot2的可視化理念及開發套路做一個總體介紹,具體繪圖方法(如折線圖,柱狀圖,箱線圖等)將在后面的文章中分別進行講解。
核心理念
1. 將數據,數據相關繪圖,數據無關繪圖分離
這點可以說是ggplot2最為吸引人的一點。眾所周知,數據可視化就是將我們從數據中探索的信息與圖形要素對應起來的過程。
ggplot2將數據,數據到圖形要素的映射,以及和數據無關的圖形要素繪制分離,有點類似java的MVC框架思想。這讓ggplot2的使用者能清楚分明的感受到一張數據分析圖真正的組成部分,有針對性的進行開發,調整。
2. 圖層式的開發邏輯
在ggplot2中,圖形的繪制是一個個圖層添加上去的。舉個例子來說,我們首先決定探索一下身高與體重之間的關系;然后畫了一個簡單的散點圖;然后決定最好區分性別,圖中點的色彩對應於不同的性別;然后決定最好區分地區,拆成東中西三幅小圖;最后決定加入回歸直線,直觀地看出趨勢。這是一個層層推進的結構過程,在每一個推進中,都有額外的信息被加入進來。在使用ggplot2的過程中,上述的每一步都是一個圖層,並能夠疊加到上一步並可視化展示出來。
3. 各種圖形要素的自由組合
由於ggplot2的圖層式開發邏輯,我們可以自由組合各種圖形要素,充分自由發揮想象力。
基本開發步驟

1. 初始化 - ggplot()
這一步需要設定的是圖的x軸,y軸和"美學特征"。基本形式如下:
p <- ggplot(data = , aes(x = , y = ))
這一步里,設置x軸和設置y軸很好理解。那么"美學特征"又是什么呢?
舉個例子來說,下面這張散點圖里,x軸表示年齡,y軸表示身高,很好理解:

但這張圖除了展示年齡和身高的關系,還展示出每個樣本點的體重:顏色越深表示體重越大。因此體重信息和年齡身高一樣,也需要綁定到一個具體的列。這一列就是散點圖中的"美學特征"。
來看看R語言繪制代碼:
ggplot(heightweight, aes(x=ageYear, y=heightIn, colour=weightLb))+geom_point()
其中的colour參數就是該圖的"美學特征"。
再比如,下面這張柱狀圖中,x軸表示日期,y軸表示權重,很好理解:

但這張圖中每個日期對應了兩個不同的權重並采用兩個柱狀來對比,那么這個划分依據也是另一個“美學特征”。
再看看繪制代碼:
ggplot(cabbage_exp, aes(x=Date, y=Weight, fill=Cultivar))+geom_bar(position="dodge", stat="identity")
其中的fill參數就是該圖的"美學特征"。
綜上所述,圖中的每個樣本點除了通過它的坐標位置,還可以以其他形式展示信息,比如大小,色深,分組等。而這些新形式需要綁定的列,便叫做"美學特征"。
"美學特征"的形式和x,y軸一樣是以列的形式給出,且列中元素個數和x,y軸列必然相等。它的設置也和x,y軸一樣在ggplot()函數的aes參數括號內進行。
2. 繪制圖層 - geom_bar()/geom_line()等等
上一步的主要工作是為數據可視化配置好了數據,接下來便可根據業務的需要來繪制不同的圖,如折線圖/柱狀圖/散點圖等等。具體的實現方法在后面的文章中會細致講解,這里重點提一下繪圖函數里的stat參數。這個參數是表示對樣本點做統計的方式,默認為identity,表示一個x對應一個y,同時還可以是bin,表示一個x對應落到該x的樣本數。
3. 調整數據相關圖形元素 - scale系列函數、某些專有函數
在ggplot2中,scale標尺機制專門負責完成數據到圖像元素的映射。也許你會問,"美學特征"不是已經定義好了這個映射嗎?然而事實是"美學特征"只是選定了映射前的數據,並沒有說明具體映射到什么圖形元素。
舉個例子,假如某張表記錄了不同種類水池的長,寬,深信息。現在需要繪制不同種類下水池長和寬關系的柱狀圖,那么初始化完成的是這個映射:

而scale函數完成的是這個映射:

顯然a映射為了紅色,b映射為了藍色。
也許你還會問,我的代碼不用scale,那么映射是如何完成的呢?答曰系統有默認映射的,就像繪圖函數都有默認參數stat=identity這樣。
4. 調整數據無關圖形元素 - theme()、某些專有函數
這部分包括設置圖片標題格式,文字字體這類和數據本身無關的圖像元素。只需調用theme()函數或者某些專有函數(如annovate函數可為圖片添加注釋)便可實現。
一個圖層繪制好后便可觀察調整,然后開始下一個圖層的制作,直到整幅圖繪制完畢。
小結
本文作為該系列博客的開篇,從總體、抽象的角度介紹了R語言的數據可視化包ggplot2。讀者如果覺得有些概念抽象難以理解,不必糾結,待看完該系列其他文章后再回過頭來看本文,相信會有新的收獲。
接下來的文章將從具體、細致的角度講解如何使用R語言的ggplot2軟件包進行各種數據可視化。
最后,欣賞一些使用ggplot2制作的成品圖吧:

