Monday, May 22, 2017

arc.cladelabels using the names of descendant tips rather than the node numbers

Today a phytools blog reader commented:

“Liam, these clade labels are fantastic! But, I wonder if there is a possible way to determine clades by the tips (instead of by the nodes), since some clades could have just one branch.”

The answer is 'kind of.' That is, we can't give the function an argument that consists of the tip labels of our clade; however, we could specify the node using the descendant tips using a call to the function findMRCA.

For example:

library(phytools)
tree
## 
## Phylogenetic tree with 64 tips and 63 internal nodes.
## 
## Tip labels:
##  t63, t64, t47, t48, t43, t44, ...
## 
## Rooted; includes branch lengths.
plotTree(tree,type="fan",fsize=0.8,xlim=c(-4.1,4.1))

plot of chunk unnamed-chunk-1

If we want to label the clade containing t63, t64, t47, t48, t43, and t44 as clade A, then we can do it as follows:

plotTree(tree,type="fan",fsize=0.8,xlim=c(-4.1,4.1))
arc.cladelabels(text="clade A",node=findMRCA(tree,
    c("t63","t64","t47","t48","t43","t44")),ln.offset=1.1,
    lab.offset=1.16)

plot of chunk unnamed-chunk-2

We need not list all the taxa in the clade we want to label. For instance, if we want to label the clade containing taxa t46, t45, through t19, we only need list a set of tips for whom the MRCA is also the ancestor of the clade. For example:

plotTree(tree,type="fan",fsize=0.8,xlim=c(-4.1,4.1))
arc.cladelabels(text="clade B",node=findMRCA(tree,c("t46","t19")),
    ln.offset=1.1,lab.offset=1.16)
## and our previous label:
arc.cladelabels(text="clade A",node=findMRCA(tree,
    c("t63","t64","t47","t48","t43","t44")),ln.offset=1.1,
    lab.offset=1.16)

plot of chunk unnamed-chunk-3

Finally, if we want to label just one tip - well, we can just specify the node number of that tip. For instance to label the clade of tip t8 we can do:

plotTree(tree,type="fan",fsize=0.8,xlim=c(-4.1,4.1))
arc.cladelabels(text="clade C",node=which(tree$tip.label=="t8"),
    orientation="horizontal",ln.offset=1.1,lab.offset=1.12)
## with our other labels:
arc.cladelabels(text="clade A",node=findMRCA(tree,
    c("t63","t64","t47","t48","t43","t44")),ln.offset=1.1,
    lab.offset=1.16)
arc.cladelabels(text="clade B",node=findMRCA(tree,c("t46","t19")),
    ln.offset=1.1,lab.offset=1.16)

plot of chunk unnamed-chunk-4

Finally, those little red dots are just designed to keep track of the clade we are labeling. We can turn that off of course:

plotTree(tree,type="fan",fsize=0.8,xlim=c(-4.1,4.1),ftype="i")
arc.cladelabels(text="clade A",node=findMRCA(tree,
    c("t63","t64","t47","t48","t43","t44")),ln.offset=1.1,
    lab.offset=1.16,mark.node=FALSE)
arc.cladelabels(text="clade B",node=findMRCA(tree,c("t46","t19")),
    ln.offset=1.1,lab.offset=1.16,mark.node=FALSE)
arc.cladelabels(text="clade C",node=which(tree$tip.label=="t8"),
    orientation="horizontal",ln.offset=1.1,lab.offset=1.12,
    mark.node=FALSE)

plot of chunk unnamed-chunk-5

That's it.

2 comments:

  1. Hi Liam,

    `arc.cladelabels` is a great function, have you test it's stability when the phylogenetic tree scaled up? Different errors occurred with the same code different OSs.
    I have reported a issue [here](https://github.com/liamrevell/phytools/issues/79).

    Thanks!
    Miao

    ReplyDelete
  2. Hi,

    How can I change the width of the line?

    ReplyDelete

Note: due to the very large amount of spam, all comments are now automatically submitted for moderation.