我目前正在创建一个缠结图,其中被饲养的物种在一侧,而被饲养的基质在另一侧。但是,我需要输出也要是一个缠结图,让图表的每一边都作为树状图的提示。我目前拥有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")
相反,要生成看起来像这样的图(我只是在图像编辑器中执行了以下操作,所以我实际上使用的扩展数据集要大得多)
所需的输出:tanglegram
答案 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)
答案 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"
对象的更多详细信息。