乐于分享
好东西不私藏

R包神器 | ape (五) 基本和高级功能

R包神器 | ape (五) 基本和高级功能

在R中绘制系统发育树:ape包的基本和高级功能
1 简介
自ape的第1个版本(v0.1,2002年8月发布)以来,图形功能就一直存在。多年来,这些工具已经得到了改进,变得非常精致,尽管想要有效地用起来仍显得复杂。
本文档概述了这些功能。第2节(Section)解释了ape中图形背后的基本概念和工具用ape制作的图形,通常从调用(Calling)第3节中详细介绍的函数plot.phylo开始。第4节中介绍的函数可进行进一步的图形注释第5节显示了ape中可用的一些专门函数,最后,第6节和第7节概述了一些有助于制作复杂图形的设想。
Emmanuel Paradis January 3, 2022
x:/Program Files/R/R-x.x.x/library/ape/doc/DrawingPhylogenies

扫码、联系客服老师报名,领取资料、上手分析

2 基本概念

R包ape图形工具的核心是针对类(Class)phylo”的绘图方法,即函数plot.phylo。该函数在本篇第3节中做了详细探讨,但首先我们需要查看它及本文中提到的其它函数背后的基本思想。

2.1 图形模型

ape中的图形函数使用graphics包。总的来说,这个包的惯例被非常严格地遵守 (书籍:R Graphics.P. Murrell. 2006),因此熟悉R中图形的用户,在使用ape绘制系统发育进化树图形时,预计会相对容易地找到自己的方法。

ape有几个函数在绘制进化树之前会执行科学计算,因此它们可用于与其它图形引擎(如grid包)实现相同的图形功能。这些功能将在下一节中详细介绍。简单地说,我们用3个属的灵长类动物建造了一棵小型的进化树,在本文档的几个例子中使用:

library(ape)mytr <- read.tree(text = "((Pan:5,Homo:5):2,Gorilla:7);")
Newick格式,含枝长(整数)?
构建1个简单的函数,用点显示绘图周围的边框,并用绿色显示x轴和y轴:
foo <- function() {    col <- "green"for (i in1:2)        axis(i, col = col, col.ticks = col, col.axis = col, las = 1)    box(lty = "19")}
axis()和box()均为graphics包的函数
然后,用4种不同的方式绘制进化树(有关选项的解释,见后文),并为每种方式调用前面的小函数:
# 画布分区layout(matrix(1:422, byrow = TRUE))plot(mytr); foo() # 默认"p" - phylogram/谱系图plot(mytr, "c"FALSE); foo() # cladogram/分支图plot(mytr, "u"); foo() # unrooted/无根树par(xpd = TRUE)plot(mytr, "f"); foo() # fan/扇形box("outer"# 画布四周赋黑框

最后一个命令 (box(“outer”)使图形的最外部的框可见,更清楚地显示了每棵树周围的边缘(Margins)(后文第6节对此进行了详细说明)

我们还注意到命令par(xpd = TRUE) (默认情况下,此参数为FALSE),以便剪切(剪裁)绘图区域外(即,在页边空白或其它区域)的图形元素(点、线、文本…)(即上图右下角文字超出虚线的部分。par(xpd = TRUE) 在本文档的几个示例中使用,主要是因为这里绘制的树的尺寸较小。但在实践中很少需要)。这些小图说明了用ape绘制树的方式。这可以用以下(伪/pseudo-)算法来概括:

步骤1~7
有很多方法可以控制这些步骤。以下给出了这些步骤的主要变化。

步骤1选项type指定了树状图的形状:可能有5个值,”phylogram/谱系图”、”cladogram/分枝图”、”unrooted/无根树”、”fan/扇形”、”radial/放射状“(最后一个在本文档中未考虑)。类型(“phylogram”, “cladogram”, “fan”)是有根树的有效表示,而第4种类型应被选择应用于无根树。节点坐标还取决于树是否有分枝长度,以及选项node.posnode.depth

下面使用一个有8个尖端/tips且所有分枝长度等于1的树,来说明这一点(如果树只有3个尖端,则这些选项几乎没有影响):

tr <- compute.brlen(stree(8"l"), 0.1# 计算枝长tr$tip.label[] <- ""foo <- function() {    col <- "green"    axis(1, col = col, col.ticks = col, col.axis = col)    axis(2, col = col, col.ticks = col, col.axis = col, at = 1:Ntip(tr), las = 1)    box(lty = "19")}# 使用选项type = "phylogram" (图的第1列)或type = "cladogram"(第2列)和不同的选项绘制这棵树:layout(matrix(1:1262))par(mar = c(220.30))for (type in c("p""c")) {   plot(tr, type); foo()   plot(tr, type, node.pos = 2); foo()   plot(tr, type, FALSE); foo()   plot(tr, type, FALSE, node.pos = 1, node.depth = 2); foo()   plot(tr, type, FALSE, node.pos = 2); foo()   plot(tr, type, FALSE, node.pos = 2, node.depth = 2); foo()}

选项的某些组合,可能会导致最后2行树所示的相同的树形

对于无根树和环形/Circular树,只有选项use.edge.length对轴(Axes)的布局、比例有影响:

foo <- function(){    col <- "green"for (i in 1:2) axis(i, col = col, col.ticks = col, col.axis = col, las = 1)    box(lty = "19")}layout(matrix(1:422))par(las = 1)plot(tr, "u"); foo()plot(tr, "u"FALSE); foo()plot(tr, "f"); foo()plot(tr, "f"FALSE); foo()

步骤2。在graphics包中,文本以固定大小打印,这意味着无论在小型还是大型设备上绘制小树还是大树,标签都将具有相同的大小。然而,在设备上绘制任何内容之前,很难找到该尺寸(英寸)用于节点坐标的用户坐标之间的对应关系。因此,执行以下步骤来确定x轴上的上限

1. 求出设备/Device的宽度 (英寸)(见7.2节)。2. 查找所有标签的宽度(英寸):如果其中至少有一个标签比设备宽,则将设备的2/3分配给分枝,1/3分配给尖端/tip标签。(这样可以确保在有很长尖端标签的情况下,默认情况下树是可见的)3. 否则,分配给尖端标签的空间会逐渐增加,直到所有标签在设备上都可见。

y轴上的上限更容易确定,因为它只取决于树中分枝的数量。两个轴的上限可以通过选项x.limy.lim手动更改,这2个选项取1个或2个值:如果只给定1个值,则将分别设置最右边或最上面的限制;如果给定2个值,则将在相应的轴上都设置上限。这2个选项不同于它们的标准对应项xlim和ylim,此二者总是需要2个值。

默认情况下,尖端标签和末端分枝的尖端之间没有空间;但是,文本字符串周围会有一个边界框,以确保实际上有一个小空间(此外,默认字体是斜体,使这个空间更可见)。选项label.offset(默认为0)可以在它们之间添加显式/Explicit 空间(必须在用户坐标中)。

步骤3。对于有根树,使用direction选项仅支持90°旋转。为了完全控制树的旋转,可使用LATEX中的选项rotate对于无根树(type=“u”)和环形(type=”fan“)树,使用rotate.tree选项支持完全旋转如果使用这些选项,则不会旋转尖端标签。标签旋转由其它项控制:srt4用于所有树,lab4ut用于无根树。

步骤4。可通过选项x.lim和y.lim完全控制。注意选项xlim和ylim不能从plot.phylo中使用。

步骤5。如果使用选项plot = FALSE,则不执行步骤6和7
本站文章均为手工撰写未经允许谢绝转载:夜雨聆风 » R包神器 | ape (五) 基本和高级功能

猜你喜欢

  • 暂无文章