這是全棧數(shù)據(jù)工程師養(yǎng)成攻略系列教程的第十四期:14 ggplot2 基本語法和基礎(chǔ)圖形。
上一節(jié)我們掌握了R的使用并安裝了ggplot2,這一節(jié)讓我們了解下ggplot2的基本語法以及一些常見圖形的繪制方法。
圖形種類
數(shù)據(jù)可視化使用形狀、色彩、大小、透明度等視覺元素來表達(dá)數(shù)據(jù),從而實(shí)現(xiàn)更直觀生動(dòng)的展示效果。常見的圖形包括散點(diǎn)圖、折線圖、條形圖、直方圖、箱線圖、密度圖等,它們都反映了兩個(gè)變量之間的關(guān)系,但表現(xiàn)的角度和場(chǎng)景都有所不同。
- 散點(diǎn)圖反映的是兩個(gè)連續(xù)變量之間的關(guān)系,例如一群人的身高和體重;
- 折線圖反映的是一個(gè)連續(xù)變量隨另一個(gè)連續(xù)變量的變化關(guān)系,例如一只股票的股價(jià)隨時(shí)間的波動(dòng)情況;
- 條形圖反映的是一個(gè)連續(xù)變量在另一個(gè)離散變量不同水平下的值,例如不同年齡層的平均收入;
- 直方圖反映的是一個(gè)連續(xù)變量在另一個(gè)連續(xù)變量不同區(qū)間范圍下的值,例如一群人中身高處于各個(gè)區(qū)間段的人數(shù);
- 箱線圖反映的是一個(gè)連續(xù)變量在另一個(gè)離散變量不同水平下的分布,例如不同學(xué)歷人群的收入分布;
- 密度圖反映的是一個(gè)連續(xù)變量在另一個(gè)連續(xù)變量不同取值下的概率密度,例如不同收入人群所對(duì)應(yīng)的密度。
總的來說,需要結(jié)合實(shí)際應(yīng)用問題,弄清楚圖形的x軸和y軸分別所表示的含義,以及x軸和y軸之間的關(guān)系,才能選出最適合表達(dá)的圖形。
除了圖形種類之外,圖形所使用形狀、顏色、填充色等元素也可以有豐富的選擇。設(shè)計(jì)完以上內(nèi)容后,還需要為圖形添加合適的坐標(biāo)軸標(biāo)簽、標(biāo)題、圖例等元素,只有恰當(dāng)?shù)亟Y(jié)合好各方面內(nèi)容,并且合理地表現(xiàn)出數(shù)據(jù)所蘊(yùn)含的結(jié)論,才能最終稱作一次成功的數(shù)據(jù)可視化。
基本語法
雖然Python中也有Matplotlib和Seaborn等繪圖工具包,但要么繪圖效果不夠美觀,要么語法不夠簡(jiǎn)潔統(tǒng)一,或者繪圖定制的靈活度不高。相比之下,ggplot2語法簡(jiǎn)單、格式一致,繪圖樣式多樣可定制,并且繪圖效果美觀清爽。
使用ggplot2繪圖遵循以下代碼格式,data表示將要繪制圖形的數(shù)據(jù)框,geom_type()
表示將要繪制的圖形種類,type可以是point、bar、line、boxplot、histogram等,分別表示散點(diǎn)圖、條形圖、折線圖、箱線圖、直方圖等。另外,需要在ggplot()
或geom_type()
完成繪圖元素的映射aes()
,即將數(shù)據(jù)框的列和x軸、y軸、大小、顏色等元素對(duì)應(yīng)起來。
ggplot(data) + geom_type()
以下代碼同時(shí)使用了散點(diǎn)圖和擬合線,即ggplot2遵循圖層的概念,可以疊加任意數(shù)量的圖層,從而基于一個(gè)或多個(gè)數(shù)據(jù)框繪制多種圖形。aes()
如果提供在ggplot()
中則默認(rèn)對(duì)后續(xù)全部圖層生效,可以理解為全局配置;如果提供在geom_type()
函數(shù)中,則僅對(duì)該圖層生效,可以理解為局部配置。
# 為了使用heightweight數(shù)據(jù)集而加載包
library(gcookbook)
ggplot(heightweight, aes(x=ageYear, y=heightIn, color=sex)) + geom_point() + geom_smooth()
條形圖
使用geom_bar()
繪制條形圖,這里以BOD
和cabbage_exp
兩個(gè)數(shù)據(jù)集為例。
BOD
只有兩列Time和demand,一共6行數(shù)據(jù)。以下代碼將Time映射到x軸,將demand映射到y(tǒng)軸,以條形圖展示不同Time所對(duì)應(yīng)demand值。stat='identity'
表示y軸使用變量的實(shí)際值而不是頻數(shù),因?yàn)闂l形圖的另一種使用場(chǎng)景是展示不同類別記錄的數(shù)量,即類別值的出現(xiàn)頻數(shù),例如x軸表示男和女,y軸表示相應(yīng)性別的人群數(shù)量。
ggplot(BOD) + geom_bar(aes(x=Time, y=demand), stat='identity')
我們會(huì)發(fā)現(xiàn)繪圖結(jié)果中x=6
處存在一處空缺,因?yàn)間gplot2將Time這一列當(dāng)作數(shù)值型來處理,因此缺少了Time為6的記錄。可以在繪圖時(shí)將Time這一列轉(zhuǎn)化為因子類型,即可解決繪圖空缺問題。
ggplot(BOD) + geom_bar(aes(x=factor(Time), y=demand), stat='identity')
cabbage_exp
是gcookbook
包提供的一個(gè)數(shù)據(jù)集,一共6行6列,可以在R中直接輸入數(shù)據(jù)集的名稱查看其內(nèi)容。以下代碼用條形圖展示了cabbage_exp
中,Cultivar取不同值所對(duì)應(yīng)的記錄頻數(shù)。這種情況下僅需指定x軸映射,無需提供y軸和stat='identity'
。
ggplot(cabbage_exp) + geom_bar(aes(x=Cultivar))
再來一個(gè)例子,x軸為Cultivar、y軸為Weight,并且將Date映射到填充色上。
ggplot(cabbage_exp) + geom_bar(aes(x=Cultivar, y=Weight, fill=Date), stat="identity")
使用position
參數(shù)可以繪制分組條形圖。
ggplot(cabbage_exp) + geom_bar(aes(x=Cultivar, y=Weight, fill=Date), stat="identity", position="dodge")
折線圖
有了條形圖的基礎(chǔ),后續(xù)的圖形理解起來也就更快了,以下代碼使用BOD
數(shù)據(jù)集繪制折線圖。
ggplot(BOD) + geom_line(aes(x=Time, y=demand))
# 同時(shí)繪制折線圖和散點(diǎn)圖
# 將aes()寫在ggplot()里面,對(duì)后續(xù)全部圖層都生效
ggplot(BOD, aes(x=Time, y=demand)) + geom_line() + geom_point()
以下代碼使用uspopage
數(shù)據(jù)集繪制折線圖,有Year、AgeGroup、Thousands三列,一共824行數(shù)據(jù),因此反應(yīng)的是每年不同年齡層的人口數(shù)量。
# 用line的color表示不同年齡層
ggplot(uspopage) + geom_line(aes(x=Year, y=Thousands, color=AgeGroup))
# 再來試試區(qū)域圖,用area的fill表示不同年齡層
ggplot(uspopage) + geom_area(aes(x=Year, y=Thousands, fill=AgeGroup))
描述數(shù)據(jù)分布
可以使用直方圖、密度圖、箱線圖等來描述數(shù)據(jù)分布,這些圖中往往包含一些經(jīng)過統(tǒng)計(jì)和計(jì)算之后的數(shù)據(jù),而不像條形圖、折線圖、散點(diǎn)圖一樣僅使用原始數(shù)據(jù)。
使用geom_histogram()
、geom_density()
、geom_boxplot()
即可分別繪制直方圖、密度圖和箱線圖,具體使用方法參見下一節(jié)中的實(shí)戰(zhàn)項(xiàng)目。
分面
使用ggplot2繪圖時(shí),可以將數(shù)據(jù)框的列映射到shape、color、size、fill等繪圖元素上,從而同時(shí)展示包括x軸、y軸在內(nèi)的多個(gè)變量之間的關(guān)系。除此之外,也可以使用分面實(shí)現(xiàn)一圖多畫,例如對(duì)于gender為male和female的情況分別畫一張圖,甚至是對(duì)多個(gè)類別型變量的全部組合情況分別作圖。
使用facet_wrap()
實(shí)現(xiàn)分面,這里給出一個(gè)簡(jiǎn)單的例子,將之前映射到填充色的AgeGroup作為分面變量,從而畫出AgeGroup取不同水平時(shí)所對(duì)應(yīng)的區(qū)域圖。
ggplot(uspopage) + geom_area(aes(x=Year, y=Thousands)) + facet_wrap(~AgeGroup)
R數(shù)據(jù)可視化
以上介紹了ggplot2的基本語法和幾種常見的基礎(chǔ)圖形,以及如何將數(shù)據(jù)框的列映射到圖形的x軸、y軸、大小、顏色、填充色等繪圖元素上。關(guān)于ggplot2的更多內(nèi)容可以參考我的博客,http://zhanghonglun.cn/blog/tag/r/,以上鏈接以r
為標(biāo)簽搜索相關(guān)文章,搜索結(jié)果中會(huì)有一個(gè)《R數(shù)據(jù)可視化系列》,共11篇文章,可作為進(jìn)一步學(xué)習(xí)ggplot2的參考資料。