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

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

没有什么菜鸟级别的生物信息学数据处理是不能通过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自己搜索一遍,我给出的链接复制到浏览器用心看一遍,不要以为就只有看个手机版的就能学会我的学习方法)http://mp.weixin.qq.com/s?__biz=MzAxMDkxODM1Ng==&mid=2247483932&idx=1&sn=e3797fb546bc699f0d149c34edb2677e&chksm=9b4842a7ac3fcbb1c3f2c6ebf2829e2d3e73b2aa19f70d98350c0d4ed724036d60c8f6c9c887&scene=21#wechat_redirect

比如画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.散点图

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

或者是

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

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

2.直方图

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

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

3.条形图

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

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

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

4.密度函数图

ggplot(small)+geom_density(aes(x=price,colour=cut))ggplot(small)+geom_density(aes(x=price,fill=clarity))

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

5.箱式图

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

总共有5种 cut,每个 cut下面都有7种 color,所以会形成35个箱子! 上传图片太麻烦了,大过年的我就不浪费时间了。上面的代码大家拿到R里面直接复制粘贴就可以直接运行出图的!

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

  • 统计变换(Statistics)
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()实现

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

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

ggplot(small)+geom_bar(aes(x=factor(1),fill=cut))+coord_polar(theta="y")ggplot(small)+geom_bar(aes(x=factor(1),fill=cut))ggplot(small)+geom_bar(aes(x=factor(1),fill=cut))+coord_polar(theta='y')#就是饼图#这个bar图是统计cut的各个因子出现的次数,来作为Y轴。

合并画多个饼图

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)

ggplot(small)+geom_bar(aes(x=clarity,fill=cut))+coord_polar()
  • 主题

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

还有二维密度图

ggplot(diamonds, aes(carat, price))+stat_density2d(aes(fill = ..level..), geom="polygon")+scale_fill_continuous(high='darkred',low='darkgreen')#其中..level..是生成的变量
好了,这篇诚意之作就写到这里,再次祝大家新年快乐!

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

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

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

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

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

原文发布于微信公众号 - 生信技能树(biotrainee)

原文发表时间:2017-01-29

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏数据小魔方

空间数据可视化与simple future模型应用

这是一篇关于关于空间地理信息数据可视化与simple feature 模型应用的笔记小结。

923
来自专栏大数据挖掘DT机器学习

R语言绘制中国地图,并展示流行病学数据

本文作者:姜晓东,博士毕业于上海交通大学,目前任教于湖南师范大学医学院,专业神经毒理学。 流行病学的数据讲究“三间分布”,即人群分布、时间分布和空间分布。其中...

6426
来自专栏量化投资与机器学习

【干货分享】Python数据结构与算法设计总结篇

1.Python数据结构篇 数据结构篇主要是阅读[Problem Solving with Python](http://interactivepython.o...

2515
来自专栏数据小魔方

图表案例——网易数独经典图表仿作

大家平时看新闻的时候是不是都喜欢看那种多图少字、图文并茂的呀,冗长的文字看着烦死了,还累眼睛(躺枪的举手我看看~_~) 哈哈其实这很正常,白天累死累活干一天,看...

3464
来自专栏大数据文摘

人类对随机数的探索:如何才能生成一个均匀的随机数列

1637
来自专栏Vamei实验室

绘图: matplotlib Basemap简介

在数据可视化过程中,我们常常需要将数据根据其采集的地理位置在地图上显示出来。比如说我们会想要在地图上画出城市,飞机的航线,乃至于军事基地等等。通常来说,一个地理...

3755
来自专栏生信技能树

为什么要学习编程?

帮同学处理一下他从公司拿到的差异分析结果,当然,给我的是Excel表格,老规矩,导出csv然后读入R,然后准备顺手画个火山图,做个GO/KEGG富集分析。下意识...

3338
来自专栏编程

R 语言绘制热图的 10 种方法

说在前面 此前我们已经推送了不少深入解读的文章,今天希望做一点新的尝试——介绍 R 语言绘图。这一期分享 R 语言绘制热图的案例,希望大家通过案例感受 R 语言...

2.1K38
来自专栏Python中文社区

使用MPI for Python 并行化遗传算法

專 欄 ❈PytLab,Python 中文社区专栏作者。主要从事科学计算与高性能计算领域的应用,主要语言为Python,C,C++。熟悉数值算法(最优化方法,...

2056
来自专栏WindCoder

iOS ARKit教程:赤手在空中绘画

这次推荐的是ios上的文章,无奈ios上的东西没接触过,权且当做开拓视野了。老规矩,原文如下:

511

扫码关注云+社区