|
宏基因組按:科研中數(shù)據(jù)分析解讀占用了我們太多時間,學(xué)習(xí)R語言是生物測序領(lǐng)域數(shù)據(jù)(reads count表)分析及可視化的首選。舉個例子,擴(kuò)增子分析從fastq到OTU表通常只有de novo或reference兩種套路(1-3天)。而對OTU表開始的組間比較、網(wǎng)絡(luò)分析、機(jī)器學(xué)習(xí)等會有上百種方法和展示方式,每一篇優(yōu)秀的文章,都是數(shù)據(jù)反復(fù)咀嚼上百次優(yōu)化出來的結(jié)果(3個月-3年),而這一漫長的科研之路有R語言技能的相伴,可將統(tǒng)計(jì)分析可視化操作一網(wǎng)打盡,定能助你事半功倍。 前期公眾號己分享了擴(kuò)增子、宏基因組分析流程及可視化文章上百篇,但一直缺少基礎(chǔ)入門的知識。今天起分享一位從18年3月1號剛要從wet轉(zhuǎn)dry的學(xué)生零基礎(chǔ)學(xué)習(xí)筆記,供初學(xué)者學(xué)習(xí),雖然筆記會有不系統(tǒng)的地方,但也正是初學(xué)者需要經(jīng)歷和面對的,希望想入行的快上車,共同學(xué)習(xí),一起成長。

Welcome to ggplot2
什么是圖形的語法?ggplot是用來繪制統(tǒng)計(jì)圖形的R軟件包,是將數(shù)據(jù)分析可視化的重要工具,由其背后的一套語法支持。 圖形的語法告訴我們,一張圖形就是從數(shù)據(jù)(data)到幾何對象的圖形屬性的一個映射(mapping)。圖形中還包含數(shù)據(jù)的統(tǒng)計(jì)變換,最終繪制在某個特定的坐標(biāo)系中。另外,分面可以用來生成數(shù)據(jù)不同子集的圖形??偠灾?,一張統(tǒng)計(jì)圖形就是由上述這些獨(dú)立的圖形部件所組成的。 有一些概念需要了解: 幾何對象(Geometric,縮寫為geom)代表你在圖中實(shí)際看到的圖形元素,包括點(diǎn)、線、多邊形等 圖形屬性(Aesthetic,縮寫為aes)是包括顏色、形狀等 統(tǒng)計(jì)變換(Statistical transformation,縮寫為stats)指的是對原始數(shù)據(jù)進(jìn)行某種計(jì)算和匯總,例如二元散點(diǎn)圖加上一條回歸線 圖層(Layer)由幾何對象和統(tǒng)計(jì)變換組成 標(biāo)度(scale)是將數(shù)據(jù)的取值映射到圖形空間,例如顏色、大小和形狀表示不同的數(shù)值。展現(xiàn)標(biāo)度的常見做法是繪制圖例和坐標(biāo)軸 坐標(biāo)系(Coordinate,縮寫是coord)主要控制坐標(biāo)軸和網(wǎng)格線,描述的是數(shù)據(jù)如何映射到圖形所在平面。通常使用笛卡爾坐標(biāo)系 分面(facet)也稱條件作圖,控制分組方法和排列,描述如何將數(shù)據(jù)分解為各個子集,以及如何對子集作圖
安裝RStudio有服務(wù)器版和本地版 安裝后,還需要下載安裝ggplot2包,運(yùn)行如下命令: > install.packages('ggplot2')
ggplot2包中自帶一套數(shù)據(jù)(關(guān)于大眾汽車燃油經(jīng)濟(jì)性)可用于學(xué)習(xí) > library(ggplot2)
> mpg
# A tibble: 234 x 11
manufacturer model displ year cyl trans drv cty hwy fl class
1 audi a4 1.80 1999 4 auto(l5) f 18 29 p compa…
2 audi a4 1.80 1999 4 manual(… f 21 29 p compa…
3 audi a4 2.00 2008 4 manual(… f 20 31 p compa…
4 audi a4 2.00 2008 4 auto(av) f 21 30 p compa…
5 audi a4 2.80 1999 6 auto(l5) f 16 26 p compa…
6 audi a4 2.80 1999 6 manual(… f 18 26 p compa…
7 audi a4 3.10 2008 6 auto(av) f 18 27 p compa…
8 audi a4 quattro 1.80 1999 4 manual(… 4 18 26 p compa…
9 audi a4 quattro 1.80 1999 4 auto(l5) 4 16 25 p compa…
10 audi a4 quattro 2.00 2008 4 manual(… 4 20 28 p compa…
# ... with 224 more rows
>
關(guān)于這套數(shù)據(jù)的說明: cty和hwy:城市和高速公路行駛記錄每加侖行駛的英里數(shù)(miles per gallon,mpg) displ:發(fā)動機(jī)排量(L) drv:動力傳動系統(tǒng)(前輪f,后輪r,四輪4) model:汽車模型(由于1999年至2008年期間每年都有新版本,因此選擇了38款) class(未顯示):描述汽車種類的變量(雙座,SUV,緊湊型等) 這個數(shù)據(jù)集可以引出一系列有趣的問題,比如發(fā)動機(jī)尺寸和燃油經(jīng)濟(jì)性的相關(guān)性如何?哪些制造商更關(guān)心燃油經(jīng)濟(jì)性?在過去的10年終燃油經(jīng)濟(jì)性是否有所改善?我們可以通過使用ggplot2進(jìn)行數(shù)據(jù)分析和作圖來回答這些問題。 Getting Started with ggplot2ggplot()基本用法由ggplot2所制得圖形有三個重要的組成部分 數(shù)據(jù) 數(shù)據(jù)和視覺變量屬性之間的映射(aesthetic mappings) 呈現(xiàn)數(shù)據(jù)結(jié)果的圖層(一般使用 geom()函數(shù))
舉例 繪制displ和hwy相關(guān)性的散點(diǎn)圖,腳本如下: library(ggplot2)
mpg ## 加載數(shù)據(jù)集
ggplot(mpg, aes(x = displ, y = hwy)) +
geom_point()
相應(yīng)的,ggplot2參數(shù)中mpg是數(shù)據(jù)集(即關(guān)于耗油量的數(shù)據(jù)集),映射即x、y坐標(biāo)軸對應(yīng)的數(shù)據(jù),圖層是散點(diǎn)圖。 注意該函數(shù)調(diào)用的結(jié)構(gòu),第一排包括數(shù)據(jù)集和映射 aes(),放在 ggplot()中,然后再通過 + 添加圖層 geom_point()(散點(diǎn)圖) 運(yùn)行腳本后生成圖片: 
圖1:黑白散點(diǎn)圖另外, aes()中的前兩個參數(shù)默認(rèn)為x,y軸的映射,因此腳本也可簡寫為: library(ggplot2)
mpg
ggplot(mpg, aes(displ, hwy)) +
geom_point()
設(shè)定圖形顏色、大小和形狀利用圖形屬性(顏色和形狀)可以來比較不同分組)。 圖形的顏色、大小和形狀等都是給繪圖添加的額外變量,即標(biāo)度(scale),添加在函數(shù) aes() 的參數(shù)中,如下(注:class、drv、cyl等是數(shù)據(jù)集中的類別名稱): aes(displ, hwy, colour = class) aes(displ, hwy, shape = drv) aes(displ, hwy, size = cyl)
因此,在圖1的基礎(chǔ)上,增加一個顏色參數(shù),將class變量映射成不同的顏色,并創(chuàng)建圖例,腳本如下: ggplot(mpg, aes(displ, hwy, colour = class)) +
geom_point()
生成圖片: 
圖2:彩色散點(diǎn)圖如果并不需要根據(jù)class類區(qū)分多種顏色,也可以將所有散點(diǎn)編輯成統(tǒng)一的顏色。這種情況下則在圖層函數(shù)參數(shù)中進(jìn)行修改: 將所有散點(diǎn)設(shè)置為藍(lán)色: ggplot(mpg, aes(displ, hwy)) +
geom_point(colour = 'blue')
生成圖片: 
圖3:藍(lán)色散點(diǎn)圖
分面 (Facetting)分面是比較不同分組的另一種方法:可以將數(shù)據(jù)分割成若干子集,然后創(chuàng)建一個圖形矩陣,將每個子集繪制到圖形矩陣的窗格中。 分面有兩種主要類型:網(wǎng)格(grid)和包裝(wrapped)。相較而言,Wrapped更常用。 使用方法是添加 facet_wrap()函數(shù),參數(shù)寫法是 ~+變量,例如 ggplot(mpg, aes(displ, hwy)) +
geom_point() +
facet_wrap(~class)
生成圖片: 
圖4:分面圖
繪制幾何對象(Plot Geoms)ggplot2繪制各類幾何對象的功能很強(qiáng)大。 geom_point()是散點(diǎn)圖的函數(shù)命令,除此之外,ggplot2還具有大量繪制其他幾何對象的命令,幾乎可以畫出任何一種類型的圖形,以下是幾種主要的常用命令: geom_smooth():擬合一條平滑曲線,并顯示標(biāo)準(zhǔn)誤
geom_boxplot():繪制箱線圖,概括一系列點(diǎn)的分布情況
geom_histogram():繪制直方圖
geom_bar():繪制條形圖
geom_path():在數(shù)據(jù)之間連線
1. 向圖中添加平滑的曲線(Smoother)如果散點(diǎn)圖的數(shù)據(jù)較多噪點(diǎn)較大,那么數(shù)據(jù)顯示的趨勢就不是十分的明顯,這種情況下可以使用 geom_smooth()函數(shù)添加一條平滑曲線 ggplot(mpg, aes(displ, hwy)) +
geom_point() +
geom_smooth()
在第三層加上一個 geom_smooth()命令即可在散點(diǎn)圖的基礎(chǔ)上添加一條平滑的趨勢曲線: 
圖5:散點(diǎn)趨勢線圖其中灰色部分是置信區(qū)間,如果不需要標(biāo)明標(biāo)準(zhǔn)誤,可以添加參數(shù) geom_smooth(se=FALSE),即可取消灰色部分。 通過改變 method可以設(shè)置曲線平滑度等多種參數(shù)。而 method則包括幾種類型:在數(shù)據(jù)量n較小時,系統(tǒng)默認(rèn) method='loess'算法;而在數(shù)據(jù)量n>1000時,則采用 method='gam'算法;此外還有 method='lm' 和 method='rlm' 算法。 method='loess':在數(shù)據(jù)量較小時默認(rèn)使用。 span參數(shù)控制曲線的平滑程度,其取值范圍是0~1(從很不平滑到很平滑)
method='gam':此算法通過調(diào)用mgcv包擬合一個廣義可加模型,使用formula = y ? s(x) 或y ? s(x, bs = 'cs')公式。
ggplot(mpg, aes(displ, hwy)) +
geom_point() +
geom_smooth(method = 'gam', formula = y ~ s(x))
2. 箱線圖(Boxplots)變量可以分為很多種,比如連續(xù)變量、分類變量等。當(dāng)數(shù)據(jù)集中包含了分類變量和連續(xù)變量時,我們想了解連續(xù)變量是怎樣隨著不同的分類變量水平變化而變化,這時散點(diǎn)圖中則會出現(xiàn)大量重疊,而箱式圖則可以更清晰的展示這類數(shù)據(jù)。 以耗油量的數(shù)據(jù)集為例,我們想了解不同類別汽車的耗油量有什么差別,就可以使用箱式圖。 箱式圖主要有三種函數(shù): ggplot(mpg, aes(drv, hwy))+
geom_jitter()

圖6:擾動點(diǎn)圖ggplot(mpg, aes(drv, hwy))+
geom_boxplot()

圖7:箱式圖ggplot(mpg, aes(drv, hwy))+
geom_violin()

圖8:小提琴圖3. 直方圖(Histograms)和密度曲線圖(Frequency Polygons)這兩類圖適合于展示單個變量的分布,但不太適合在組間進(jìn)行比較。 ggplot(mpg, aes(hwy)) +
geom_histogram(binwidth = 0.6)

圖9:直方圖ggplot(mpg, aes(hwy)) +
geom_freqpoly(binwidth = 0.6)

圖10:密度曲線圖ggplot(mpg, aes(displ, colour = drv)) +
geom_freqpoly(binwidth = 0.5)

圖11:使用顏色區(qū)分類別的密度曲線圖ggplot(mpg, aes(displ, fill = drv)) +
geom_histogram(binwidth = 0.5) +
facet_wrap(~drv, ncol = 1)

圖12:分面直方圖4. 條形圖(Bar Charts)geom_bar()是用于繪制條形圖的函數(shù)
例如 ggplot(mpg, aes(manufacturer)) +
geom_bar()

圖13:基本條形圖5. 時間序列線條圖和路徑圖線條圖(Lines)和路徑圖(Path plot)通常用于可視化時間序列數(shù)據(jù)。 這里我們使用另一套包含較多時間序列的數(shù)據(jù)集(美國過去40年經(jīng)濟(jì)數(shù)據(jù))??梢宰龀鲭S著時間變化,美國失業(yè)率變化的示意圖: ggplot(economics, aes(date, unemploy/pop)) +
geom_line()

圖14:美國失業(yè)率隨時間變化數(shù)據(jù)圖例如,下面我們可以畫出失業(yè)率和失業(yè)人數(shù)隨時間變化之間的關(guān)系的路徑圖 year <> function(x) as.POSIXlt(x)$year + 1900
ggplot(economics, aes(unemploy / pop, uempmed)) +
geom_path(colour = 'grey50') +
geom_point(aes(colour = year(date)))

圖15:路徑圖
修改坐標(biāo)軸library(ggplot2)
mpg
ggplot(mpg, aes(cty, hwy)) +
geom_point(alpha = 1 / 3) +
xlab('city driving (mpg)') +
ylab('highway driving (mpg)')

圖16:修改坐標(biāo)軸名稱示例圖ggplot(mpg, aes(drv, hwy)) +
geom_jitter(width = 0.25, na.rm = TRUE) +
ylim(NA, 30)

圖17:設(shè)定縱軸數(shù)值范圍示例圖
其它輸出方法除了寫腳本的方法,在交互式程序下也可以通過將繪圖保存在變量中,然后通過 print()生成圖片。直接輸入p也可以預(yù)覽圖片。關(guān)于如何保存各種圖片大小與格式,我們將來會講到。 > p <> ggplot(mpg, aes(displ, hwy, colour = factor(cyl))) +
+ geom_point()
> print(p)
> p
參考資料: Hadley Wickham(2016). ggplot2. Springer International Publishing. doi: 10.1007/978-3-319-24277-4 《R語言應(yīng)用系列叢書·ggplot2:數(shù)據(jù)分析與圖形藝術(shù)》
|