将树状图与 R 中的二分图结合起来(缠结图)
Combine dendrogram with bipartite graphs in R (tanglegram)
我目前正在创建一个缠结图,其中饲养的物种在一侧,饲养的底物在另一侧。但是,我需要输出也是一个缠结图,让图表的每一侧都是树状图的尖端。我目前有 Newick 格式的物种和底物的系统发育。
我成功使用了'ape' package and the plot.phylo()
function to generate the 2 phylogenies. I then used the following code from 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' 包中使用。
但是,当然,二分图上的间距与 dengdrograms 上的间距不匹配,所以我不能 copy/paste 在外部图像处理程序中将它们并排放置.我想知道是否有一种方法可以生成结合了树状图和二分图的图表以在 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
您可以使用 phytools
包中的函数 cophylo
:
require(phytools)
## Your two trees
tree1 <- ape::rcoal(10)
tree2 <- ape::rcoal(10)
如果两棵树都有匹配的尖端标签,您可以将它们传递给 phytools
中的 cophylo
函数以创建一个 "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"
对象的更多详细信息。
一种使用尖端标签不匹配的树绘制缠结图的方法是使用关联矩阵 - 一个列出相应树中相应分类单元的矩阵。使用提供的数据,以下代码将从列和行中提取名称以及相应的权重。
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)
我目前正在创建一个缠结图,其中饲养的物种在一侧,饲养的底物在另一侧。但是,我需要输出也是一个缠结图,让图表的每一侧都是树状图的尖端。我目前有 Newick 格式的物种和底物的系统发育。
我成功使用了'ape' package and the plot.phylo()
function to generate the 2 phylogenies. I then used the following code from 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' 包中使用。
但是,当然,二分图上的间距与 dengdrograms 上的间距不匹配,所以我不能 copy/paste 在外部图像处理程序中将它们并排放置.我想知道是否有一种方法可以生成结合了树状图和二分图的图表以在 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
您可以使用 phytools
包中的函数 cophylo
:
require(phytools)
## Your two trees
tree1 <- ape::rcoal(10)
tree2 <- ape::rcoal(10)
如果两棵树都有匹配的尖端标签,您可以将它们传递给 phytools
中的 cophylo
函数以创建一个 "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"
对象的更多详细信息。
一种使用尖端标签不匹配的树绘制缠结图的方法是使用关联矩阵 - 一个列出相应树中相应分类单元的矩阵。使用提供的数据,以下代码将从列和行中提取名称以及相应的权重。
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)