cc06d22b |
##' convert polytomy to binary tree
##'
##' as.binary method for \code{phylo} object
##' @rdname as.binary
##' @return binary tree
##' @method as.binary phylo
##' @importFrom ape is.binary.tree
##' @export
##' @author Guangchuang Yu \url{http://ygc.name}
##' @examples
##' require(ape)
##' tr <- read.tree(text="((A, B, C), D);")
##' is.binary.tree(tr)
##' tr2 <- as.binary(tr)
##' is.binary.tree(tr2)
as.binary.phylo <- function(tree, ...) {
if(is.binary.tree(tree)) {
cat("The input tree is already binary...\n")
invisible(tree)
}
polyNode <- tree$edge[,1] %>% table %>% '>'(2) %>%
which %>% names %>% as.numeric
N <- getNodeNum(tree)
ii <- 0
for (pn in polyNode) {
idx <- which(tree$edge[,1] == pn)
while(length(idx) >2) {
ii <- ii + 1
newNode <- N+ii
tree$edge[idx[-1],1] <- newNode
newEdge <- matrix(c(tree$edge[idx[1],1], newNode), ncol=2)
tree$edge <- rbind(tree$edge, newEdge)
idx <- idx[-1]
}
}
tree$Nnode <- tree$Nnode+ii
tree$edge.length <- c(tree$edge.length, rep(0, ii))
return(tree)
}
##' remove singleton
##'
##'
##' @title rm.singleton.newick
##' @param nwk newick file
##' @param outfile output newick file
##' @return tree text
##' @importFrom magrittr %<>%
##' @importFrom magrittr add
##' @importFrom ape write.tree
##' @author Guangchuang Yu \url{http://ygc.name}
rm.singleton.newick <- function(nwk, outfile = NULL) {
tree <- readLines(nwk)
## remove singleton of tips
nodePattern <- "\\w+:[\\.0-9Ee\\+\\-]+"
singletonPattern.with.nodename <- paste0(".*(\\(", nodePattern, "\\)\\w+:[\\.0-9Ee\\+\\-]+).*")
|
e1396b70 |
singletonPattern.wo.nodename <- paste0(".*(\\(", nodePattern, "\\):[\\.0-9Ee\\+\\-]+).*")
|
cc06d22b |
while(length(grep("\\([^,]+\\)", tree)) > 0) {
singleton <- gsub(singletonPattern.with.nodename, "\\1", tree)
if (singleton == tree) {
singleton <- gsub(singletonPattern.wo.nodename, "\\1", tree)
}
if (singleton == tree) {
stop("can't parse singleton node...")
}
tip <- gsub("\\((\\w+).*", "\\1", singleton)
len1 <- gsub(".*[^\\.0-9Ee\\+\\-]+([\\.0-9Ee\\+\\-]+)", "\\1", singleton)
len2 <- gsub(".*:([\\.0-9Ee\\+\\-]+)\\).*", "\\1", singleton)
len <- as.numeric(len1) + as.numeric(len2)
tree <- gsub(singleton, paste0(tip, ":", len), tree, fixed = TRUE)
}
tree <- read.tree(text=tree)
### remove singleton of internal nodes
p.singleton <- which(table(tree$edge[,1]) == 1)
if (length(p.singleton) > 0) {
p.singleton %<>% names %>% as.numeric
edge <- tree$edge
idx <- which(edge[,1] == p.singleton)
singleton <- edge[idx, 2]
sidx <- which(edge[,1] == singleton)
edge[sidx,1] <- p.singleton
edge <- edge[-idx,]
tree$edge <- edge
tree$edge.length[sidx] %<>% add(., tree$edge.length[idx])
tree$edge.length <- tree$edge.length[-idx]
}
if (!is.null(outfile)) {
write.tree(tree, file=outfile)
}
invisible(tree)
}
##' @method fortify beast
##' @export
fortify.beast <- function(model, data,
|
af18d052 |
layout = "rectangular",
yscale = "none",
ladderize = TRUE,
right = FALSE,
branch.length = "branch.length",
ndigits = NULL,
|
cc06d22b |
mrsd = NULL, ...) {
|
af18d052 |
phylo <- set_branch_length(model, branch.length)
|
e4ea056a |
df <- fortify(phylo, layout=layout, branch.length=branch.length,
|
cc06d22b |
ladderize=ladderize, right=right, mrsd = mrsd, ...)
stats <- model@stats
scn <- colnames(stats)
scn <- scn[scn != 'node']
for (cn in scn) {
if (cn %in% colnames(df)) {
colnames(stats)[colnames(stats) == cn] <- paste0(cn, "_")
msg <- paste("feature", cn, "was renamed to", paste0(cn, "_"), "due to name conflict...")
warning(msg)
}
}
idx <- which(colnames(stats) != "node")
for (ii in idx) {
if (is.character_beast(stats, ii)) {
len <- sapply(stats[,ii], length)
if (any(len > 1)) {
stats[,ii] %<>% sapply(., function(x) {
y <- unlist(x) %>% as.character %>%
gsub("\"", "", .) %>% gsub("'", "", .)
if (length(y) == 1) {
return(y)
} else {
return(paste0('{', paste0(y, collapse = ','), '}'))
}
})
} else {
stats[,ii] %<>% unlist %>% as.character %>%
gsub("\"", "", .) %>% gsub("'", "", .)
}
next
}
len <- sapply(stats[,ii], length)
if ( all(len == 1) ) {
stats[, ii] %<>% unlist %>% as.character %>% as.numeric
if (!is.null(ndigits)) {
stats[, ii] %<>% round(., ndigits)
}
} else if (all(len <= 2)) {
stats[, ii] %<>% sapply(., function(x) {
y <- unlist(x) %>% as.character %>% as.numeric
if (!is.null(ndigits)) {
y %<>% round(., ndigits)
}
if (length(y) == 1) {
return(y)
} else {
return(paste0('[', paste0(y, collapse = ','), ']'))
}
})
} else {
stats[,ii] %<>% sapply(., function(x) {
y <- unlist(x) %>% as.character %>% as.numeric
if (!is.null(ndigits)) {
y %<>% round(., ndigits)
}
if (length(y) == 1) {
return(y)
} else {
return(paste0('{', paste0(y, collapse = ','), '}'))
}
})
}
}
cn <- colnames(stats)
lo <- cn[grep("_lower", cn)]
hi <- gsub("lower$", "upper", lo)
rid <- gsub("_lower$", "", lo)
for (i in seq_along(rid)) {
stats[, rid[i]] <- paste0("[", stats[, lo[i]], ",", stats[, hi[i]], "]")
stats[is.na(stats[, lo[i]]), rid[i]] <- NA
}
idx <- match(df$node, stats$node)
stats <- stats[idx,]
cn_stats <- colnames(stats)
stats <- stats[, cn_stats != "node"]
df <- cbind(df, stats)
if (is(stats, "data.frame") == FALSE) {
colnames(df)[colnames(df) == "stats"] <- cn_stats[cn_stats != "node"]
}
df <- scaleY(phylo, df, yscale, layout, ...)
append_extraInfo(df, model)
}
##' @method fortify codeml
##' @export
fortify.codeml <- function(model, data,
layout = "rectangular",
yscale = "none",
ladderize = TRUE,
right = FALSE,
branch.length = "mlc.branch.length",
ndigits = NULL,
mrsd = NULL,
...) {
dNdS <- model@mlc@dNdS
if (branch.length == "branch.length") {
message("branch.length setting to mlc.branch.length by default...")
branch.length <- "mlc.branch.length"
}
length <- match.arg(branch.length,
c("none",
"mlc.branch.length",
"rst.branch.length",
colnames(dNdS)[-c(1,2)])
)
if (length == "rst.branch.length") {
phylo <- get.tree(model@rst)
} else {
if (length == "mlc.branch.length") {
|
af18d052 |
length <- "branch.length"
|
cc06d22b |
}
|
af18d052 |
phylo <- set_branch_length(model@mlc, length)
|
cc06d22b |
}
df <- fortify(phylo, data, layout, ladderize, right,
branch.length=length, mrsd=mrsd, ...)
res <- merge_phylo_anno.codeml_mlc(df, dNdS, ndigits)
df <- merge_phylo_anno.paml_rst(res, model@rst)
df <- scaleY(phylo, df, yscale, layout, ...)
|
af18d052 |
|
cc06d22b |
append_extraInfo(df, model)
}
##' @method fortify codeml_mlc
##' @export
fortify.codeml_mlc <- function(model, data,
layout = "rectangular",
yscale = "none",
ladderize = TRUE,
right = FALSE,
branch.length = "branch.length",
ndigits = NULL,
mrsd = NULL,
...) {
|
af18d052 |
phylo <- set_branch_length(model, branch.length)
|
cc06d22b |
|
af18d052 |
df <- fortify(phylo, data, layout, ladderize, right,
branch.length=branch.length, mrsd=mrsd, ...)
|
cc06d22b |
dNdS <- model@dNdS
df <- merge_phylo_anno.codeml_mlc(df, dNdS, ndigits)
df <- scaleY(phylo, df, yscale, layout, ...)
append_extraInfo(df, model)
}
merge_phylo_anno.codeml_mlc <- function(df, dNdS, ndigits = NULL) {
if (!is.null(ndigits)) {
idx <- which(! colnames(dNdS) %in% c("node", "parent"))
for (ii in idx) {
if (is.numeric(dNdS[, ii])) {
dNdS[, ii] <- round(dNdS[,ii], ndigits)
}
}
}
res <- merge(df, dNdS,
by.x = c("node", "parent"),
by.y = c("node", "parent"),
all.x = TRUE)
res[match(df$node, res$node),]
}
fortify.codeml_mlc_ <- function(model, data,
layout = "rectangular",
ladderize = TRUE,
right = FALSE,
branch.length = "branch.length",
...) {
}
|
af18d052 |
|
cc06d22b |
##' @method fortify paml_rst
##' @export
fortify.paml_rst <- function(model, data, layout = "rectangular", yscale="none",
ladderize=TRUE, right=FALSE, mrsd=NULL, ...) {
df <- fortify.phylo(model@phylo, data, layout, ladderize, right, mrsd=mrsd, ...)
df <- merge_phylo_anno.paml_rst(df, model)
df <- scaleY(model@phylo, df, yscale, layout, ...)
append_extraInfo(df, model)
}
merge_phylo_anno.paml_rst <- function(df, model) {
for (type in get.fields(model)) {
anno <- get.subs(model, type=type)
colnames(anno)[2] <- type
df <- df %add2% anno
}
return(df)
}
##' @method fortify phangorn
##' @export
fortify.phangorn <- fortify.paml_rst
##' @method fortify hyphy
##' @export
fortify.hyphy <- fortify.paml_rst
##' @method fortify jplace
##' @importFrom ape read.tree
##' @export
fortify.jplace <- function(model, data,
layout="rectangular", yscale="none",
ladderize=TRUE, right=FALSE, mrsd=NULL, ...) {
df <- get.treeinfo(model, layout, ladderize, right, mrsd=mrsd, ...)
place <- get.placements(model, by="best")
df <- df %add2% place
df <- scaleY(model@phylo, df, yscale, layout, ...)
append_extraInfo(df, model)
}
scaleY <- function(phylo, df, yscale, layout, ...) {
if (yscale == "none") {
return(df)
}
if (! yscale %in% colnames(df)) {
warning("yscale is not available...\n")
return(df)
}
if (is.numeric(df[, yscale])) {
y <- getYcoord_scale_numeric(phylo, df, yscale, ...)
## if (order.y) {
## y <- getYcoord_scale2(phylo, df, yscale)
## } else {
## y <- getYcoord_scale(phylo, df, yscale)
## }
} else {
y <- getYcoord_scale_category(phylo, df, yscale, ...)
}
df[, "y"] <- y
return(df)
}
##' @method fortify phylo4
##' @export
fortify.phylo4 <- function(model, data, layout="rectangular", yscale="none",
ladderize=TRUE, right=FALSE, mrsd=NULL, ...) {
phylo <- as.phylo.phylo4(model)
df <- fortify.phylo(phylo, data,
layout, ladderize, right, mrsd=mrsd, ...)
scaleY(phylo, df, yscale, layout, ...)
}
|
266b20f1 |
##' @method fortify phylo4d
##' @export
fortify.phylo4d <- function(model, data, layout="rectangular", yscale="none",
ladderize=TRUE, right=FALSE, mrsd=NULL, ...) {
res <- fortify.phylo4(model, data, layout, yscale, ladderize, right, mrsd, ...)
tdata <- model@data[match(res$node, rownames(model@data)), , drop=FALSE]
cbind(res, tdata)
}
|
cc06d22b |
as.phylo.phylo4 <- function(phylo4) {
edge <- phylo4@edge
edge <- edge[edge[,1] != 0, ]
edge.length <- phylo4@edge.length
edge.length <- edge.length[!is.na(edge.length)]
tip.id <- sort(setdiff(edge[,2], edge[,1]))
tip.label <- phylo4@label[tip.id]
phylo <- list(edge = edge,
edge.length = edge.length,
tip.label = tip.label)
node.id <- sort(unique(edge[,1]))
node.id <- node.id[node.id != 0]
node.label <- phylo4@label[node.id]
if (!all(is.na(node.label))) {
phylo$node.label <- node.label
}
phylo$Nnode <- length(node.id)
class(phylo) <- "phylo"
return(phylo)
}
##' fortify a phylo to data.frame
##'
##'
##' @rdname fortify
##' @title fortify
##' @param model phylo object
##' @param data not use here
##' @param layout layout
##' @param ladderize ladderize, logical
##' @param right logical
##' @param mrsd most recent sampling date
##' @param as.Date logical whether using Date class in time tree
##' @param ... additional parameter
##' @return data.frame
##' @importFrom ape ladderize
##' @importFrom ggplot2 fortify
##' @method fortify phylo
##' @export
##' @author Yu Guangchuang
fortify.phylo <- function(model, data, layout="rectangular",
ladderize=TRUE, right=FALSE, mrsd=NULL, as.Date=FALSE, ...) {
if (ladderize == TRUE) {
tree <- ladderize(model, right=right)
} else {
tree <- model
}
|
9cfed15f |
if (! is.null(tree$edge.length)) {
|
ded558eb |
if (anyNA(tree$edge.length)) {
|
9cfed15f |
warning("'edge.length' contains NA values...\n## setting 'edge.length' to NULL automatically when plotting the tree...")
tree$edge.length <- NULL
}
}
|
cc06d22b |
df <- as.data.frame(tree, layout=layout, ...)
idx <- is.na(df$parent)
df$parent[idx] <- df$node[idx]
rownames(df) <- df$node
cn <- colnames(df)
colnames(df)[grep("length", cn)] <- "branch.length"
if(layout == "slanted") {
df <- add_angle_slanted(df)
}
aa <- names(attributes(tree))
group <- aa[ ! aa %in% c("names", "class", "order", "reroot", "node_map")]
if (length(group) > 0) {
for (group_ in group) {
## groupOTU & groupClade
group_info <- attr(tree, group_)
if (length(group_info) == nrow(df)) {
df[, group_] <- group_info
}
}
}
if (!is.null(mrsd)) {
|
85777d7b |
df <- scaleX_by_time_from_mrsd(df, mrsd, as.Date)
|
cc06d22b |
}
return(df)
}
##' convert phylo to data.frame
##'
##'
##' @title as.data.frame
##' @param x phylo object
##' @param row.names omitted here
##' @param optional omitted here
##' @param layout layout
##' @param ... additional parameter
##' @return data.frame
##' @method as.data.frame phylo
##' @export
##' @author Yu Guangchuang
as.data.frame.phylo <- function(x, row.names, optional,
layout="rectangular", ...) {
if (layout == "unrooted") {
return(layout.unrooted(x))
}
as.data.frame.phylo_(x, layout, ...)
}
as.data.frame.phylo_ <- function(x, layout="rectangular",
branch.length="branch.length", ...) {
|
e4ea056a |
if (branch.length != 'none') {
branch.length = "branch.length"
}
|
cc06d22b |
tip.label <- x[["tip.label"]]
Ntip <- length(tip.label)
N <- getNodeNum(x)
edge <- as.data.frame(x[["edge"]])
colnames(edge) <- c("parent", "node")
|
9cfed15f |
|
cc06d22b |
if (! is.null(x$edge.length)) {
edge$length <- x$edge.length
if (branch.length == "none") {
xpos <- getXcoord_no_length(x)
ypos <- getYcoord(x)
} else {
xpos <- getXcoord(x)
ypos <- getYcoord(x)
}
## } else if (layout != "cladogram") {
## xpos <- getXcoord(x)
## ypos <- getYcoord(x)
## } else {
## ## layout == "cladogram" && branch.length != "none"
## xy <- getXYcoord_cladogram(x)
## xpos <- xy$x
## ypos <- xy$y
## }
} else {
xpos <- getXcoord_no_length(x)
ypos <- getYcoord(x)
}
xypos <- data.frame(node=1:N, x=xpos, y=ypos)
res <- merge(edge, xypos, by.x="node", by.y="node", all.y=TRUE)
label <- rep(NA, N)
label[1:Ntip] <- tip.label
if ( !is.null(x$node.label) ) {
label[(Ntip+1):N] <- x$node.label
}
res$label <- label
isTip <- rep(FALSE, N)
isTip[1:Ntip] <- TRUE
res$isTip <- isTip
## add branch mid position
res <- calculate_branch_mid(res)
|
e44561c1 |
## ## angle for all layout, if 'rectangular', user use coord_polar, can still use angle
|
bedefde1 |
res <- calculate_angle(res)
|
cc06d22b |
return(res)
}
##' @method fortify nhx
##' @export
fortify.nhx <- function(model, data, layout= "rectangular",
ladderize=TRUE, right=FALSE, mrsd=NULL, ...) {
df <- fortify(get.tree(model), layout=layout, ladderize=ladderize, right=right, mrsd=mrsd, ...)
df <- merge(df, model@nhx_tags, by.x="node", by.y="node", all.x=TRUE)
append_extraInfo(df, model)
}
##' @method fortify raxml
##' @export
fortify.raxml <- function(model, data, layout= "rectangular",
ladderize=TRUE, right=FALSE, mrsd=NULL, ...) {
df <- fortify(get.tree(model), layout=layout, ladderize=ladderize, right=right, mrsd=mrsd, ...)
df <- merge(df, model@bootstrap, by.x="node", by.y="node", all.x=TRUE)
append_extraInfo(df, model)
}
##' @method fortify apeBootstrap
##' @export
fortify.apeBootstrap <- fortify.raxml
##' @method fortify multiPhylo
##' @export
fortify.multiPhylo <- function(model, data, layout="rectangular",
ladderize=TRUE, right=FALSE, mrsd=NULL, ...) {
df.list <- lapply(model, function(x) fortify(x, layout=layout, ladderize=ladderize, right=right, mrsd=mrsd, ...))
if (is.null(names(model))) {
names(df.list) <- paste0("Tree ", "#", seq_along(model))
} else {
names(df.list) <- names(model)
}
df <- do.call("rbind", df.list)
df$.id <- rep(names(df.list), times=sapply(df.list, nrow))
df$.id <- factor(df$.id, levels=names(df.list))
|
e4ea056a |
## nNode <- sapply(df.list, nrow)
## nNode2 <- cumsum(c(0, nNode[-length(nNode)]))
## df$parent <- df$parent + rep(nNode2, times=nNode)
|
cc06d22b |
return(df)
}
|
df059d88 |
##' @method fortify phylip
##' @export
fortify.phylip <- function(model, data, layout="rectangular",
ladderize=TRUE, right=FALSE,
branch.length = "TREE", mrsd=NULL, ...) {
trees <- get.tree(model)
fortify(trees, layout=layout, ladderize = ladderize, right=right, mrsd=mrsd, ...)
}
|
cc06d22b |
##' @method fortify r8s
##' @export
fortify.r8s <- function(model, data, layout="rectangular",
ladderize=TRUE, right=FALSE,
branch.length = "TREE", mrsd=NULL, ...) {
trees <- get.tree(model)
branch.length %<>% match.arg(names(trees))
phylo <- trees[[branch.length]]
fortify(phylo, layout=layout, ladderize = ladderize, right=right, mrsd=mrsd, ...)
}
|
869c8fbc |
##' @method fortify obkData
##' @export
fortify.obkData <- function(model, data, layout="rectangular",
ladderize=TRUE, right=FALSE, mrsd = NULL, ...) {
df <- fortify(model@trees[[1]], layout=layout, ladderize=ladderize, right=right, mrsd=mrsd, ...)
meta.df <- model@dna@meta
meta.df <- data.frame(taxa=rownames(meta.df), meta.df)
loc <- model@individuals
loc <- data.frame(individualID=rownames(loc), loc)
meta_loc <- merge(meta.df, loc, by="individualID")
meta_loc <- meta_loc[,-1]
df <- merge(df, meta_loc, by.x="label", by.y="taxa", all.x=TRUE)
df <- df[order(df$node, decreasing = FALSE),]
return(df)
}
|
e4ea056a |
##' @method fortify phyloseq
##' @export
fortify.phyloseq <- function(model, data, layout="rectangular",
ladderize=TRUE, right=FALSE, mrsd=NULL, ...) {
df <- fortify(model@phy_tree, layout=layout, ladderize=ladderize, right=right, mrsd=mrsd, ...)
phyloseq <- "phyloseq"
require(phyloseq, character.only=TRUE)
psmelt <- eval(parse(text="psmelt"))
dd <- psmelt(model)
if ('Abundance' %in% colnames(dd)) {
dd <- dd[dd$Abundance > 0, ]
}
data <- merge(df, dd, by.x="label", by.y="OTU", all.x=TRUE)
spacing <- 0.02
idx <- with(data, sapply(table(node)[unique(node)], function(i) 1:i)) %>% unlist
data$hjust <- spacing * idx * max(data$x)
## data$hjust <- data$x + hjust
data[order(data$node, decreasing = FALSE), ]
}
|
869c8fbc |
## fortify.cophylo <- function(model, data, layout="rectangular",
## ladderize=TRUE, right=FALSE, mrsd = NULL, ...) {
## trees <- model$trees
## df.list <- lapply(trees, function(x) fortify(x, layout=layout, ladderize=ladderize, right=right, mrsd=mrsd, ...))
## df1 <- df.list[[1]]
## df2 <- df.list[[2]]
## df2$x <- max(df2$x) + df2$x * -1 + max(df1$x) * 1.1
## df2$parent <- df2$parent+nrow(df1)
## df <- rbind(df1, df2)
## ggplot(df) + geom_tree()
## }
|
bedefde1 |
calculate_angle <- function(data) {
data$angle <- 360/(diff(range(data$y)) + 1) * data$y
return(data)
}
|