有位论文审稿人在自己的博客中提到:“我审稿时看稿件的顺序是题目、摘要、图表、前言、参考文献、正文。”由此可见,文章中的图片的质量是非常重要的,它在一定程度上决定了论文能否被录用。
常用的图片处理软件有R、matlab、Origin、visio、PS、AI等等。小锐主要介绍一下R,它在画图方面具有强大功能:基础绘图包括散点、柱状、气泡、箱线、热图、维恩图等等,高级绘图包括三维旋转、马赛克图、树状图、network图等等。接下来,具体介绍一下如何使用R中的ggtree扩展包绘制高质量进化树。
ggtree的简介
目前有许多软件和在线网络工具都支持系统发育树可视化,如TreeView(1996年)、FigTree(2014年)、TreeDyn(2006年)、iTOL(2011年,简易教程请戳这儿)、EvolView(2012年)、Dendroscope(2012年)。随着系统发育树研究越来越广泛,人们需要对进化树做越来越多的个性化展示。ggtree正好满足了人们的这些个性化需求,可以通过代码来添加进化树所需的内容,并控制展示形式。
ggtree是一款非常优秀的扩展包。它是ggplot2的良好衍生,能够很好地利用图层进行绘图。该扩展包由余光创开发,其目前就读于香港大学公共卫生系。我们只需要调整调整参数就能绘制高质量的图片。
► ggtree扩展包支持的数据格式
Newick
Nexus
New Hampshire eXtended format (NHX)
Jplace
Phylip
► ggtree扩展包支持一些软件输出的文件格式
BEAST
EPA
HYPHY
PAML
PHYLDOG
pplacer
r8s
RAxML
RevBayes
► ggtree扩展包数据读入使用的函数如下,可以根据你的文件格式需求选择函数。
read.beast 函数解析BEASE软件格式;
read.codeml 函数解析CODEML软件格式(rst 和 mlc 文件);
read.codeml_mlc 函数解析mlc格式;
read.hyphy 函数解析HYPHY软件输出的格式;
read.jplace 解析jplace格式以及EPA、pplacer软件输出的格式;
read.nhx 解析 NHX 格式以及PHYLODOG、RevBayes软件输出的格式;
read.paml_rst 解析rst以及 BASEML、CODEML软件输出的格式;
read.r8s 解析r8s软件输出的格式;
read.raxml 解析RAxML软件输出的格式。
绘制基础的进化树
ggtree为系统进化树的文字标注提供了以下若干方法:
geom_cladelabel 在某个进化分支端添加文字
geom_hilight 对进化分支进行高亮处理
geom_balance 对进化分支进行高亮处理
geom_range 绘制不确定进化分支长度
geom_strip 添加bar或strip
geom_treescale 添加标准进化距离的legend
geom_taxalink 添加进化分支间的连线
geom_tiplab 在进化分支末梢添加文字
geom_text 在进化分支、节点的上方添加文字
geom_label 在进化分支、节点上添加文字
facet_wrap 是基于一个因子进行设置分面图
geom_segment2 添加线段
geom_point2 添加点
geom_text2 添加文字
geom_label2 添加文字
%<% 在继承原有树的基础上更新进化树的展示
那么,超详细的操作演示来咯:
首先,导入nwk格式的数据文件。
数据的文件内容如:(((((((A:4,B:4):6,C:5):8,D:6):3,E:21):10,((F:4,G:12):14,H:8):13):13,((I:5,J:2):30,(K:11,L:11):2):17):4,M:56);
nwk <- system.file("extdata", "sample.nwk", package="ggtree")
tree <- read.tree(nwk)
然后,设置进化树的展示形式
虚线的进化树,由linetype参数控制。
ggtree(tree, color="firebrick", size=1, linetype="dotted")
2
实线的进化树,是最常见的进化树展示方式。
ggtree(tree, ladderize=FALSE)
3
进化分支末梢对齐的进化树,由branch.length参数控制。
ggtree(tree, branch.length="none")
4
倾斜的进化树 layout是设置进化树形状的主要参数,可以接受的名称有slanted:倾斜;circular:圆形;fan:扇形;unrooted:无根。
# multiplot可以同时画出多张图
multiplot(ggtree(tree, layout="slanted") + ggtitle("(Phylogram) slanted layout"),
ggtree(tree, layout="circular") + ggtitle("(Phylogram) circular layout"),
ggtree(tree, layout="fan", open.angle=180) + ggtitle("(Phylogram) circular layout"),
ggtree(tree, layout="unrooted") + ggtitle("unrooted layout"),ncol = 2)
5
有X轴的进化树,x轴可以表示时间,也可以表示进化距离。
tree2d <- read.beast(system.file("extdata", "twoD.tree", package="ggtree"))
ggtree(tree2d, mrsd = "2014-05-01") + theme_tree2()
6
有标准进化距离的进化树,使用geom_treescale方法。
ggtree(tree) + geom_treescale()
接下来,美化进化树节点、进化分支末梢。
可以通过geom_nodepoint、geom_tippoint、geom_point方法进行调整,其中geom_point是同时对节点和进化分支末梢起作用,geom_tippoint只对tip起作用,geom_nodepoint只对node起作用。
p <- ggtree(tree) + geom_nodepoint(color="#b5e521", alpha=1/4, size=10)
p + geom_tippoint(color="#FDAC4F", shape=8, size=3)
想在进化树进化分支末梢添加文字,可使用geom_tiplab方法。
p + geom_tiplab(size=3, color="purple")
若要在进化树进化分支末梢添加文字,并调整文字摆放位置,把文字放到进化分支的线段的中间,则使用下述代码。
p + geom_tiplab(aes(x=branch), size=3, color="purple", vjust=-0.3)
通过%<%操作符继承之前的模板,非常简单方便实用。
p %<% rtree(50)
使用facet_wrap方法,实现进化树分面。
trees <- lapply(c(10, 20, 40), rtree)
class(trees) <- "multiPhylo"
ggtree(trees) + facet_wrap(~.id, scale="free") + geom_tiplab()
在节点上显示节点的数值,以及显示部分进化树。
multiplot(ggtree(tree) + geom_text2(aes(subset=!isTip, label=node), hjust=-.3)
+geom_tiplab(),viewClade(p+geom_tiplab(), node=21)+
ggtitle("下图是对21号节点的局部放大")
,ncol=1)
根据指定节点的对整个进化树进行分类,下面是指定了node=21,17。
tree <- groupClade(tree, node=c(21,17))
ggtree(tree, aes(color=group, linetype=group))+
geom_text2(aes(subset=!isTip, label=node), hjust=-.3)
根据指定的进化分支的名称进行分类,可使用groupOTU方法。
cls <- list(c1=c("A", "B", "C", "D", "E"),
c2=c("F", "G", "H"),
c3=c("L", "K", "I", "J"),
c4="M")
tree <- groupOTU(tree, cls)
library("colorspace")
ggtree(tree, aes(color=group, linetype=group)) + geom_tiplab() +
scale_color_manual(values=c("black", rainbow_hcl(4))) +
theme(legend.position="right")
最后,在进化树四周添加一些点、线、文字。
对指定节点的所有进化分支进行标注,下边的图是添加在进化树的右侧。
p <- ggtree(tree) + geom_text2(aes(subset=!isTip, label=node), hjust=-.3) +
geom_tiplab()
p+geom_cladelabel(node=22, label="test label", align=T, color='red') +
geom_cladelabel(node=19, label="another clade", align=T, color='blue')+
geom_cladelabel(node=24, label="another clade", align=T, geom='label', fill='lightblue')
进化分支间使用箭头、线段连接。
ggtree(tree) + geom_tiplab() + geom_taxalink('A', 'E') +
geom_taxalink('F', 'K', color='red', arrow=grid::arrow(length = grid::unit(0.02, "npc")))
拥有多个图例的进化树,可以按照进化分支的名称、进化分支的距离。
dd <- data.frame(taxa = LETTERS[1:13],
place = c(rep("GZ", 5), rep("HK", 3), rep("CZ", 4), NA),
value = round(abs(rnorm(13, mean=70, sd=10)), digits=1))
## you don't need to order the data
## data was reshuffled just for demonstration
dd <- dd[sample(1:13, 13), ]
row.names(dd) <- NULL
p <- ggtree(tree)
p <- p %<+% dd + geom_tiplab(aes(color=place)) +
geom_tippoint(aes(size=value, shape=place, color=place),
alpha=0.25)
p <- p + geom_text(aes(color=place, label=place),
hjust=1, vjust=-0.4, size=3) +
geom_text(aes(color=place, label=value), hjust=1, vjust=1.4, size=3)
p+theme(legend.position="right")
今天的ggtree介绍就到这儿了。在下期生信大课堂中,继续与大家分享“如何使用ggtree进行进化树的高级绘图”,敬请期待!
供稿:黄云
编辑:王丽燕