Я пытаюсь построить результат агломеративной кластеризации (UPGMA с Agnes) в том же стиле, что и при построении дерева с использованием пакета ape ' , Простой пример I приведен на рисунке ниже Изменить цвет листа в 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()
Это, очевидно, не идеал, «выравнивание» сюжета не так, как я хотел. Я полагаю, что это связано с расчетом длины ветвей, но у меня нет туманной идеи, как решить эту проблему. Конечно, по сравнению с результатами функции colLab, которые больше напоминают стиль дендрограммы, о котором я хотел бы сообщить. Кроме того, использование use.edge.length=T
в коде выше, действительно дает кластеризацию, не «выровненный» правильно:
Второй подход, использующий функцию совм 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)
Этот участок приближается к тому, что я хочу, однако я не знаю, почему открытые круги появляются на листьях и как их удалить.
Любая помощь очень ценится.
С наилучшими пожеланиями,
FM
Joris, благодарю вас за ответ. На моей машине это также решает проблему. Что касается вашего комментария к 'use.edge.length', я редактировал свое оригинальное сообщение, показывающее, что я получаю от него нежелательный результат. Я должен признать, что я все еще немного туманный о деталях. Например, если я добавляю 'lab.cex' к атрибутам узлов (например)' attr (n, "nodePar") <- c (a $ nodePar, lab.col = labCol, pch = NA, lab.cex = 0.6) '. Я получаю сообщение об ошибке, которое я не понимаю: 'Ошибка в dLeaf * lab.cex: нечисловой аргумент двоичному оператору'. –
См. Мое редактирование .... –