使用ggplot2進行高級繪圖
除了基礎圖形,grid、lattice和ggplot2軟件包也提供了圖形系統,它們克服了R基礎圖形系統的低效性,大大擴展了R的繪圖能力。
grid圖形系統可以很容易地控制圖形基礎單元,給予編程者創作圖形的極大靈活性。
lattice包通過一維、二維或三維條件繪圖,即所謂的網格圖形(trellis graph)來對多元變量關系進行直觀展示。
ggplot2包則基於一種全面的圖形“語法”,提供了一種全新的圖形創建方法。
1 R 中的四種圖形系統
R中有四種主要的圖形系統。
基礎圖形系統由Ross Ihaka編寫,每個R都默認安裝,之前的大部分圖形都是依賴於基礎圖形函數創建的。
grid圖形提供了一種比標准圖形系統更低水平的方法。用戶可以在圖形設備上隨意創建矩形區域,在該區域定義坐標系統,然后使用一系列豐富的繪圖基礎單元來控制圖形元素的擺放和外觀。grid圖形的靈活性對於軟件開發者是非常有價值的,但是grid包沒有提供生成統計圖形以及完整繪圖的函數。因此,數據分析師很少直接采用grid包來分析數據。
lattice包由Deepayan Sarkar(2008)編寫,可繪制Cleveland(1985,1993)所描述的網格圖形。總的來說,網格圖形顯示一個變量的分布或是變量之間的關系,分別顯示一個或多個變量的各個水平。lattice包基於grid包創建,在多元數據的可視化功能方面已經遠超Cleveland的原始方法。它為R提供了一種全面的、創建統計圖形的備選系統。
ggplot2包的目標是提供一個全面的、基於語法的、連貫一致的圖形生成系統,允許用戶創建新穎的、有創新性的數據可視化圖形。該方法的力量已經使得ggplot2成為使用R進行數據可視化的重要工具。
2 ggplot2 包介紹
ggplot2包實現了一個在R中基於全面一致的語法創建圖形時的系統。這提供了在R中畫圖時經常缺乏的圖形創造的一致性並允許我們創建具有創新性和新穎性的圖表類型。
在ggplot2中,圖是采用串聯起來(+)號函數創建的。每個函數修改屬於自己的部分。下面給出了一個最簡單的例子:
ggplot(data=mtcars, aes(x=wt, y=mpg)) +
geom_point() +
labs(title="Automobile Data", x="Weight", y="Miles Per Gallon")
結果分析:ggplot()初始化圖形並且指定要用到的數據來源(mtcars)和變量(wt、mpg)。aes()函數的功能是指定每個變量扮演的角色(aes代表aesthetics,即如何用視覺形式呈現信息)。在這里,變量wt的值映射到沿x軸的距離,變量mpg的值映射到沿y軸的距離。ggplot()函數設置圖形但沒有自己的視覺輸出。使用一個或多個幾何函數向圖中添加了幾何對象(簡寫為geom),包括點、線、條、箱線圖和陰影區域。在這個例子中,geom_point()函數在圖形中畫點,創建了一個散點圖。
在ggplot2中有很多的函數,並且大多數包含可選的參數。擴展一下前面的例子,代碼如下:
library(ggplot2)
ggplot(data=mtcars, aes(x=wt, y=mpg)) +
geom_point(pch=17, color="blue", size=2) +
geom_smooth(method="lm", color="red", linetype=2) +
labs(title="Automobile Data", x="Weight", y="Miles Per Gallon")
結果分析:選用geom_point()函數來設置點的形狀為三角形(pch=17),點的大小加倍(size=2),並使顏色為藍色(color="blue")。geom_smooth()函數增加了一條“平滑”曲線。這里需要線性擬合(method="lm"),並且產生一條紅色(color="red")虛線(linetype=2),線條尺寸為1(size=1)。默認情況下,平滑的曲線包括在95%的置信區間(較暗帶)內。
ggplot2包提供了分組和小面化(faceting)的方法。分組指的是在一個圖形中顯示兩組或多組觀察結果。小面化指的是在單獨、並排的圖形上顯示觀察組。ggplot2包在定義組或面時使用因子。
我們可以使用mtcars數據集來查看分組和面。首先,將am、vs和cyl變量轉化為因子:
mtcars$am <- factor(mtcars$am, levels=c(0,1),
labels=c("Automatic", "Manual"))
mtcars$vs <- factor(mtcars$vs, levels=c(0,1),
labels=c("V-Engine", "Straight Engine"))
mtcars$cyl <- factor(mtcars$cyl)
接下來,利用下面的代碼繪圖:
library(ggplot2)
ggplot(data=mtcars, aes(x=hp, y=mpg,
shape=cyl, color=cyl)) +
geom_point(size=3) +
facet_grid(am~vs) +
labs(title="Automobile Data by Engine Type",
x="Horsepower", y="Miles Per Gallon")
結果分析:效果圖包含變速箱類型am(自動Automatic對手動Manual)和發動機裝置(V型發動機V-Engine 與直列式發動機Straight Engine)每個組合的分離的散點圖。每個點的顏色和形狀表示該汽車發動機汽缸cyl的數量。在本例中,am和vs是刻面變量,cyl是分組變量。