Объединить дендрограмму с двудольными графами в R (tanglegram) - PullRequest
0 голосов
/ 15 октября 2018

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

Я успешно использовал пакет 'ape' и функцию plot.phylo() для генерации 2 филогений.Затем я использовал следующий код из этого поста для экспорта порядка подсказок:

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

Ответы [ 2 ]

0 голосов
/ 23 октября 2018

Чтобы нарисовать путевую диаграмму с деревьями, где метки кончиков не совпадают, можно использовать матрицу ассоциации - матрицу, в которой перечислены соответствующие таксоны в соответствующих деревьях.Используя предоставленные данные, следующий код извлечет имена из столбцов и строк и соответствующий вес.

 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

0 голосов
/ 16 октября 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" объектов.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...