toppic
当前位置: 首页> 科幻小说小说> ggtree:个性化展示进化树的小能手

ggtree:个性化展示进化树的小能手

2017-12-16 08:08:44

有位论文审稿人在自己的博客中提到:“我审稿时看稿件的顺序是题目、摘要、图表、前言、参考文献、正文。”由此可见,文章中的图片的质量是非常重要的,它在一定程度上决定了论文能否被录用。


常用的图片处理软件有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)


然后,设置进化树的展示形式

1

虚线的进化树,由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进行进化树的高级绘图”,敬请期待!


供稿:黄云

编辑:王丽燕


友情链接