R語言從入門到精通:Day17 (ggplot2繪圖)
- 2019 年 12 月 17 日
- 筆記
四種常見的作圖系統中,ggplot2包基於一種全面的圖形「語法」,提供了一種全新的圖形創建方法。這個包極大地擴展了R繪圖的範疇,提高了圖形的品質。它通過全面一致的語法幫助我們將多變數的數據集進行可視化,並且很容易生成R自帶圖形難以生成的圖形。
與基礎圖形不同的是,要調用ggplot2函數需要下載並安裝該包
> install.packages("ggplot2")
第一次使用前還要進行載入
> library(ggplot2)
本次教程中,將用三個數據集解釋ggplot2包的使用。
- 第一個是lattice包中的singer數據集,它包括紐約合唱團歌手的身高和語音變數等。
- 第二個是mtcars數據集,它包含32輛汽車的詳細資訊。
- 最後一個是car包中的Salaries數據集,包含了大學教授的收入資訊,並用來探索性別差異對他們收入的影響。
詳細介紹ggplot2之前,有必要先熟悉一些ggplot2的語法,下面三幅圖是由簡單到複雜的三個示例(見圖1,2,3)。圖1是最簡單的散點圖,基本語法或者做圖步驟為:
函數ggplot()初始化圖形並且指定要用到的數據來源(mtcars)和變數(wt、mpg)
函數aes()指定每個變數扮演的角色(aes代表aesthetics,即如何用視覺形式呈現資訊)。這裡,變數wt的值映射到沿x軸的距離,變數mpg的值映射到沿y軸的距離。函數ggplot()雖然設置圖形,但沒有自己的視覺輸出,而是使用一個或多個幾何函數向圖中添加了幾何對象(簡寫為geom),包括點、線、條、箱線圖和陰影區域。在散點圖的例子中,函數geom_point()在圖形中畫點,創建了一個散點圖。最後,函數labs()是可選的,可添加註釋(包括軸標籤和標題)。
圖1,散點圖

圖2與圖1最大的區別在於添加了一條「平滑」曲線,這裡用到了函數geom_smooth()。對於圖3,ggplot2包提供了分組和小面化(faceting)的方法。分組指的是在一個圖形中顯示兩組或多組觀察結果。小面化指的是在單獨、並排的圖形上顯示觀察組。ggplot2包在定義組或面時使用因子(factor)(主要涉及函數facet_grid())。
ggplot2很強大,能夠創建各種各樣的資訊圖。可惜,強大也帶來了複雜性。不像其他的R包,ggplot2憑藉其自身就可以被認為一種綜合圖形程式語言。它有自己的學習曲線,有時這個曲線比較陡,但是堅持住,這些努力都是值得的。
圖2,線性擬合結果圖

圖3,「分組」示例圖

了解了ggplot2的基本語法之後,我們首先介紹幾何函數及其能夠創建的圖形類型,然後詳細了解函數aes(),以及如何利用它來對數據進行分組。接下來,將考慮刻面和網格圖形的建立。最後,將研究如何調整ggplot2圖形的外觀,包括修改坐標軸和圖例、改變配色方案以及添加註釋。
函數ggplot()指定要繪製的數據源和變數,幾何函數則指定這些變數如何在視覺上進行表示(使用點、條、線和陰影區)。表1列出了幾種常見的幾何函數(目前有37個幾何函數可供使用)。
表1,幾何函數

舉個最簡單的例子,函數geom_boxplot()可以繪製箱線圖,如圖4。
圖4,箱線圖示例

每個幾何函數都有一組自己的選項,可以通過幫助文檔來了解,我們也給大家列出了一些常見選項。為了給大家展示這些選項的作用,這裡給出兩個例子(圖5,6)。圖6中將小提琴圖和箱線圖結合起來,這對於基礎圖形來說,就很難實現了。
表2,幾何函數中的常見選項

圖5,展示常見選項的圖例

圖6,小提琴圖和箱線圖的組合

講到這裡,必須要強調使用ggplot2的最終目的還是為了更好的理解數據。而為了理解數據,在一個圖中畫出兩個或更多組的觀察值通常是很有幫助的。在R中,組通常用分類變數的水平(因子)來定義。分組是通過ggplot2圖將一個或多個帶有諸如形狀、顏色、填充、尺寸和線類型的視覺特徵的分組變數來完成的。函數ggplot()中的aes()函數負責分配變數(圖形的視覺特徵),所以這是一個分配分組變數的自然的地方。下面通過數據集Salaries中的性別和學術等級分組,繪製獲得博士學位年數與薪水的關係圖(圖7)。
圖7,博士畢業年數和薪水的散點圖

程式碼中還提供了條形圖的分組繪圖,留給大家自己嘗試。
在基礎圖形中可以實現的圖形「組合」在ggplot2中自然也不是難事,可以使用函數facet_wrap()和函數facet_grid()創建。這裡提供了三個圖形來展示這兩個函數的語法規則(圖8,9,10)。
圖8,語法facet_wrap(~var, nrow=4)示意圖

圖9,語法facet_grid(.~var)示意圖

圖10,語法facet_grid(var~.)示意圖

我們在前面已經見過了函數geom_smooth()的例子,該函數中的參數含義依次為:method代表要使用的平滑函數,如lm、glm等;參數formula代表在函數中使用的公式,和回歸分析中的參數formula類似;參數se代表是否繪製置信區間;參數level代表使用的置信區間水平;參數fullrange指定擬合是否覆蓋全圖或僅僅是數據。下面是使用了函數geom_smooth()繪製的兩個薪水和畢業年數的關係圖(圖11,12)。
圖11,博士畢業年數與目前薪水之間的關係

圖12,男性和女性博士畢業年數和薪水之間的關係

在基礎圖形中,函數par()被用來調整圖形參數,ggplot2中則有自己的函數來完成這些改動,比如前面例子中已經出現過的函數labs()。首先是可以靈活控制坐標軸外觀的函數,如圖13(用到函數scale_x_continuous()等,具體見程式碼)。
圖13,坐標軸改動示意圖

如果我想要把圖13裡面在右邊的圖例換個位置,那也不是一件難事,如圖14。
圖14,圖例修改示意圖

ggplot2中改變圖案中特定元素的方法很多,其中,函數theme()能幫助我們調整字體、背景或者顏色等,我們可以將自己定義好的theme保存起來,這樣可以使我們的圖有鮮明的個人風格(如圖15,程式碼已提供)。
圖15,函數theme()的示例圖

基礎圖形中,參數mfrow和函數layout()可以繪製組合圖形,ggplot2裡面函數grid.arrange()可以實現這一點(如圖16,具體見程式碼)。
圖16,函數grid.arrange()示例

最後,ggpolt2繪製出的圖形可以通過常規的圖片保存方法導出,也可以利用函數ggsave(),大家不妨自己動手嘗試一下。
ggplot2包學習起來可能有些困難,同時網上也有很多學習資料,一系列ggplot2的函數及相應的例子可以在http://docs.ggplot2.org上找到,但最重要的還是要多動手!多動手!多動手!

