查看原文
其他

如何通过Google来使用ggplot2可视化

2017-01-29 jimmy 生信技能树

今天是大年初二,这篇文章我只想传达一点:

没有什么菜鸟级别的生物信息学数据处理是不能通过Google得到解决方案的,如果有,请换个关键词继续Google!


第一部分

首先用两分钟的时间简单介绍一下R语言

因为这个语言是肉丝儿Ross Ihaka)和萝卜特Robert Gentleman)两个人1992年在S语言的基础上发明出来的开源语言,所以叫做R语言。这两个人是统计学教授出身,所以R语言在统计学方面有着纯正的血统!如果你平时的工作和统计相关,你好意思不会点R语言么?

另外,在R语言的官网上,有这样一句话

One of R’s strengths is the ease with which well-designed publication-quality plots can be produced, including mathematical symbols and formulae where needed.

看明白了么盆友!

画图,画各种各样的图,画各种各样高逼格的图,画各种各样高逼格可以出版的图,是R语言自带的另一个光芒属性。如果你正在为如何画出各种好看的可视化图而苦恼,难道你不应该学习一点R语言么?

对了,如果你以为R语言的创造者肉丝儿萝卜特是一对情侣(这里真的没有鱼香什么事),那你错了,因为他俩长这样!


第二部分

谈到画图,R语言里面有一个极其强大的工具,它是我们今天要谈论的主角:ggplot2

ggplot2 绘图作为R语言可视化阵营扛把子的地位是毋庸置疑的,我能与它结缘主要是因为自己本来没有正经地学过R语言,基础绘图里面多如繁星的参数调的我晕头转向。

正好看到一些公司的科研结题报告里面非常赞的图都是ggplot2出品的,就下定决心学一下。老规矩,先看点中文资料,接触最早是Y叔的ggplot系列,作为初学者入门指引绰绰有余了。把代码在R里面原样输出看看效果,把数据和代码和图形在脑海中形成连接,最后留在我心底的就只有映射这一核心思想。

我就明白我已经学会ggplot2的可视化了,虽然那时候的我画一个完整完美的图仍旧是各种磕磕碰碰,但并不影响我已经掌握了它的精髓。

两年多过去了,本身工作中需要我亲自来画图的机会非常少,所以我的可视化能力毫无进展,甚至有小幅度后退。最近在做直播我的基因组系列,完全是一个人要把一个团队的分析要点全部hold住,对我本身也是一个不小的考验。

前面的科研常规流程,包括下载各种公共数据,下载安装常见的软件,跑流程是我习以为常的事情。但作为自己的基因组,我的探索肯定不能像以往做科研项目那样浅尝辄止,马马虎虎的交差(希望老板不要看到)。我开始一步步地探索以前未接触的,懒得接触的,错过的细节知识点。而展现知识点给读者最重要的环节就是可视化

今时不同往日,我木有手下,得亲自上阵。

  • 一篇一篇文献地读

  • 一个细节一个细节地搜索

  • 一行代码一行代码地敲

  • 一个参数一个参数地调整

  • 一个问题一个问题地求助。

大家由最近的直播我的基因组45—55讲应该可以看得出来,可视化方面我的确很弱,但我还是想分享一下自己是如何通过google来使用ggplot做可视化的!(如果你ggplot已经小成请略过后面的内容,新年快乐.jpg)

下面的每张图我都是通过搜索做出来的,因为此时的我ggplot2语法已经忘光了。(请务必亲自把我给出的关键词输入到google自己搜索一遍,我给出的链接复制到浏览器用心看一遍,不要以为就只有看个手机版的就能学会我的学习方法)

比如画X,Y变量(测序深度和GC含量)的散点图需要添加回归曲线,标记回归方程。

【直播】我的基因组47:测序深度和GC含量的关系

我在Google里面是这样搜索的:

add regression line to scatter plot in rggplot2

http://www.cookbook-r.com/Graphs/Scatterplots_(ggplot2)/

http://stackoverflow.com/questions/7549694/ggplot2-adding-regression-line-equation-and-r2-on-graph

然后我只看了这两个链接而已,就得到了自己想要的图!

比如画多个分组变量(SNV和INDEL的het,hom)的条形图,并且标记每个变量的数值,还有修改图例,重新排序!

【直播】我的基因组54:把我的variation跟dbSNP数据库相比较

change legend in r ggplot2

http://www.cookbook-r.com/Graphs/Legends_(ggplot2)/

http://stackoverflow.com/questions/14622421/how-to-change-legend-title-in-ggplot-density

add values for bar plot in R ggplot

http://stackoverflow.com/questions/6644997/showing-data-values-on-stacked-bar-chart-in-ggplot2

http://stackoverflow.com/questions/11653268/adding-labels-to-ggplot-bar-chart

再比如画人的22+X+Y染色体的测序深度的分布!

链接【直播】我的基因组51:画全基因范围内的染色体reads覆盖度图

chromosome coverage r ggplot2

http://stackoverflow.com/questions/14629607/long-vector-plot-coverage-plot-in-r

https://www.biostars.org/p/18954/

还有GO的分类富集分析结果图,或者火山图,或者其它:

go structure enrichment results r ggplot2

https://cran.r-project.org/web/packages/GOplot/vignettes/GOplot_vignette.html

https://arxiv.org/ftp/arxiv/papers/1602/1602.07103.pdf

基本上生物信息学所有常见的图在Google里面都可以找到现成的代码!

如果你跟我一样,只是想达到目的,那就Google好了。如果你需要创造新的可视化,彻底走向可视化这条路就有点麻烦了,你可能需要看大量的书籍,比如上面我们Google结果经常出现的《cookbook R》 和 《ggplot2 elegant graphics for data analysis》就是很优秀的。

不过,如果你们点进去看了我画的都是些什么东西,就明白,不要学我! 我只会修改别人的代码画图而已,如果你要彻底掌握可视化,请移步去Y叔的博客

GitHub 网址 http://guangchuangyu.github.io/

或者关注他的公众号


第三部分

这一部分是我和本文编辑学习ggplot2 的一小部分总结,如果你想看全部总结可以加生信菜鸟团QQ群下载 Word 版本

什么,群号是啥?文末告诉你,先好好看文章。


  • 关于R绘图的基本知识:

R语言目前比较常用的有三大绘图系统

  • 基本绘图系统(Base Plotting System)

  • Lattice绘图系统(Lattice Plotting System)

  • ggplot2绘图系统(ggplot2 Plotting System)

其中,基本绘图系统调用绘图函数graphics包,其中包括 plot/hist/lines/text等命令,每次你调用一个函数都会启用一个图形设备并在该设备上直接绘图。

Lattice绘图系统相对高级一些,它会调用lattice包,其中包括 xyplot/histogram/stripplot/dotplot等命令,如果你使用 panel函数,还可以控制每个面板内的绘图。

最高级的当属ggplot2

ggplot2中,你首先利用 qplot()完成类似于基本绘图系统中 plot的操作,参数包括 geom/asethetics等;随后你可以利用 ggplot()这个核心实现 qplot()所无法实现得功能,它开创性的在R语言绘图中增加了图层的概念(如果你熟悉PS应该对图层不陌生)。


  • 关于ggplot2,下面的内容很重要!

首先必须练习几个基本图形来了解它映射的思想。

散点图、直方图、条形图、密度图、箱线图。

然后加载包及数据集,选取一个小量数据集来做分析,测试数据如下:

各种属性映射由 ggplot()函数执行,只需要加一个图层,比如 geom_point()告诉ggplot2要画散点,于是所有的属性都映射到散点上。

geom_point()完成的就是几何对象的映射,ggplot2提供了各种几何对象映射,如 geom_histogram用于直方图, geom_bar用于画柱状图, geom_boxplot用于画箱式图等等。

不同的几何对象,要求的属性会有些不同,这些属性也可以在几何对象映射时提供。(属性就是需要google的,除非你全部熟记它们!)

  • 内置图形函数

1.散点图

  1. ggplot(data = small, mapping = aes(x =carat, y = price, shape=cut, colour=color))+geom_point()`

或者是

  1. ggplot(small) +geom_point(aes(x=carat, y=price, shape=cut,colour=color))

aes里面的就是映射,根据 cut的不同选取不同形状的点,根据 color来画不同颜色的点,可以在 ggplot里面映射,也可以在几何对象里面映射


2.直方图

  1. ggplot(small)+geom_histogram(aes(x=price,fill=cut), position="fill")

直方图只需要一个数据,自动分组来得到X,Y轴变量,直方图把连续型的数据按照一个个等长的分区(bin)来切分,然后计数,画柱状图


3.条形图

以上两个等价(这里缺图,我懒得上传了)

  1. ggplot()+geom_bar(aes(x=c(LETTERS[1:3]),y=1:3),stat="identity")

条形图只有自定义Y轴,然后用 stat="identity"才是真正意义上的条形图。


4.密度函数图

  1. ggplot(small)+geom_density(aes(x=price,colour=cut))

  2. ggplot(small)+geom_density(aes(x=price,fill=clarity))

密度函数图,数据和映射和直方图是一样的,唯一不同的是几何对象, geom_histogram告诉 ggplot要画直方图,而 geom_density则说我们要画密度函数图,也是同样的把连续型的数据按照一个个等长的分区(bin)来切分,然后计数,画曲线。


5.箱式图

  1. ggplot(small)+geom_boxplot(aes(x=cut,y=price,fill=color))

总共有5种 cut,每个 cut下面都有7种 color,所以会形成35个箱子!

上传图片太麻烦了,大过年的我就不浪费时间了。上面的代码大家拿到R里面直接复制粘贴就可以直接运行出图的!

如果ggplot2只是有这39个内置图形函数那就太没意思了,每个映射都是可以细化调整的,包括X,Y轴,颜色,大小等具体的熟悉,只是需要时间来熟练使用!


  • 统计变换(Statistics)

  1. ggplot(small, aes(x=carat,y=price))+geom_point()+scale_y_log10()+stat_smooth()

这里, aes所提供的参数,就通过 ggplot提供,而不是提供给 geom_point,因为 ggplot里的参数,相当于全局变量, geom_point()和 stat_smooth()都知道x,y的映射,如果只提供给 geom_point(),则相当于是局部变量, geom_point知道这种映射,而 stat_smooth不知道,当然你再给 stat_smooth也提供x,y的映射,不过共用的映射,还是提供给 ggplot好。

统计变换是非常重要的功能,我们可以自己写函数,基于原始数据做某种计算,并在图上表现出来,也可以通过它改变geom_xxx函数画图的默认统计参数。


  • 坐标系统(Coordinante)

坐标系统控制坐标轴,可以进行变换,例如XY轴翻转,笛卡尔坐标和极坐标转换,以满足我们的各种需求。

坐标轴翻转由 coord_flip()实现

  1. ggplot(small)+geom_bar(aes(x=cut,fill=cut))+coord_flip()

转换成极坐标可以由 coord_polar()实现:

  1. ggplot(small)+geom_bar(aes(x=factor(1),fill=cut))+coord_polar(theta="y")

  2. ggplot(small)+geom_bar(aes(x=factor(1),fill=cut))

  3. ggplot(small)+geom_bar(aes(x=factor(1),fill=cut))+coord_polar(theta='y')

  4. #就是饼图

  5. #这个bar图是统计cut的各个因子出现的次数,来作为Y轴。


合并画多个饼图

  1. ggplot(new_a,aes(x ="",y=V3,fill=V2)) +geom_bar(width = 3, stat="identity")+coord_polar("y")+ facet_wrap(type~V1)+theme(text=element_text(face='bold'))

以及风玫瑰图(windrose)

  1. ggplot(small)+geom_bar(aes(x=clarity,fill=cut))+coord_polar()


  • 主题

ggplot2提供一些已经写好的主题,比如 theme_grey()为默认主题,我经常用的 theme_bw()为白色背景的主题,还有 theme_classic()主题,和R的基础画图函数较像。

还有二维密度图

  1. ggplot(diamonds, aes(carat, price))+stat_density2d(aes(fill = ..level..), geom="polygon")+scale_fill_continuous(high='darkred',low='darkgreen')

  2. #其中..level..是生成的变量



好了,这篇诚意之作就写到这里,再次祝大家新年快乐!

欢迎把文章分享给你身边的朋友!

如果想知道如何科学上网,也可以加群请教哦~

生信菜鸟团QQ群:201161227 (所剩名额不多,请提高手速)




文:Jimmy & 一只思考问题的熊

校对编辑:一只思考问题的熊


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

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