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


扫码、联系客服老师报名,领取资料、上手分析
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);")
foo <- function() {col <- "green"for (i in1:2)axis(i, col = col, col.ticks = col, col.axis = col, las = 1)box(lty = "19")}
# 画布分区layout(matrix(1:4, 2, 2, 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。选项type指定了树状图的形状:可能有5个值,”phylogram/谱系图”、”cladogram/分枝图”、”unrooted/无根树”、”fan/扇形”、”radial/放射状“(最后一个在本文档中未考虑)。类型(“phylogram”, “cladogram”, “fan”)是有根树的有效表示,而第4种类型应被选择应用于无根树。节点坐标还取决于树是否有分枝长度,以及选项node.pos和node.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:12, 6, 2))par(mar = c(2, 2, 0.3, 0))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:4, 2, 2))par(las = 1)plot(tr, "u"); foo()plot(tr, "u", FALSE); foo()plot(tr, "f"); foo()plot(tr, "f", FALSE); foo()

1. 求出设备/Device的宽度 (英寸)(见7.2节)。2. 查找所有标签的宽度(英寸):如果其中至少有一个标签比设备宽,则将设备的2/3分配给分枝,1/3分配给尖端/tip标签。(这样可以确保在有很长尖端标签的情况下,默认情况下树是可见的)3. 否则,分配给尖端标签的空间会逐渐增加,直到所有标签在设备上都可见。
y轴上的上限更容易确定,因为它只取决于树中分枝的数量。两个轴的上限可以通过选项x.lim和y.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中使用。
夜雨聆风