电竞比分网-中国电竞赛事及体育赛事平台

分享

ggplot2筆記1:認(rèn)識ggplot2、基本用法以及如何繪制幾何對象

 萌小芊 2018-03-18

宏基因組按:科研中數(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)行如下命令:

  1. > install.packages('ggplot2')

ggplot2包中自帶一套數(shù)據(jù)(關(guān)于大眾汽車燃油經(jīng)濟(jì)性)可用于學(xué)習(xí)

  1. > library(ggplot2)

  2. > mpg

  3. # A tibble: 234 x 11

  4.   manufacturer model      displ  year   cyl trans    drv     cty   hwy fl    class

  5.                    

  6. 1 audi         a4          1.80  1999     4 auto(l5) f        18    29 p     compa

  7. 2 audi         a4          1.80  1999     4 manual(… f        21    29 p     compa

  8. 3 audi         a4          2.00  2008     4 manual(… f        20    31 p     compa

  9. 4 audi         a4          2.00  2008     4 auto(av) f        21    30 p     compa

  10. 5 audi         a4          2.80  1999     6 auto(l5) f        16    26 p     compa

  11. 6 audi         a4          2.80  1999     6 manual(… f        18    26 p     compa

  12. 7 audi         a4          3.10  2008     6 auto(av) f        18    27 p     compa

  13. 8 audi         a4 quattro  1.80  1999     4 manual(… 4        18    26 p     compa

  14. 9 audi         a4 quattro  1.80  1999     4 auto(l5) 4        16    25 p     compa

  15. 10 audi         a4 quattro  2.00  2008     4 manual(… 4        20    28 p     compa

  16. # ... with 224 more rows

  17. >

關(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 ggplot2

ggplot()基本用法

由ggplot2所制得圖形有三個重要的組成部分

  1. 數(shù)據(jù)

  2. 數(shù)據(jù)和視覺變量屬性之間的映射(aesthetic mappings)

  3. 呈現(xiàn)數(shù)據(jù)結(jié)果的圖層(一般使用 geom()函數(shù))

舉例

繪制displ和hwy相關(guān)性的散點(diǎn)圖,腳本如下:

  1. library(ggplot2)

  2. mpg                  ## 加載數(shù)據(jù)集

  3. ggplot(mpg, aes(x = displ, y = hwy)) +

  4.  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軸的映射,因此腳本也可簡寫為:

  1. library(ggplot2)

  2. mpg

  3. ggplot(mpg, aes(displ, hwy)) +

  4.  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)建圖例,腳本如下:

  1. ggplot(mpg, aes(displ, hwy, colour = class)) +

  2.  geom_point()

生成圖片:

圖2:彩色散點(diǎn)圖

如果并不需要根據(jù)class類區(qū)分多種顏色,也可以將所有散點(diǎn)編輯成統(tǒng)一的顏色。這種情況下則在圖層函數(shù)參數(shù)中進(jìn)行修改:

將所有散點(diǎn)設(shè)置為藍(lán)色:

  1. ggplot(mpg, aes(displ, hwy)) +

  2.  geom_point(colour = 'blue')

生成圖片:

圖3:藍(lán)色散點(diǎn)圖

分面 (Facetting)

分面是比較不同分組的另一種方法:可以將數(shù)據(jù)分割成若干子集,然后創(chuàng)建一個圖形矩陣,將每個子集繪制到圖形矩陣的窗格中。

分面有兩種主要類型:網(wǎng)格(grid)和包裝(wrapped)。相較而言,Wrapped更常用。

使用方法是添加 facet_wrap()函數(shù),參數(shù)寫法是 ~+變量,例如

  1. ggplot(mpg, aes(displ, hwy)) +

  2.  geom_point() +

  3.  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ù)添加一條平滑曲線

  1. ggplot(mpg, aes(displ, hwy)) +

  2.  geom_point() +

  3.  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')公式。

  1. ggplot(mpg, aes(displ, hwy)) +

  2.  geom_point() +

  3.  geom_smooth(method = 'gam', formula = y ~ s(x))

  • method='lm' 和 method='rlm':這兩種算法擬合的是線性模型,默認(rèn)條件下回生成一條直線??梢酝ㄟ^添加二項(xiàng)式改變自由度使曲線波動變大。后者對異常值不敏感,但在使用前需要先加載MASS包。

2. 箱線圖(Boxplots)

變量可以分為很多種,比如連續(xù)變量、分類變量等。當(dāng)數(shù)據(jù)集中包含了分類變量和連續(xù)變量時,我們想了解連續(xù)變量是怎樣隨著不同的分類變量水平變化而變化,這時散點(diǎn)圖中則會出現(xiàn)大量重疊,而箱式圖則可以更清晰的展示這類數(shù)據(jù)。

以耗油量的數(shù)據(jù)集為例,我們想了解不同類別汽車的耗油量有什么差別,就可以使用箱式圖。

箱式圖主要有三種函數(shù):

  • geom_jitter():擾動點(diǎn)圖,和普通散點(diǎn)圖相比減少數(shù)據(jù)點(diǎn)的重疊

  1. ggplot(mpg, aes(drv, hwy))+

  2.  geom_jitter()

圖6:擾動點(diǎn)圖
  • geom_boxplot():箱式圖,,可以相對直觀的看出數(shù)據(jù)分布特點(diǎn)。箱式圖用于多組數(shù)據(jù)平均水平和變異程度的直觀分析比較。每組數(shù)據(jù)均可呈現(xiàn)其最小值、最大值、平均水平,最小值、最大值形成間距都可以反映數(shù)據(jù)的變異程度。

  1. ggplot(mpg, aes(drv, hwy))+

  2.  geom_boxplot()

圖7:箱式圖
  • geom_violin():小提琴圖,在普通箱式圖的基礎(chǔ)上可以從形狀表示出點(diǎn)的“密度”

  1. ggplot(mpg, aes(drv, hwy))+

  2.  geom_violin()

圖8:小提琴圖

3. 直方圖(Histograms)和密度曲線圖(Frequency Polygons)

這兩類圖適合于展示單個變量的分布,但不太適合在組間進(jìn)行比較。

  • geom_histogram():直方圖又稱質(zhì)量分布圖,由一系列高度不等的縱向條紋或線段表示數(shù)據(jù)分布的情況。其中 binwidth參數(shù)可以用來設(shè)置組距,通過組距調(diào)節(jié)平滑度。

  1. ggplot(mpg, aes(hwy)) +

  2.  geom_histogram(binwidth = 0.6)

圖9:直方圖
  • geom_freqpoly():密度曲線圖

  1. ggplot(mpg, aes(hwy)) +

  2.  geom_freqpoly(binwidth = 0.6)

圖10:密度曲線圖
  • 可以通過設(shè)置顏色標(biāo)記類別變量:

  1. ggplot(mpg, aes(displ, colour = drv)) +

  2. geom_freqpoly(binwidth = 0.5)

圖11:使用顏色區(qū)分類別的密度曲線圖
  • 也可以使用分面模式來區(qū)別類別,添加 facet_wrap()函數(shù):

  1. ggplot(mpg, aes(displ, fill = drv)) +

  2.  geom_histogram(binwidth = 0.5) +

  3.  facet_wrap(~drv, ncol = 1)

圖12:分面直方圖

4. 條形圖(Bar Charts)

geom_bar()是用于繪制條形圖的函數(shù)

例如

  1. ggplot(mpg, aes(manufacturer)) +

  2.  geom_bar()

圖13:基本條形圖

5. 時間序列線條圖和路徑圖

線條圖(Lines)和路徑圖(Path plot)通常用于可視化時間序列數(shù)據(jù)。

  • 線條圖x軸一般表示時間,展示單個變量隨時間變化的情況

這里我們使用另一套包含較多時間序列的數(shù)據(jù)集(美國過去40年經(jīng)濟(jì)數(shù)據(jù))??梢宰龀鲭S著時間變化,美國失業(yè)率變化的示意圖:

  1. ggplot(economics, aes(date, unemploy/pop)) +

  2.  geom_line()

圖14:美國失業(yè)率隨時間變化數(shù)據(jù)圖
  • 路徑圖則展示兩個變量隨時間聯(lián)動的情況,事件反映在點(diǎn)的順序上。例如,將兩個時間序列繪制在同一張圖中,可以使用散點(diǎn)圖,但并不能夠反映出隨時間變化的情況,對此解決的方法就是將臨近時點(diǎn)的三點(diǎn)連接起來形成一張路徑圖。

例如,下面我們可以畫出失業(yè)率和失業(yè)人數(shù)隨時間變化之間的關(guān)系的路徑圖

  1. year <> function(x) as.POSIXlt(x)$year + 1900

  2. ggplot(economics, aes(unemploy / pop, uempmed)) +

  3.  geom_path(colour = 'grey50') +

  4.  geom_point(aes(colour = year(date)))

圖15:路徑圖

修改坐標(biāo)軸

  • xlab()和 ylab()是兩個最常用的修改和補(bǔ)充坐標(biāo)軸名稱的函數(shù)??梢蕴砑釉?nbsp;ggplot()第三行-第四行的位置。例如:

  1. library(ggplot2)

  2. mpg

  3. ggplot(mpg, aes(cty, hwy)) +

  4.  geom_point(alpha = 1 / 3) +

  5.  xlab('city driving (mpg)') +

  6.  ylab('highway driving (mpg)')

圖16:修改坐標(biāo)軸名稱示例圖
  • xlim()和 ylim() 可用來限制橫軸或縱軸的寬度/量程/范圍/最大值最小值等。例如:

  1. ggplot(mpg, aes(drv, hwy)) +

  2.  geom_jitter(width = 0.25, na.rm = TRUE) +

  3.  ylim(NA, 30)

圖17:設(shè)定縱軸數(shù)值范圍示例圖

其它輸出方法

除了寫腳本的方法,在交互式程序下也可以通過將繪圖保存在變量中,然后通過 print()生成圖片。直接輸入p也可以預(yù)覽圖片。關(guān)于如何保存各種圖片大小與格式,我們將來會講到。

  1. > p <> ggplot(mpg, aes(displ, hwy, colour = factor(cyl))) +

  2. +     geom_point()

  3. > print(p)

  4. > p


參考資料:

  1. Hadley Wickham(2016). ggplot2. Springer International Publishing. doi: 10.1007/978-3-319-24277-4

  2. 《R語言應(yīng)用系列叢書·ggplot2:數(shù)據(jù)分析與圖形藝術(shù)》

    本站是提供個人知識管理的網(wǎng)絡(luò)存儲空間,所有內(nèi)容均由用戶發(fā)布,不代表本站觀點(diǎn)。請注意甄別內(nèi)容中的聯(lián)系方式、誘導(dǎo)購買等信息,謹(jǐn)防詐騙。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請點(diǎn)擊一鍵舉報(bào)。
    轉(zhuǎn)藏 分享 獻(xiàn)花(0

    0條評論

    發(fā)表

    請遵守用戶 評論公約

    類似文章 更多