1 ## plot.phylo.coor.R (2008-04-14)
3 ## Coordinates of a Tree Plot
5 ## Copyright 2008 Damien de Vienne
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", ...)
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")
25 if (!is.null(attr(x, "order")))
26 if (attr(x, "order") == "pruningwise")
28 yy <- numeric(Ntip + Nnode)
29 TIPS <- x$edge[x$edge[, 2] <= Ntip, 2]
35 x <- reorder(x, order = "pruningwise")
36 ereorder <- match(x$edge[, 2], xe[, 2])
39 if (is.null(node.pos)) {
41 if (type == "cladogram" && !use.edge.length)
45 yy <- .C("node_height", as.integer(Ntip), as.integer(Nnode),
46 as.integer(x$edge[, 1]), as.integer(x$edge[,
47 2]), as.integer(Nedge), as.double(yy), DUP = FALSE,
50 ans <- .C("node_height_clado", as.integer(Ntip),
51 as.integer(Nnode), as.integer(x$edge[, 1]), as.integer(x$edge[,
52 2]), as.integer(Nedge), double(Ntip + Nnode),
53 as.double(yy), DUP = FALSE, PACKAGE = "ape")
57 if (!use.edge.length) {
59 xx <- .C("node_depth", as.integer(Ntip), as.integer(Nnode),
60 as.integer(x$edge[, 1]), as.integer(x$edge[,
61 2]), as.integer(Nedge), double(Ntip + Nnode),
62 DUP = FALSE, PACKAGE = "ape")[[6]] - 1
66 xx <- .C("node_depth_edgelength", as.integer(Ntip),
67 as.integer(Nnode), as.integer(x$edge[, 1]), as.integer(x$edge[,
68 2]), as.integer(Nedge), as.double(x$edge.length),
69 double(Ntip + Nnode), DUP = FALSE, PACKAGE = "ape")[[7]]
72 ##if (type == "fan") {
73 ## TIPS <- xe[which(xe[, 2] <= Ntip), 2]
74 ## xx <- seq(0, 2 * pi * (1 - 1/Ntip), 2 * pi/Ntip)
75 ## theta <- double(Ntip)
77 ## theta <- c(theta, numeric(Nnode))
78 ## theta <- .C("node_height", as.integer(Ntip), as.integer(Nnode),
79 ## as.integer(x$edge[, 1]), as.integer(x$edge[, 2]),
80 ## as.integer(Nedge), theta, DUP = FALSE, PACKAGE = "ape")[[6]]
81 ## if (use.edge.length) {
82 ## r <- .C("node_depth_edgelength", as.integer(Ntip),
83 ## as.integer(Nnode), as.integer(x$edge[, 1]), as.integer(x$edge[,
84 ## 2]), as.integer(Nedge), as.double(x$edge.length),
85 ## double(Ntip + Nnode), DUP = FALSE, PACKAGE = "ape")[[7]]
88 ## r <- .C("node_depth", as.integer(Ntip), as.integer(Nnode),
89 ## as.integer(x$edge[, 1]), as.integer(x$edge[,
90 ## 2]), as.integer(Nedge), double(Ntip + Nnode),
91 ## DUP = FALSE, PACKAGE = "ape")[[6]]
94 ## xx <- r * cos(theta)
95 ## yy <- r * sin(theta)
97 ##if (type == "unrooted") {
98 ## XY <- if (use.edge.length)
99 ## unrooted.xy(Ntip, Nnode, x$edge, x$edge.length)
100 ## else unrooted.xy(Ntip, Nnode, x$edge, rep(1, Nedge))
101 ## xx <- XY$M[, 1] - min(XY$M[, 1])
102 ## yy <- XY$M[, 2] - min(XY$M[, 2])
104 ##if (type == "radial") {
105 ## X <- .C("node_depth", as.integer(Ntip), as.integer(Nnode),
106 ## as.integer(x$edge[, 1]), as.integer(x$edge[, 2]),
107 ## as.integer(Nedge), double(Ntip + Nnode), DUP = FALSE,
108 ## PACKAGE = "ape")[[6]]
111 ## yy <- c((1:Ntip) * 2 * pi/Ntip, rep(0, Nnode))
112 ## Y <- .C("node_height", as.integer(Ntip), as.integer(Nnode),
113 ## as.integer(x$edge[, 1]), as.integer(x$edge[, 2]),
114 ## as.integer(Nedge), as.double(yy), DUP = FALSE, PACKAGE = "ape")[[6]]
118 if (phyloORclado && direction != "rightwards") {
119 if (direction == "leftwards") {
126 xx <- tmp - min(tmp) + 1
127 if (direction == "downwards") {