查看原文
其他

圈圈 2018-06-01

宏基因组按:科研中数据分析解读占用了我们太多时间,学习R语言是生物测序领域数据(reads count表)分析及可视化的首选。举个例子,扩增子分析从fastq到OTU表通常只有de novo或reference两种套路(1-3天)。而对OTU表开始的组间比较、网络分析、机器学习等会有上百种方法和展示方式,每一篇优秀的文章,都是数据反复咀嚼上百次优化出来的结果(3个月-3年),而这一漫长的科研之路有R语言技能的相伴,可将统计分析可视化操作一网打尽,定能助你事半功倍。

前期公众号己分享了扩增子、宏基因组分析流程及可视化文章上百篇,但一直缺少基础入门的知识。今天起分享一位从18年3月1号刚要从wet转dry的学生零基础学习笔记,供初学者学习,虽然笔记会有不系统的地方,但也正是初学者需要经历和面对的,希望想入行的快上车,共同学习,一起成长。



Welcome to ggplot2

什么是图形的语法?

ggplot是用来绘制统计图形的R软件包,是将数据分析可视化的重要工具,由其背后的一套语法支持。

图形的语法告诉我们,一张图形就是从数据(data)到几何对象的图形属性的一个映射(mapping)。图形中还包含数据的统计变换,最终绘制在某个特定的坐标系中。另外,分面可以用来生成数据不同子集的图形。总而言之,一张统计图形就是由上述这些独立的图形部件所组成的。

有一些概念需要了解:

  • 几何对象(Geometric,缩写为geom)代表你在图中实际看到的图形元素,包括点、线、多边形等

  • 图形属性(Aesthetic,缩写为aes)是包括颜色、形状等

  • 统计变换(Statistical transformation,缩写为stats)指的是对原始数据进行某种计算和汇总,例如二元散点图加上一条回归线

  • 图层(Layer)由几何对象和统计变换组成

  • 标度(scale)是将数据的取值映射到图形空间,例如颜色、大小和形状表示不同的数值。展现标度的常见做法是绘制图例和坐标轴

  • 坐标系(Coordinate,缩写是coord)主要控制坐标轴和网格线,描述的是数据如何映射到图形所在平面。通常使用笛卡尔坐标系

  • 分面(facet)也称条件作图,控制分组方法和排列,描述如何将数据分解为各个子集,以及如何对子集作图

安装

RStudio有服务器版和本地版

安装后,还需要下载安装ggplot2包,运行如下命令:

  1. > install.packages("ggplot2")

ggplot2包中自带一套数据(关于大众汽车燃油经济性)可用于学习

  1. > library(ggplot2)

  2. > mpg

  3. # A tibble: 234 x 11

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

  5.   <chr>        <chr>      <dbl> <int> <int> <chr>    <chr> <int> <int> <chr> <chr>

  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. >

关于这套数据的说明

cty和hwy:城市和高速公路行驶记录每加仑行驶的英里数(miles per gallon,mpg)

displ:发动机排量(L)

drv:动力传动系统(前轮f,后轮r,四轮4)

model:汽车模型(由于1999年至2008年期间每年都有新版本,因此选择了38款)

class(未显示):描述汽车种类的变量(双座,SUV,紧凑型等)

这个数据集可以引出一系列有趣的问题,比如发动机尺寸和燃油经济性的相关性如何?哪些制造商更关心燃油经济性?在过去的10年终燃油经济性是否有所改善?我们可以通过使用ggplot2进行数据分析和作图来回答这些问题。

Getting Started with ggplot2

ggplot()基本用法

由ggplot2所制得图形有三个重要的组成部分

  1. 数据

  2. 数据和视觉变量属性之间的映射(aesthetic mappings)

  3. 呈现数据结果的图层(一般使用 geom()函数)

举例

绘制displ和hwy相关性的散点图,脚本如下:

  1. library(ggplot2)

  2. mpg                  ## 加载数据集

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

  4.  geom_point()

相应的,ggplot2参数中mpg是数据集(即关于耗油量的数据集),映射即x、y坐标轴对应的数据,图层是散点图。

注意该函数调用的结构,第一排包括数据集和映射 aes(),放在 ggplot()中,然后再通过 + 添加图层 geom_point()(散点图)

运行脚本后生成图片:

图1:黑白散点图

另外, aes()中的前两个参数默认为x,y轴的映射,因此脚本也可简写为:

  1. library(ggplot2)

  2. mpg

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

  4.  geom_point()


设定图形颜色、大小和形状

利用图形属性(颜色和形状)可以来比较不同分组)。

图形的颜色、大小和形状等都是给绘图添加的额外变量,即标度(scale),添加在函数 aes() 的参数中,如下(注:class、drv、cyl等是数据集中的类别名称):

  • aes(displ, hwy, colour = class)

  • aes(displ, hwy, shape = drv)

  • aes(displ, hwy, size = cyl)

因此,在图1的基础上,增加一个颜色参数,将class变量映射成不同的颜色,并创建图例,脚本如下:

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

  2.  geom_point()

生成图片:

图2:彩色散点图

如果并不需要根据class类区分多种颜色,也可以将所有散点编辑成统一的颜色。这种情况下则在图层函数参数中进行修改:

将所有散点设置为蓝色:

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

  2.  geom_point(colour = "blue")

生成图片:

图3:蓝色散点图

分面 (Facetting)

分面是比较不同分组的另一种方法:可以将数据分割成若干子集,然后创建一个图形矩阵,将每个子集绘制到图形矩阵的窗格中。

分面有两种主要类型:网格(grid)和包装(wrapped)。相较而言,Wrapped更常用。

使用方法是添加 facet_wrap()函数,参数写法是 ~+变量,例如

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

  2.  geom_point() +

  3.  facet_wrap(~class)

生成图片:

图4:分面图

绘制几何对象(Plot Geoms)

ggplot2绘制各类几何对象的功能很强大。 geom_point()是散点图的函数命令,除此之外,ggplot2还具有大量绘制其他几何对象的命令,几乎可以画出任何一种类型的图形,以下是几种主要的常用命令:

  • geom_smooth():拟合一条平滑曲线,并显示标准误

  • geom_boxplot():绘制箱线图,概括一系列点的分布情况

  • geom_histogram():绘制直方图

  • geom_bar():绘制条形图

  • geom_path():在数据之间连线

1. 向图中添加平滑的曲线(Smoother)

如果散点图的数据较多噪点较大,那么数据显示的趋势就不是十分的明显,这种情况下可以使用 geom_smooth()函数添加一条平滑曲线

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

  2.  geom_point() +

  3.  geom_smooth()

在第三层加上一个 geom_smooth()命令即可在散点图的基础上添加一条平滑的趋势曲线:

图5:散点趋势线图

其中灰色部分是置信区间,如果不需要标明标准误,可以添加参数 geom_smooth(se=FALSE),即可取消灰色部分。

通过改变 method可以设置曲线平滑度等多种参数。而 method则包括几种类型:在数据量n较小时,系统默认 method="loess"算法;而在数据量n>1000时,则采用 method="gam"算法;此外还有 method="lm"method="rlm" 算法。

  • method="loess":在数据量较小时默认使用。 span参数控制曲线的平滑程度,其取值范围是0~1(从很不平滑到很平滑)

  • method="gam":此算法通过调用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":这两种算法拟合的是线性模型,默认条件下回生成一条直线。可以通过添加二项式改变自由度使曲线波动变大。后者对异常值不敏感,但在使用前需要先加载MASS包。

2. 箱线图(Boxplots)

变量可以分为很多种,比如连续变量、分类变量等。当数据集中包含了分类变量和连续变量时,我们想了解连续变量是怎样随着不同的分类变量水平变化而变化,这时散点图中则会出现大量重叠,而箱式图则可以更清晰的展示这类数据。

以耗油量的数据集为例,我们想了解不同类别汽车的耗油量有什么差别,就可以使用箱式图。

箱式图主要有三种函数:

  • geom_jitter():扰动点图,和普通散点图相比减少数据点的重叠

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

  2.  geom_jitter()

图6:扰动点图
  • geom_boxplot():箱式图,,可以相对直观的看出数据分布特点。箱式图用于多组数据平均水平和变异程度的直观分析比较。每组数据均可呈现其最小值、最大值、平均水平,最小值、最大值形成间距都可以反映数据的变异程度。

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

  2.  geom_boxplot()

图7:箱式图
  • geom_violin():小提琴图,在普通箱式图的基础上可以从形状表示出点的“密度”

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

  2.  geom_violin()

图8:小提琴图

3. 直方图(Histograms)和密度曲线图(Frequency Polygons)

这两类图适合于展示单个变量的分布,但不太适合在组间进行比较。

  • geom_histogram():直方图又称质量分布图,由一系列高度不等的纵向条纹或线段表示数据分布的情况。其中 binwidth参数可以用来设置组距,通过组距调节平滑度。

  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:密度曲线图
  • 可以通过设置颜色标记类别变量:

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

  2. geom_freqpoly(binwidth = 0.5)

图11:使用颜色区分类别的密度曲线图
  • 也可以使用分面模式来区别类别,添加 facet_wrap()函数:

  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()是用于绘制条形图的函数

例如

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

  2.  geom_bar()

图13:基本条形图

5. 时间序列线条图和路径图

线条图(Lines)和路径图(Path plot)通常用于可视化时间序列数据。

  • 线条图x轴一般表示时间,展示单个变量随时间变化的情况

这里我们使用另一套包含较多时间序列的数据集(美国过去40年经济数据)。可以做出随着时间变化,美国失业率变化的示意图:

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

  2.  geom_line()

图14:美国失业率随时间变化数据图
  • 路径图则展示两个变量随时间联动的情况,事件反映在点的顺序上。例如,将两个时间序列绘制在同一张图中,可以使用散点图,但并不能够反映出随时间变化的情况,对此解决的方法就是将临近时点的三点连接起来形成一张路径图。

例如,下面我们可以画出失业率和失业人数随时间变化之间的关系的路径图

  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:路径图

修改坐标轴

  • xlab()和 ylab()是两个最常用的修改和补充坐标轴名称的函数。可以添加在 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:修改坐标轴名称示例图
  • xlim()和 ylim() 可用来限制横轴或纵轴的宽度/量程/范围/最大值最小值等。例如:

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

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

  3.  ylim(NA, 30)

图17:设定纵轴数值范围示例图

其它输出方法

除了写脚本的方法,在交互式程序下也可以通过将绘图保存在变量中,然后通过 print()生成图片。直接输入p也可以预览图片。关于如何保存各种图片大小与格式,我们将来会讲到。

  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语言应用系列丛书·ggplot2:数据分析与图形艺术》

快快和我一起上车,请关注:生信小白学习记


猜你喜欢

写在后面

为鼓励读者交流、快速解决科研困难,我们建立了“宏基因组”专业讨论群,目前己有国内外120+ PI,1200+ 一线科研人员加入。参与讨论,获得专业解答,欢迎分享此文至朋友圈,并扫码加主编好友带你入群,务必备注“姓名-单位-研究方向-职称/年级”。技术问题寻求帮助,首先阅读《如何优雅的提问》学习解决问题思路,仍末解决群内讨论,问题不私聊,帮助同行。

学习16S扩增子、宏基因组科研思路和分析实战,关注“宏基因组”

    您可能也对以下帖子感兴趣

    文章有问题?点此查看未经处理的缓存