Раскрашивание ветвей на дендрограмме в R

Уважаемые резиденты R гении,

Я хотел бы раскрасить ветви кластера в дендрограмме, где листья не помечены.

Я нашел следующий скрипт здесь, в Stackoverflow:

clusDendro <- as.dendrogram(Clustering)
labelColors <- c("red", "blue", "darkgreen", "darkgrey", "purple")

## function to get colorlabels
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
}

## Graph
clusDendro <- dendrapply(clusDendro, colLab)
op <- par(mar = par("mar") + c(0,0,0,2))
plot(clusDendro,
     main = "Major title",
     horiz = T, type = "triangle", center = T)

par(op)

Я безуспешно пытался адаптировать его к своим данным следующим образом.

Gdis.UPGMA<-hclust(Gdis, method = "average", members=NULL)
k<-12
Gdiswo<-reorder.hclust(Gdis.UPGMA, Gdis, labels = FALSE)
cutg <- cutree(Gdiswo, k=k)

clusDendro <- as.dendrogram(Gdiswo)
labelColors <- c("red", "blue", "darkgreen", "darkgrey", "purple")

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

## Graph
clusDendro <- dendrapply(clusDendro, colLab)
op <- par(mar = par("mar") + c(0,0,0,2))
plot(clusDendro,
     main = "Major title",
     horiz = T, type = "triangle", center = T)

par(op)

Я подозреваю, что n вызывает проблему, но я не уверен, что я должен поставить вместо n. Поскольку сроки диссертации приближаются, я был бы очень признателен за любой совет. Спасибо, -Элизабет


person Elizabeth    schedule 13.05.2012    source источник
comment
n не вызывает проблемы, это локальная переменная из функции. Но у вас указано пять цветов, и k=12, поэтому у вас есть 12 групп. Вы устанавливаете свои метки в FALSE, но функция использует метки. Без ваших данных невозможно проверить, что именно пошло не так, но попробуйте прочитать код, а не слепо копировать его.   -  person Joris Meys    schedule 13.05.2012
comment
Вы пытаетесь раскрасить ветки или метки веток?   -  person Roman Luštrik    schedule 13.05.2012


Ответы (2)


Вам нужно установить edgePar элементы объекта дендрограммы.

В справке для ?dendrapply есть пример установки цветов меток узлов. Изменив всего одну строку так, чтобы она указывала на "edgePar", и установив col, вы почти достигли цели:

attr(n, "edgePar") <- c(a$nodePar, list(col = mycols[i], lab.font= i%%3))

Полный модифицированный пример:

## a smallish simple dendrogram
dhc <- as.dendrogram(hc <- hclust(dist(USArrests), "ave"))

## toy example to set colored leaf labels :
local({
  colLab <<- function(n) {
    if(is.leaf(n)) {
      a <- attributes(n)
      i <<- i+1
      attr(n, "edgePar") <-
        c(a$nodePar, list(col = mycols[i], lab.font= i%%3))
    }
    n
  }
  mycols <- grDevices::rainbow(attr(dhc21,"members"))
  i <- 0
})
dL <- dendrapply(dhc21, colLab)
plot(dL) ## --> colored labels

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


Вы можете прочитать все об этом, внимательно изучив ?dendrapply и ?as.dendrogram.

person Andrie    schedule 13.05.2012
comment
Привет @Andrie Спасибо за ваш ответ. - person Elizabeth; 13.05.2012
comment
Привет @Andrie Спасибо за ваш ответ. Я попробовал следующее: dhc ‹-as.dendrogram(hc ‹-hclust(Gdis, method =average,members=NULL)) local({colLab ‹‹- function(n) {if(is.leaf(n)) { a ‹- attribute(n) i ‹‹- i+1 attr(n, edgePar) ‹-c(a$nodePar, list(col = mycols[i], lab.font= i%%3))}n} mycols ‹- grDevices::rainbow(attr(dhc,members)) i ‹- 0}) dL ‹- dendrapply(dhc, colLab) plot(dL) но продолжает получать сообщение об ошибке Ошибка: неожиданный символ в: local({colLab ‹‹- function(n) {if(is.leaf(n)) {a ‹- attribute(n) i ‹‹- i+1 attr(n, edgePar есть идеи, что может пойти не так? - person Elizabeth; 13.05.2012
comment
@Elizabeth Ваш код и пример не воспроизводимы, поэтому трудно сказать, что вы делаете неправильно. - person Andrie; 13.05.2012

Просто для дополнительной информации, если вы хотите раскрасить метки, измените edgePar на nodePar и используйте lab.col. Из-за значений узла по умолчанию вам также необходимо установить для pch значение NA, если вы хотите, чтобы все выглядело одинаково:

## a smallish simple dendrogram
dhc <- as.dendrogram(hc <- hclust(dist(USArrests), "ave"))

## create random colours for leaves based on a md5 hash of the leaf labels
library(digest);
dL <- dendrapply(dhc, function(n){
  if(is.leaf(n)){
    labelCol <- paste("#",substring(digest(attr(n,"label")),1,6), sep="");
    attr(n, "edgePar") <- list(col = labelCol);
    attr(n, "nodePar") <- list(pch = NA, lab.col = labelCol, lab.cex = 0.75);
  }
  n;
});

plot(dL); ## --> colored labels

Дендрограмма с цветными метками

person gringer    schedule 24.04.2014