Объедините дендрограмму с двудольными графами в R (tanglegram)

В настоящее время я работаю над созданием танглограммы, в которой выращиваемые виды находятся на одной стороне, а субстрат, на котором выращивается, — на другой стороне. Однако мне нужно, чтобы на выходе также была танглограмма, в которой каждая сторона диаграммы была бы кончиками дендрограммы. В настоящее время у меня есть филогении как видов, так и субстратов в формате Ньюика.

Я успешно использовал 'ape' и функцию plot.phylo() для создания двух филогений. Затем я использовал следующий код из 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")

Затем я использовал порядок подсказок для создания матрицы для использования в 'двусторонний' пакет.

Однако, конечно, расстояние на двудольном графике не совпадает с расстоянием на денгдрограммах, поэтому я не могу просто скопировать/вставить их рядом друг с другом во внешней программе обработки изображений. Мне интересно, есть ли способ создать диаграмму, которая объединяет дендрограммы и двудольный график для создания танглограммы в 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


person talker90    schedule 15.10.2018    source источник


Ответы (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)

введите здесь описание изображения

person nya    schedule 23.10.2018
comment
Большое спасибо! Красивая работа! Это очень мило. Для моего фактического набора данных мне также пришлось добавить эти две строки tree1<-collapse.singles(tree1) tree2<-collapse.singles(tree2) В этом случае мне это не нужно, но эта ссылка может быть полезна для других, если они пытаются сохранить длину ветвей после обрушения синглов - person talker90; 26.10.2018

Вы можете использовать функцию cophylo из пакета phytools:

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)

Взгляните на этот превосходный сообщение в блоге. содержащий более подробную информацию о том, как использовать эти "cophylo" объекты.

person Thomas Guillerme    schedule 15.10.2018
comment
Привет! Спасибо за ваш ответ и за сообщение в блоге! Моя проблема в том, что я пытаюсь пройти через 2 дерева с разными метками кончиков (одно дерево выращиваемых видов и одно дерево субстратов, на которых выращивались эти виды). Я отредактировал свой пост, добавив для вас изображения, которые могут показать, чего я пытаюсь достичь, лучше, чем я мог бы объяснить. - person talker90; 16.10.2018