全棧 - 14 ggplot2 基本語法和基礎圖形

張巨集倫發表於2017-03-19

這是全棧資料工程師養成攻略系列教程的第十四期:14 ggplot2 基本語法和基礎圖形。

上一節我們掌握了R的使用並安裝了ggplot2,這一節讓我們瞭解下ggplot2的基本語法以及一些常見圖形的繪製方法。

圖形種類

資料視覺化使用形狀、色彩、大小、透明度等視覺元素來表達資料,從而實現更直觀生動的展示效果。常見的圖形包括散點圖、折線圖、條形圖、直方圖、箱線圖、密度圖等,它們都反映了兩個變數之間的關係,但表現的角度和場景都有所不同。

  • 散點圖反映的是兩個連續變數之間的關係,例如一群人的身高和體重;
  • 折線圖反映的是一個連續變數隨另一個連續變數的變化關係,例如一隻股票的股價隨時間的波動情況;
  • 條形圖反映的是一個連續變數在另一個離散變數不同水平下的值,例如不同年齡層的平均收入;
  • 直方圖反映的是一個連續變數在另一個連續變數不同區間範圍下的值,例如一群人中身高處於各個區間段的人數;
  • 箱線圖反映的是一個連續變數在另一個離散變數不同水平下的分佈,例如不同學歷人群的收入分佈;
  • 密度圖反映的是一個連續變數在另一個連續變數不同取值下的概率密度,例如不同收入人群所對應的密度。

總的來說,需要結合實際應用問題,弄清楚圖形的x軸和y軸分別所表示的含義,以及x軸和y軸之間的關係,才能選出最適合表達的圖形。

除了圖形種類之外,圖形所使用形狀、顏色、填充色等元素也可以有豐富的選擇。設計完以上內容後,還需要為圖形新增合適的座標軸標籤、標題、圖例等元素,只有恰當地結合好各方面內容,並且合理地表現出資料所蘊含的結論,才能最終稱作一次成功的資料視覺化。

基本語法

雖然Python中也有Matplotlib和Seaborn等繪圖工具包,但要麼繪圖效果不夠美觀,要麼語法不夠簡潔統一,或者繪圖定製的靈活度不高。相比之下,ggplot2語法簡單、格式一致,繪圖樣式多樣可定製,並且繪圖效果美觀清爽。

使用ggplot2繪圖遵循以下程式碼格式,data表示將要繪製圖形的資料框,geom_type()表示將要繪製的圖形種類,type可以是point、bar、line、boxplot、histogram等,分別表示散點圖、條形圖、折線圖、箱線圖、直方圖等。另外,需要在ggplot()geom_type()完成繪圖元素的對映aes(),即將資料框的列和x軸、y軸、大小、顏色等元素對應起來。

ggplot(data) + geom_type()複製程式碼

以下程式碼同時使用了散點圖和擬合線,即ggplot2遵循圖層的概念,可以疊加任意數量的圖層,從而基於一個或多個資料框繪製多種圖形。aes()如果提供在ggplot()中則預設對後續全部圖層生效,可以理解為全域性配置;如果提供在geom_type()函式中,則僅對該圖層生效,可以理解為區域性配置。

# 為了使用heightweight資料集而載入包
library(gcookbook)
ggplot(heightweight, aes(x=ageYear, y=heightIn, color=sex)) + geom_point() + geom_smooth()複製程式碼

條形圖

使用geom_bar()繪製條形圖,這裡以BODcabbage_exp兩個資料集為例。

BOD只有兩列Time和demand,一共6行資料。以下程式碼將Time對映到x軸,將demand對映到y軸,以條形圖展示不同Time所對應demand值。stat='identity'表示y軸使用變數的實際值而不是頻數,因為條形圖的另一種使用場景是展示不同類別記錄的數量,即類別值的出現頻數,例如x軸表示男和女,y軸表示相應性別的人群數量。

ggplot(BOD) + geom_bar(aes(x=Time, y=demand), stat='identity')複製程式碼

我們會發現繪圖結果中x=6處存在一處空缺,因為ggplot2將Time這一列當作數值型來處理,因此缺少了Time為6的記錄。可以在繪圖時將Time這一列轉化為因子型別,即可解決繪圖空缺問題。

ggplot(BOD) + geom_bar(aes(x=factor(Time), y=demand), stat='identity')複製程式碼

cabbage_expgcookbook包提供的一個資料集,一共6行6列,可以在R中直接輸入資料集的名稱檢視其內容。以下程式碼用條形圖展示了cabbage_exp中,Cultivar取不同值所對應的記錄頻數。這種情況下僅需指定x軸對映,無需提供y軸和stat='identity'

ggplot(cabbage_exp) + geom_bar(aes(x=Cultivar))複製程式碼

再來一個例子,x軸為Cultivar、y軸為Weight,並且將Date對映到填充色上。

ggplot(cabbage_exp) + geom_bar(aes(x=Cultivar, y=Weight, fill=Date), stat="identity")複製程式碼

使用position引數可以繪製分組條形圖。

ggplot(cabbage_exp) + geom_bar(aes(x=Cultivar, y=Weight, fill=Date), stat="identity", position="dodge")複製程式碼

折線圖

有了條形圖的基礎,後續的圖形理解起來也就更快了,以下程式碼使用BOD資料集繪製折線圖。

ggplot(BOD) + geom_line(aes(x=Time, y=demand))
# 同時繪製折線圖和散點圖
# 將aes()寫在ggplot()裡面,對後續全部圖層都生效
ggplot(BOD, aes(x=Time, y=demand)) + geom_line() + geom_point()複製程式碼

以下程式碼使用uspopage資料集繪製折線圖,有Year、AgeGroup、Thousands三列,一共824行資料,因此反應的是每年不同年齡層的人口數量。

# 用line的color表示不同年齡層
ggplot(uspopage) + geom_line(aes(x=Year, y=Thousands, color=AgeGroup))
# 再來試試區域圖,用area的fill表示不同年齡層
ggplot(uspopage) + geom_area(aes(x=Year, y=Thousands, fill=AgeGroup))複製程式碼

描述資料分佈

可以使用直方圖、密度圖、箱線圖等來描述資料分佈,這些圖中往往包含一些經過統計和計算之後的資料,而不像條形圖、折線圖、散點圖一樣僅使用原始資料。

使用geom_histogram()geom_density()geom_boxplot()即可分別繪製直方圖、密度圖和箱線圖,具體使用方法參見下一節中的實戰專案。

分面

使用ggplot2繪圖時,可以將資料框的列對映到shape、color、size、fill等繪圖元素上,從而同時展示包括x軸、y軸在內的多個變數之間的關係。除此之外,也可以使用分面實現一圖多畫,例如對於gender為male和female的情況分別畫一張圖,甚至是對多個類別型變數的全部組合情況分別作圖。

使用facet_wrap()實現分面,這裡給出一個簡單的例子,將之前對映到填充色的AgeGroup作為分面變數,從而畫出AgeGroup取不同水平時所對應的區域圖。

ggplot(uspopage) + geom_area(aes(x=Year, y=Thousands)) + facet_wrap(~AgeGroup)複製程式碼

R資料視覺化

以上介紹了ggplot2的基本語法和幾種常見的基礎圖形,以及如何將資料框的列對映到圖形的x軸、y軸、大小、顏色、填充色等繪圖元素上。關於ggplot2的更多內容可以參考我的部落格,zhanghonglun.cn/blog/tag/r/,以上鍊接以r為標籤搜尋相關文章,搜尋結果中會有一個《R資料視覺化系列》,共11篇文章,可作為進一步學習ggplot2的參考資料。

視訊連結:ggplot2基本語法和基礎圖形

如果覺得文章不錯,不妨點一下左下方的喜歡~

相關文章