Dendextend: Относительно того, как раскрасить метки дендрограммы в соответствии с определенными группами

Я пытаюсь использовать замечательный R-пакет с именем dendextend, чтобы построить дендрограмму и раскрасить ее ветви и метки в соответствии с набором ранее определенных групп. Я прочитал ваши ответы в Stack Overflow и часто задаваемые вопросы о виньетке dendextend, но я все еще не уверен, как достичь своей цели.

Представим, что у меня есть фрейм данных с первым столбцом с именами отдельных лиц для кластеризации, затем несколько столбцов с анализируемыми факторами и последний столбец с информацией о группах для каждого из лиц (см. Следующую таблицу) .

individual  282856  282960  283275  283503  283572  283614  284015  group
pat15612    0   0   0   0   0   0   0   g2
pat38736    0   0   0   0   0   0   0   g2
pat38740    0   0   0   0   0   1   0   g2
pat38742    0   0   0   0   0   1   0   g4
pat38743    0   0   1   0   0   1   0   g3
pat38745    0   0   1   0   1   0   0   g4
pat38750    0   0   0   1   0   1   0   g4
pat38753    0   0   0   1   0   0   0   g3
pat40120    0   0   0   0   1   0   0   g4
pat40124    0   0   0   0   1   0   0   g4
pat40125    0   0   0   0   1   1   0   g4
pat40126    0   0   0   1   0   0   0   g4
pat40137    1   0   0   0   0   0   0   g4
pat40142    0   1   0   0   0   0   0   g5
pat46903    0   0   0   0   0   1   0   g1
pat67612    1   0   0   0   1   0   0   g1
pat67621    0   0   0   0   0   0   0   g2
pat67630    0   0   1   0   0   0   0   g2
pat67634    0   0   0   0   0   0   0   g5
pat67657    0   1   0   1   0   0   0   g5
pat67680    0   0   0   0   0   1   0   g5
pat67683    0   0   1   1   0   0   0   g6

Как мне раскрасить ветви и метки, представляющие каждого из людей, в зависимости от группы, к которой они принадлежат, даже если они могут группироваться в разные блоки?

Если это может быть достигнуто, есть ли способ определить цвета, назначенные каждой группе?


person JLLavin    schedule 20.07.2017    source источник


Ответы (2)


Я рад, что ты решил это самостоятельно. Более простое решение - использовать аргумент order_value = TRUE в функции set. Например:

library(dendextend)
iris2 <- iris[,-5]
rownames(iris2) <- paste(iris[,5],iris[,5],iris[,5], rownames(iris2))
dend <- iris2 %>% dist %>% hclust %>% as.dendrogram
dend <- dend %>% set("labels_colors", as.numeric(iris[,5]), order_value = TRUE) %>%
        set("labels_cex", .5)
par(mar = c(4,1,0,8))
plot(dend, horiz = T)

Результатом будет (как видите, цвета меток основаны на другой переменной «Виды» в наборе данных радужки):

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

(p.s.: я утроил количество появлений вида, чтобы было легче увидеть, как цвет соотносится с длиной этикетки)

person Tal Galili    schedule 24.07.2017
comment
Спасибо, Тал, ваш код намного оптимизирован! ;) - person JLLavin; 27.07.2017
comment
Добро пожаловать :) Есть шанс принять мой ответ? (Так что люди в будущем будут использовать это напрямую с set) - person Tal Galili; 27.07.2017
comment
Уважаемый Таль, извиняюсь за задержку с принятием вашего ответа. - person JLLavin; 02.08.2017
comment
Кстати, можете ли вы порекомендовать способ получения информации из каждой ветви дендрограммы? Например, программное получение имен меток на каждой ветви объекта dend. - person JLLavin; 02.08.2017
comment
Привет, @JLLavin - вы имеете в виду функцию labels? - person Tal Galili; 02.08.2017
comment
Привет, @Tal Galili. Я думал о чем-то похожем на использование функции: cutree(dend,k=10), чтобы разрезать дендрограмму на 10 групп. Затем мне нужно получить имена (метки) ветвей для каждой части дендрограммы, полученной с помощью cutree ... Есть мысли? - person JLLavin; 03.08.2017
comment
split (метки (dend), cutree (dend, k = 10)) - person Tal Galili; 09.12.2017

Я смог сделать это с помощью другого пакета под названием «sparcl». Я сделал это на основе предыдущего сообщения (Как раскрасить метки дендрограммы с помощью дополнительной факторной переменной в R).

Вот мой код:

#load the dataset.....
#calculate distances
d <- dist(dataset2, method="Jaccard")
## Hierarchical cluster the data
hc <- hclust(d)
dend <- as.dendrogram(hc)
#create labels
labs=dataset$individual
#format to dendrogram
hcd = as.dendrogram(hc)                             
plot(hcd, cex=0.6)
# factor variable for colours                                  
Var = dataset$group   
# convert numbers to colours                                    
varCol = gsub("g1.*","green",Var)                        
varCol = gsub("g2.*","gold",varCol)
varCol = gsub("g3.*","pink",varCol)                        
varCol = gsub("g4.*","purple",varCol)
varCol = gsub("g5.*","blue",varCol)                        
varCol = gsub("g6.*","red",varCol)
#colour-code dendrogram branches by a factor 
library(sparcl)
ColorDendrogram(hc, y=varCol, branchlength=0.9, labels=labs,
            xlab="", ylab="", sub="")  

Наконец, мне удалось вывести пакетное решение «dendextend» на основе примера этого сообщения (Как раскрасить метки дендрограммы с помощью дополнительной факторной переменной в R):

# install.packages("dendextend")
library(dendextend)

#load the dataset.....
dataset2<-dataset[,1:7]#same dataset as in the example

#calculate the dendrogram
dend <- as.dendrogram(hclust(dist(dataset2)))

#capture the colors from the "group" column
colors_to_use <- as.numeric(dataset$group)
colors_to_use

# sort the colors based on their order in dend:
colors_to_use <- colors_to_use[order.dendrogram(dend)]
colors_to_use

#Apply colors 
labels_colors(dend) <- colors_to_use

# Patient labels have a color based on their group
labels_colors(dend) 
plot(dend, main = "Color in labels")
person JLLavin    schedule 21.07.2017