這是全棧數(shù)據(jù)工程師養(yǎng)成攻略系列教程的第十四期:14 ggplot2 基本語法和基礎(chǔ)圖形沿癞。
上一節(jié)我們掌握了R的使用并安裝了ggplot2,這一節(jié)讓我們了解下ggplot2的基本語法以及一些常見圖形的繪制方法者祖。
圖形種類
數(shù)據(jù)可視化使用形狀缴川、色彩厕诡、大小党远、透明度等視覺元素來表達數(shù)據(jù)削解,從而實現(xiàn)更直觀生動的展示效果。常見的圖形包括散點圖沟娱、折線圖氛驮、條形圖、直方圖济似、箱線圖矫废、密度圖等盏缤,它們都反映了兩個變量之間的關(guān)系,但表現(xiàn)的角度和場景都有所不同蓖扑。
- 散點圖反映的是兩個連續(xù)變量之間的關(guān)系唉铜,例如一群人的身高和體重;
- 折線圖反映的是一個連續(xù)變量隨另一個連續(xù)變量的變化關(guān)系律杠,例如一只股票的股價隨時間的波動情況打毛;
- 條形圖反映的是一個連續(xù)變量在另一個離散變量不同水平下的值,例如不同年齡層的平均收入俩功;
- 直方圖反映的是一個連續(xù)變量在另一個連續(xù)變量不同區(qū)間范圍下的值,例如一群人中身高處于各個區(qū)間段的人數(shù)碰声;
- 箱線圖反映的是一個連續(xù)變量在另一個離散變量不同水平下的分布诡蜓,例如不同學(xué)歷人群的收入分布;
- 密度圖反映的是一個連續(xù)變量在另一個連續(xù)變量不同取值下的概率密度胰挑,例如不同收入人群所對應(yīng)的密度蔓罚。
總的來說,需要結(jié)合實際應(yīng)用問題瞻颂,弄清楚圖形的x軸和y軸分別所表示的含義豺谈,以及x軸和y軸之間的關(guān)系,才能選出最適合表達的圖形贡这。
除了圖形種類之外茬末,圖形所使用形狀、顏色盖矫、填充色等元素也可以有豐富的選擇丽惭。設(shè)計完以上內(nèi)容后,還需要為圖形添加合適的坐標軸標簽辈双、標題责掏、圖例等元素,只有恰當?shù)亟Y(jié)合好各方面內(nèi)容湃望,并且合理地表現(xiàn)出數(shù)據(jù)所蘊含的結(jié)論换衬,才能最終稱作一次成功的數(shù)據(jù)可視化。
基本語法
雖然Python中也有Matplotlib和Seaborn等繪圖工具包证芭,但要么繪圖效果不夠美觀瞳浦,要么語法不夠簡潔統(tǒng)一,或者繪圖定制的靈活度不高檩帐。相比之下术幔,ggplot2語法簡單、格式一致湃密,繪圖樣式多樣可定制诅挑,并且繪圖效果美觀清爽四敞。
使用ggplot2繪圖遵循以下代碼格式,data表示將要繪制圖形的數(shù)據(jù)框拔妥,geom_type()
表示將要繪制的圖形種類忿危,type可以是point、bar没龙、line铺厨、boxplot、histogram等硬纤,分別表示散點圖解滓、條形圖、折線圖筝家、箱線圖洼裤、直方圖等。另外溪王,需要在ggplot()
或geom_type()
完成繪圖元素的映射aes()
腮鞍,即將數(shù)據(jù)框的列和x軸、y軸莹菱、大小移国、顏色等元素對應(yīng)起來。
ggplot(data) + geom_type()
以下代碼同時使用了散點圖和擬合線道伟,即ggplot2遵循圖層的概念迹缀,可以疊加任意數(shù)量的圖層,從而基于一個或多個數(shù)據(jù)框繪制多種圖形蜜徽。aes()
如果提供在ggplot()
中則默認對后續(xù)全部圖層生效裹芝,可以理解為全局配置;如果提供在geom_type()
函數(shù)中娜汁,則僅對該圖層生效嫂易,可以理解為局部配置。
# 為了使用heightweight數(shù)據(jù)集而加載包
library(gcookbook)
ggplot(heightweight, aes(x=ageYear, y=heightIn, color=sex)) + geom_point() + geom_smooth()
條形圖
使用geom_bar()
繪制條形圖掐禁,這里以BOD
和cabbage_exp
兩個數(shù)據(jù)集為例怜械。
BOD
只有兩列Time和demand,一共6行數(shù)據(jù)傅事。以下代碼將Time映射到x軸缕允,將demand映射到y(tǒng)軸,以條形圖展示不同Time所對應(yīng)demand值蹭越。stat='identity'
表示y軸使用變量的實際值而不是頻數(shù)障本,因為條形圖的另一種使用場景是展示不同類別記錄的數(shù)量,即類別值的出現(xiàn)頻數(shù),例如x軸表示男和女驾霜,y軸表示相應(yīng)性別的人群數(shù)量案训。
ggplot(BOD) + geom_bar(aes(x=Time, y=demand), stat='identity')
我們會發(fā)現(xiàn)繪圖結(jié)果中x=6
處存在一處空缺,因為ggplot2將Time這一列當作數(shù)值型來處理粪糙,因此缺少了Time為6的記錄强霎。可以在繪圖時將Time這一列轉(zhuǎn)化為因子類型蓉冈,即可解決繪圖空缺問題城舞。
ggplot(BOD) + geom_bar(aes(x=factor(Time), y=demand), stat='identity')
cabbage_exp
是gcookbook
包提供的一個數(shù)據(jù)集,一共6行6列寞酿,可以在R中直接輸入數(shù)據(jù)集的名稱查看其內(nèi)容家夺。以下代碼用條形圖展示了cabbage_exp
中,Cultivar取不同值所對應(yīng)的記錄頻數(shù)伐弹。這種情況下僅需指定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
參數(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))
# 同時繪制折線圖和散點圖
# 將aes()寫在ggplot()里面绰精,對后續(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)計和計算之后的數(shù)據(jù),而不像條形圖奕翔、折線圖裕寨、散點圖一樣僅使用原始數(shù)據(jù)。
使用geom_histogram()
、geom_density()
宾袜、geom_boxplot()
即可分別繪制直方圖捻艳、密度圖和箱線圖,具體使用方法參見下一節(jié)中的實戰(zhàn)項目试和。
分面
使用ggplot2繪圖時讯泣,可以將數(shù)據(jù)框的列映射到shape、color阅悍、size好渠、fill等繪圖元素上,從而同時展示包括x軸节视、y軸在內(nèi)的多個變量之間的關(guān)系拳锚。除此之外,也可以使用分面實現(xiàn)一圖多畫寻行,例如對于gender為male和female的情況分別畫一張圖霍掺,甚至是對多個類別型變量的全部組合情況分別作圖。
使用facet_wrap()
實現(xiàn)分面拌蜘,這里給出一個簡單的例子杆烁,將之前映射到填充色的AgeGroup作為分面變量,從而畫出AgeGroup取不同水平時所對應(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
為標簽搜索相關(guān)文章芙代,搜索結(jié)果中會有一個《R數(shù)據(jù)可視化系列》吊奢,共11篇文章,可作為進一步學(xué)習(xí)ggplot2的參考資料纹烹。