查看原文
其他

听说你想画好几颗树在一起

Y叔叔 YuLabSMU 2023-01-03

传说中的隔壁老王

ggtree在手,天下我有

ggtree实现了多种方法让你来操作树和相关的数据,但如果你想干的是没有直接支持的呢?那也容易,因为ggtree给了你DIY的机会,对于可视化的节点在坐标轴上的位置信息,是很容易获取的,你可以用foritfy方法,它调用了tidytree::as_tibble把树对象转化为tidy data frame,再加入用于画图的坐标轴信息,另外你也可以用ggtree(tree)$data来获取相同的数据,有了这数据,就可以随便玩了。

下面是一个示例,画两颗树面对面,如同cophyloplot一般。

library(dplyr)
library(ggtree)

x <- rtree(30)
y <- rtree(30)
p1 <- ggtree(x)
p2 <- ggtree(y)

d1 <- p1$data
d2 <- p2$data

## reverse x-axis and 
## set offset to make the tree in the right hand side of the first tree
d2$x <- max(d2$x) - d2$x + max(d1$x) + 1

pp <- p1 + geom_tiplab() + geom_tree(data=d2) + geom_tiplab(data = d2, hjust=1)

dd <- bind_rows(d1, d2) %>% 
  filter(!is.na(label))

pp + geom_line(aes(x, y, group=label), data=dd, color='grey')

如果你想画好几颗树呢,比如把流感8段基因分别做树,画在一起,把相同的病毒株用线条连接起来,像问题中的图那样,这也是挺容易做到的。

z <- rtree(30)
d2 <- fortify(y)
d3 <- fortify(z)
d2$x <- d2$x + max(d1$x) + 1
d3$x <- d3$x + max(d2$x) + 1

pp <- p1 + geom_tree(data = d2) + geom_tree(data = d3)

dd = bind_rows(d1, d2, d3) %>% 
  filter(!is.na(label))

pp + geom_line(aes(x, y, group=label, color=node < 15), data=dd, alpha=.3)


往期精彩

您可能也对以下帖子感兴趣

文章有问题?点此查看未经处理的缓存