I just wrote a new utility function, ladderize.simmap
, that
can be used to “ladderize” a phylogenetic tree with a mapped discrete
character. This function is analogous to the function ladderize
in the ape package - in fact, it uses ladderize
internally.
All ladderization does is rotate internal nodes to achieve an effect whereby right (or left) daughter clades tend to be more species rich than left daughter clades. Since node rotation is arbitrary, this can be done without any change in the phylogenetic information contained by the tree. The visual effect of ladderization will be strongest when the tree is highly imbalanced.
So, for instance, here is a ladderization of a simple pure-birth tree:
library(phytools)
packageVersion("phytools")
## [1] '0.4.33'
set.seed(890)
tree<-pbtree(n=200,scale=1)
plotTree(tree,ftype="off")
plotTree(ladderize(tree),ftype="off")
Now, using a new version of
phytools (phytools_0.4-33) let's try ladderizing an object with a mapped
discrete character. In this case, we'll just create it using
sim.history
to simulate a discrete character history on the tree:
Q<-matrix(c(-2,1,1,1,-2,1,1,1,-2),3,3)
rownames(Q)<-colnames(Q)<-letters[1:3]
mtree<-sim.history(tree,Q)
plotSimmap(mtree,ftype="off")
## no colors provided. using the following legend:
## a b c
## "black" "red" "green3"
plotSimmap(ladderize.simmap(mtree),ftype="off")
## no colors provided. using the following legend:
## a b c
## "black" "red" "green3"
Something else that's kind of cool is that we can also use the same method
to ladderize objects of class "densityMap"
and
"contMap"
since the tree is stored in the same way internally.
So, for instance:
set.seed(1)
x<-fastBM(tree)
obj<-contMap(tree,x,plot=FALSE)
plot(obj,ftype="off",lwd=3,outline=FALSE)
obj$tree<-ladderize.simmap(obj$tree)
plot(obj,ftype="off",lwd=3,outline=FALSE)
This could be especially handy if our tree was crowding the color legend in the bottom left corner. (Of course, we can also move that, but this is easier).
That's it!
Hi Liam, I've been trying to plot a ladderize mapped tree, that was created from a tree and trait vectors with make.simmap, instead of sim.history. But I get this error :
ReplyDeleteError in tree$maps[[jj[i]]] : invalid subscript type 'list'
Thanks, Martha Serrano
Hi Martha. I cannot reproduce that error with simulation (i.e., simulated sim.history & make.simmap trees both ladderize fine on my system). Can you save & email me your R workspace with the data that produce the error? Then I will try and let you know what I find. My email is liam.revell@umb.edu. - Liam
DeleteThis comment has been removed by the author.
ReplyDelete