如何通过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自己搜索一遍,我给出的链接复制到浏览器用心看一遍,不要以为就只有看个手机版的就能学会我的学习方法)
比如画X,Y变量(测序深度和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 & 一只思考问题的熊
校对编辑:一只思考问题的熊