将树状图与R中的二部图结合起来(缠结图)

时间:2018-10-15 19:12:31

标签: r dendrogram vegan bipartite phylogeny

我目前正在创建一个缠结图,其中被饲养的物种在一侧,而被饲养的基质在另一侧。但是,我需要输出也要是一个缠结图,让图表的每一边都作为树状图的提示。我目前拥有Newick格式的物种和底物的系统发育史。

我成功地使用了'ape'包和plot.phylo()函数来生成2个系统发育树。然后,我使用了this post中的以下代码来导出提示的顺序:

tree <- ladderize(tree, right = FALSE)
is_tip <- tree$edge[,2] <= length(tree$tip.label)
ordered_tips <- tree$edge[is_tip, 2]
x<-tree$tip.label[ordered_tips]
write.csv(x,file="test.csv",sep ="\t")

然后,我使用提示的顺序来生成要在'bipartite'软件包中使用的矩阵。

但是,当然,二部图上的间距与登革图上的间距不匹配,因此我不能在外部图像处理程序中将它们彼此相邻地复制/粘贴。我想知道是否有一种方法可以生成将树状图和二部图结合起来以在rstudio中生成缠结图的图表?

这是我希望做的一个简单的可视示例:

我正在寻找合并2个这样的系统发育树

tree1<-read.tree(text="((C,B),A);")
plot(tree1)

输出:tree1

tree2<-read.tree(text="((G,F),(E,D));")
plot(tree2)

输出:tree2

具有二部图

web = matrix(
c(0, 5, 0, 10, 10, 0, 0, 3, 0, 0, 0, 1),
nrow=4,
ncol=3,
byrow = TRUE,
dimnames = list(c("D","E","F","G"),c("A","B","C"))) 
plotweb(web,method="normal",empty="false",text.rot="90")

输出:bipartite plot

相反,要生成看起来像这样的图(我只是在图像编辑器中执行了以下操作,所以我实际上使用的扩展数据集要大得多)

所需的输出:tanglegram

2 个答案:

答案 0 :(得分:2)

一种用尖端标记不匹配的树绘制缠结图的方法是使用关联矩阵-列出相应树中相应分类单元的矩阵。使用提供的数据,以下代码将从列和行中提取名称以及各自的权重。

 assoc = data.frame()
 temp = matrix(NA, ncol = 3, nrow = ncol(web))

 for(i in 1:nrow(web)){
     for(j in 1:ncol(web)){
         temp[j,] = c(rownames(web)[i], colnames(web)[j], web[i,j])
     }
     assoc = rbind(assoc, temp)
 }
head(assoc)
  V1 V2 V3
 1  D  A  0
 2  D  B  5
 3  D  C  0
 4  E  A 10
 5  E  B 10

最后一列可用于设置分类单元之间连接线的权重。

library(ape)
cophyloplot(tree2, tree1, assoc[,1:2], lwd = as.numeric(as.character(assoc[,3])), space = 15)

enter image description here

答案 1 :(得分:0)

您可以使用phytools软件包中的函数cophylo

require(phytools)
## Your two trees
tree1 <- ape::rcoal(10)
tree2 <- ape::rcoal(10)

如果两个树都具有匹配的提示标签,则可以将它们传递到cophylo中的phytools函数以创建"cophylo"对象:

## Creating the tanglegram
tanglegram <- phytools::cophylo(tree1, tree2)
# Rotating nodes to optimize matching...
# Done.

并使用S3 "cophylo"方法进行绘图:

## Plotting the tanglegram
plot(tanglegram)

看看这个出色的blog post,其中包含有关如何使用这些"cophylo"对象的更多详细信息。