- if (!inherits(phy, "phylo")) stop('object "phy" is not of class "phylo"')
- if (!is.binary.tree(phy)) phy <- multi2di(phy)
- time <- sort(branching.times(phy), decreasing = TRUE)
- N <- 1:(length(time) + 1)
- plot.default(-c(time, 0), N, xlab = xlab, ylab = ylab,
- xaxs = "r", yaxs = "r", type = "S", ...)
+ if (is.ultrametric(phy, tol)) {
+ if (is.binary.tree(phy)) {
+ N <- numeric(phy$Nnode + 1)
+ N[] <- 1
+ } else {
+ node.order <- tabulate(phy$edge[, 1])
+ N <- node.order[-(1:length(phy$tip.label))] - 1
+ }
+ bt <- branching.times(phy)
+ names(bt) <- NULL
+ o <- order(bt, decreasing = TRUE)
+ time <- c(-bt[o], 0)
+ if (!is.binary.tree(phy)) N <- c(1, N[o])
+ } else {
+ if (!is.binary.tree(phy)) phy <- multi2di(phy)
+ n <- Ntip(phy)
+ m <- phy$Nnode
+ ROOT <- n + 1L
+ event <- time.event <- numeric(n + m)
+
+ time.event[ROOT] <- 0
+ phy <- reorder(phy)
+
+ for (i in 1:nrow(phy$edge))
+ time.event[phy$edge[i, 2]] <- time.event[phy$edge[i, 1]] + phy$edge.length[i]
+
+ present <- max(time.event)
+ event[1:n] <- -1
+ event[ROOT:(n + m)] <- 1
+
+ ## delete the events that are too close to present:
+ past.event <- present - time.event > tol
+ event <- event[past.event]
+ time.event <- time.event[past.event]
+
+ ## reorder wrt time:
+ o <- order(time.event)
+ time.event <- time.event[o]
+ event <- event[o]
+
+ time <- c(time.event - present, 0)
+ N <- c(1, event)
+ }
+ N <- cumsum(N)
+ if (!is.null(phy$root.edge)) {
+ time <- c(time[1] - phy$root.edge, time)
+ N <- c(1, N)
+ }
+ if (!backward) time <- time - time[1]
+ cbind(time, N)