2013-04-17 8 views
4

Я пытаюсь построить результат агломеративной кластеризации (UPGMA с Agnes) в том же стиле, что и при построении дерева с использованием пакета ape ' , Простой пример I приведен на рисунке ниже Figure 1. A simple example of the final output requiredИзменить цвет листа в plot.dendrogram как с plot.phylo пакета ape

Ключевой вопрос заключается в том, что я хочу иметь возможность раскрашивать листья дендрограммы на основе рисунка на этикетках листьев. Я попробовал два подхода: либо использовал hc2Newick, либо использовал код Джориса Мейса, как это было предложено в ответ на вопрос Change Dendrogram leaves. Оба не дали удовлетворительного результата. Возможно, я не совсем понимаю, как устроены дендрограммы. Сохранение объекта ASCII объекта abundance.agnes.ave (сохраненного из бега agnes) можно найти на https://www.dropbox.com/s/gke9qnvwptltkky/abundance.agnes.ave.

Когда я использую первый вариант (с hc2Newick из ctc пакета Bioconductor в) я получаю следующую фигуру, используя этот код:

write(hc2Newick(as.hclust(abundance.agnes.ave)),file="all_samples_euclidean.tre") 
eucltree<-read.tree(file="all_samples_euclidean.tre") 
eucltree.laz<-ladderize(eucltree,FALSE) 
tiplabs<-eucltree$tip.label 
numbertiplabs<-length(tiplabs) 
colourtips<-rep("green",numbertiplabs) 
colourtips[grep("II",tiplabs)]<-"red" 
plot(eucltree.laz,tip.color=colourtips,adj=1,cex=0.6,use.edge.length=F) 
add.scale.bar() 

Using plot.phylo

Это, очевидно, не идеал, «выравнивание» сюжета не так, как я хотел. Я полагаю, что это связано с расчетом длины ветвей, но у меня нет туманной идеи, как решить эту проблему. Конечно, по сравнению с результатами функции colLab, которые больше напоминают стиль дендрограммы, о котором я хотел бы сообщить. Кроме того, использование use.edge.length=T в коде выше, действительно дает кластеризацию, не «выровненный» правильно: Plot.phylo with branch length

Второй подход, использующий функцию совм JORIS Meys' с помощью следующего кода дает следующий рисунок

clusDendro<-as.dendrogram(as.hclust(abundance.agnes.ave)) 
labelColors<-c("red","green") 
clusMember<-rep(1,length(rownames(abundance.x))) 
clusMember[grep("II",rownames(abundance.x))]<-2 
names(clusMember)<-rownames(abundance.x) 

colLab <- function(n) 
{ 
    if(is.leaf(n)) { 
    a <- attributes(n) 
    # clusMember - a vector designating leaf grouping 
    # labelColors - a vector of colors for the above grouping 
    labCol <- labelColors[clusMember[which(names(clusMember) == a$label)]] 
    attr(n, "nodePar") <- c(a$nodePar, lab.col = labCol) 
    } 
    n 
} 

clusDendro<-dendrapply(clusDendro, colLab) 
plot(clusDendro,horiz=T,axes=F) 

Using colLab Этот участок приближается к тому, что я хочу, однако я не знаю, почему открытые круги появляются на листьях и как их удалить.

Любая помощь очень ценится.

С наилучшими пожеланиями,

FM

ответ

0

Я написал этот код довольно давно, и, кажется, есть кое-что немного изменилось в механизме.

plot.dendrogram функция я использовал, есть аргумент nodePar. Поведение изменилось с тех пор, как я использовал эту функцию в последний раз, и хотя это обычно используется для внутренних узлов, это, по-видимому, влияет и на внешние узлы. Значение по умолчанию для pch составляет 1:2 сейчас, согласно файлам справки.

Следовательно, вам нужно конкретно указать pch=NA в атрибутах, которые вы добавляете во внешние узлы в функции colLab. Попробуйте адаптировать его следующим образом:

colLab <- function(n) 
{ 
    if(is.leaf(n)) { 
    a <- attributes(n) 
    # clusMember - a vector designating leaf grouping 
    # labelColors - a vector of colors for the above grouping 
    labCol <- labelColors[clusMember[which(names(clusMember) == a$label)]] 

    attr(n, "nodePar") <- 
     if(is.list(a$nodePar)) c(a$nodePar, lab.col = labCol,pch=NA) else 
           list(lab.col = labCol,pch=NA) 
    } 
    n 
} 

На моей машине это решает проблему.

В качестве альтернативы вы можете взглянуть на аргумент use.edge.length функции plot.phylo в пакете ape.Вы установили его на FALSE, но из вашего объяснения я считаю, что вы хотите, чтобы он был установлен по умолчанию, TRUE.

EDIT: для того, чтобы сделать функцию более общей, может быть хорошей идеей добавить labelColors и clusMember в качестве аргументов функции. Мое быстрое n-грязное решение - не лучший пример чистого кода ...

Также забудьте, что я сказал об использовании длины кромки. пакет обезьян интерпретирует его как реальную дендрограмму и ставит use.edge.length на TRUE, преобразует длины ребер в время эволюции. Отсюда «странное» изложение дендрограммы.

Также отметим, что в случае treeleafs не имеют атрибут nodePar, добавляя дополнительные параметры с помощью функции c() приведет к нежелательным последствиям: если добавить, например, lab.cex=0.6, функция c() создаст вектор вместо списка, и преобразовать значение для lab.cex в символ, если в списке параметров есть значение символа. В этом случае это будет имя цвета, и это объясняет ошибку, о которой вы говорите в комментарии.

+1

Joris, благодарю вас за ответ. На моей машине это также решает проблему. Что касается вашего комментария к 'use.edge.length', я редактировал свое оригинальное сообщение, показывающее, что я получаю от него нежелательный результат. Я должен признать, что я все еще немного туманный о деталях. Например, если я добавляю 'lab.cex' к атрибутам узлов (например)' attr (n, "nodePar") <- c (a $ nodePar, lab.col = labCol, pch = NA, lab.cex = 0.6) '. Я получаю сообщение об ошибке, которое я не понимаю: 'Ошибка в dLeaf * lab.cex: нечисловой аргумент двоичному оператору'. –

+1

См. Мое редактирование .... –

2

Эта функциональность теперь доступна в новом пакете под названием «dendextend», построенном именно для такого рода вещей.

Вы можете увидеть много примеров в презентациях и виньеток упаковки, в разделе «Использование» в следующем URL: https://github.com/talgalili/dendextend

Почти точный вопрос просто ответил следующим С.О. вопрос:

https://stackoverflow.com/a/18832457/256662

+1

Благодарим за ваше обновление, я очень скоро исследую использование вашего пакета. Я на самом деле просто искал возможность сделать «tanglegrams», как показано в вашей виньетке! –

+1

Мое удовольствие FM. Кроме того, если вы создадите что-то с пакетом, пожалуйста, подумайте о том, чтобы отправить мне по электронной почте мою работу (мой контакт находится на главной странице github). Я очень хочу продемонстрировать примеры реальных тематических исследований для использования этого кода, поэтому я хотел бы продвигать вашу работу. Удачи, Tal Galili –