]> git.donarmstrong.com Git - ape.git/blob - R/plotPhyloCoor.R
new image.DNAbin()
[ape.git] / R / plotPhyloCoor.R
1 ## plotPhyloCoor.R (2008-04-30)
2
3 ##   Coordinates of a Tree Plot
4
5 ## Copyright 2008 Damien de Vienne
6
7 ## This file is part of the R-package `ape'.
8 ## See the file ../COPYING for licensing issues.
9
10 plotPhyloCoor <-
11     function (x, type = "phylogram", use.edge.length = TRUE, node.pos = NULL,
12               direction = "rightwards", ...)
13 {
14     Ntip <- length(x$tip.label)
15     if (Ntip == 1)
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().")
20     Nnode <- x$Nnode
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")
24     if (phyloORclado) {
25         if (!is.null(attr(x, "order")))
26             if (attr(x, "order") == "pruningwise")
27                 x <- reorder(x)
28         yy <- numeric(Ntip + Nnode)
29         TIPS <- x$edge[x$edge[, 2] <= Ntip, 2]
30         yy[TIPS] <- 1:Ntip
31
32     }
33
34     xe <- x$edge
35     x <- reorder(x, order = "pruningwise")
36     ereorder <- match(x$edge[, 2], xe[, 2])
37
38     if (phyloORclado) {
39         if (is.null(node.pos)) {
40             node.pos <- 1
41             if (type == "cladogram" && !use.edge.length)
42                 node.pos <- 2
43         }
44         if (node.pos == 1)
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,
48                 PACKAGE = "ape")[[6]]
49         else {
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")
54             xx <- ans[[6]] - 1
55             yy <- ans[[7]]
56         }
57         if (!use.edge.length) {
58             if (node.pos != 2)
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
63             xx <- max(xx) - xx
64         }
65         else {
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]]
70         }
71     }
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)
76     ##    theta[TIPS] <- xx
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]]
86     ##    }
87     ##    else {
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]]
92     ##        r <- 1/r
93     ##    }
94     ##    xx <- r * cos(theta)
95     ##    yy <- r * sin(theta)
96     ##}
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])
103     ##}
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]]
109     ##    X[X == 1] <- 0
110     ##    X <- 1 - X/Ntip
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]]
115     ##    xx <- X * cos(Y)
116     ##    yy <- X * sin(Y)
117     ##}
118     if (phyloORclado && direction != "rightwards") {
119         if (direction == "leftwards") {
120             xx <- -xx
121             xx <- xx - min(xx)
122         }
123         if (!horizontal) {
124             tmp <- yy
125             yy <- xx
126             xx <- tmp - min(tmp) + 1
127             if (direction == "downwards") {
128                 yy <- -yy
129                 yy <- yy - min(yy)
130             }
131         }
132     }
133     cbind(xx, yy)
134 }