The colleague question that inspired my recent poston interactively adding node labels to a tree was actually must simpler & is as follows:
“A student of mine has a 250 taxon tree that we want to number the nodes for on the figure, starting with "1” (preferably the root, but we can work with most any logical system) through 249. Is there an easy way in phytools?“
This is indeed pretty straightforward. I'm going to work with a small tree of 50 taxa - just to not overwhelm the size of plot window I can create on my blog - but the principle is identical.
First of all - we can easily do it with ape::nodelabels
.
library(ape)
tree
##
## Phylogenetic tree with 50 tips and 49 internal nodes.
##
## Tip labels:
## t8, t9, t7, t3, t17, t27, ...
##
## Rooted; includes branch lengths.
plot(tree,no.margin=TRUE,edge.width=2,cex=0.7)
nodelabels(text=1:tree$Nnode,node=1:tree$Nnode+Ntip(tree))
There are many different options with nodelabels
. For instance, we can plot our tree in "fan"
style, and our node labels within circles:
plot(tree,no.margin=TRUE,edge.width=2,type="fan",cex=0.9)
nodelabels(text=1:tree$Nnode,node=1:tree$Nnode+Ntip(tree),frame="circle")
We don't need to use frames around our labels. We can instead offset them from the plotted edges:
plot(tree,no.margin=TRUE,edge.width=2,cex=0.7)
nodelabels(text=1:tree$Nnode,node=1:tree$Nnode+Ntip(tree),
frame="none",adj=c(1.1,-0.4))
Equally well, we could employ the new function that I have just added to the phytools package. For instance:
library(phytools)
packageVersion("phytools")
## [1] '0.5.77'
plotTree(tree,type="fan",fsize=0.9,ftype="i")
labelnodes(text=1:tree$Nnode,node=1:tree$Nnode+Ntip(tree),
interactive=FALSE,circle.exp=0.9,cex=0.8)
I like that.