1 ## plotPhyloCoor.R (2013-03-30)
3 ## Coordinates of a Tree Plot
5 ## Copyright 2008 Damien de Vienne, 2013 Klaus Schliep
7 ## This file is part of the R-package `ape'.
8 ## See the file ../COPYING for licensing issues.
11 function (x, type = "phylogram", use.edge.length = TRUE, node.pos = NULL,
12 direction = "rightwards", tip.order = NULL, ...)
14 Ntip <- length(x$tip.label)
16 stop("found only one tip in the tree!")
17 Nedge <- dim(x$edge)[1]
18 if (any(tabulate(x$edge[, 1]) == 1))
19 stop("there are single (non-splitting) nodes in your tree; you may need to use collapse.singles().")
21 if (is.null(x$edge.length)) use.edge.length <- FALSE
22 phyloORclado <- type %in% c("phylogram", "cladogram")
23 horizontal <- direction %in% c("rightwards", "leftwards")
26 yy <- numeric(Ntip + Nnode)
27 if (!is.null(tip.order)) {
28 yy[tip.order] <- 1:length(tip.order)
31 TIPS <- x$edge[x$edge[, 2] <= Ntip, 2]
37 ## first reorder the tree in cladewise order to avoid cophyloplot() hanging:
38 ## x <- reorder(reorder(x), order = "pruningwise") ... maybe not needed anymore (EP)
39 x <- reorder(x, order = "postorder")
40 ereorder <- match(x$edge[, 2], xe[, 2])
43 if (is.null(node.pos)) {
45 if (type == "cladogram" && !use.edge.length)
49 yy <- .C("node_height", as.integer(Ntip), as.integer(Nnode),
50 as.integer(x$edge[, 1]), as.integer(x$edge[,
51 2]), as.integer(Nedge), as.double(yy), DUP = FALSE,
54 ans <- .C("node_height_clado", as.integer(Ntip),
55 as.integer(Nnode), as.integer(x$edge[, 1]), as.integer(x$edge[,
56 2]), as.integer(Nedge), double(Ntip + Nnode),
57 as.double(yy), DUP = FALSE, PACKAGE = "ape")
61 if (!use.edge.length) {
63 xx <- .C("node_depth", as.integer(Ntip), as.integer(Nnode),
64 as.integer(x$edge[, 1]), as.integer(x$edge[,
65 2]), as.integer(Nedge), double(Ntip + Nnode),
66 DUP = FALSE, PACKAGE = "ape")[[6]] - 1
70 xx <- .C("node_depth_edgelength", as.integer(Ntip),
71 as.integer(Nnode), as.integer(x$edge[, 1]), as.integer(x$edge[,
72 2]), as.integer(Nedge), as.double(x$edge.length),
73 double(Ntip + Nnode), DUP = FALSE, PACKAGE = "ape")[[7]]
76 ##if (type == "fan") {
77 ## TIPS <- xe[which(xe[, 2] <= Ntip), 2]
78 ## xx <- seq(0, 2 * pi * (1 - 1/Ntip), 2 * pi/Ntip)
79 ## theta <- double(Ntip)
81 ## theta <- c(theta, numeric(Nnode))
82 ## theta <- .C("node_height", as.integer(Ntip), as.integer(Nnode),
83 ## as.integer(x$edge[, 1]), as.integer(x$edge[, 2]),
84 ## as.integer(Nedge), theta, DUP = FALSE, PACKAGE = "ape")[[6]]
85 ## if (use.edge.length) {
86 ## r <- .C("node_depth_edgelength", as.integer(Ntip),
87 ## as.integer(Nnode), as.integer(x$edge[, 1]), as.integer(x$edge[,
88 ## 2]), as.integer(Nedge), as.double(x$edge.length),
89 ## double(Ntip + Nnode), DUP = FALSE, PACKAGE = "ape")[[7]]
92 ## r <- .C("node_depth", as.integer(Ntip), as.integer(Nnode),
93 ## as.integer(x$edge[, 1]), as.integer(x$edge[,
94 ## 2]), as.integer(Nedge), double(Ntip + Nnode),
95 ## DUP = FALSE, PACKAGE = "ape")[[6]]
98 ## xx <- r * cos(theta)
99 ## yy <- r * sin(theta)
101 ##if (type == "unrooted") {
102 ## XY <- if (use.edge.length)
103 ## unrooted.xy(Ntip, Nnode, x$edge, x$edge.length)
104 ## else unrooted.xy(Ntip, Nnode, x$edge, rep(1, Nedge))
105 ## xx <- XY$M[, 1] - min(XY$M[, 1])
106 ## yy <- XY$M[, 2] - min(XY$M[, 2])
108 ##if (type == "radial") {
109 ## X <- .C("node_depth", as.integer(Ntip), as.integer(Nnode),
110 ## as.integer(x$edge[, 1]), as.integer(x$edge[, 2]),
111 ## as.integer(Nedge), double(Ntip + Nnode), DUP = FALSE,
112 ## PACKAGE = "ape")[[6]]
115 ## yy <- c((1:Ntip) * 2 * pi/Ntip, rep(0, Nnode))
116 ## Y <- .C("node_height", as.integer(Ntip), as.integer(Nnode),
117 ## as.integer(x$edge[, 1]), as.integer(x$edge[, 2]),
118 ## as.integer(Nedge), as.double(yy), DUP = FALSE, PACKAGE = "ape")[[6]]
122 if (phyloORclado && direction != "rightwards") {
123 if (direction == "leftwards") {
130 xx <- tmp - min(tmp) + 1
131 if (direction == "downwards") {