Я хочу установить цвет ветвей моей дендрограммы с учетом назначенных вручную групп моих листьев. Поэтому я заранее знаю, что хочу раскрасить, например. листья A-C красного цвета, и все ветви, ведущие только к красным листьям, также должны быть окрашены в красный цвет.
Я могу раскрашивать ветви своей дендрограммы с помощью пакета dendextend. Однако я не могу контролировать, какой цвет назначается какому идентификатору кластера. dendrextend
назначает первый цвет первому найденному идентификатору кластера, независимо от того, является ли это идентификатором 1. Однако мне нужен идентификатор 1, окрашенный в цвет 1 и т. Д., Поскольку мне нужна легенда.
См. Этот пример. Мне нужна дендрограмма, которая раскрашивает метки и ветви _2 _-_ 3_ красным, _4 _-_ 5_ синим и _6 _-_ 7_ зеленым.
suppressPackageStartupMessages(library(dendextend))
library(dplyr)
set.seed(12346)
# Sample data:
# ------------
# l = Leaf labels | g = assigned color of leaf | x = value for clustering
dat <- tibble(l = LETTERS[1:9],
g = factor(rep(letters[1:3], each = 3)),
x = round(runif(9,0,10)))
# color_branches() need integer cluster IDs
dat$gi <- dat$g %>% as.integer()
# Color IDs of each group
dat %>% distinct(g, gi)
## # A tibble: 3 x 2
## g gi
## <fct> <int>
## 1 a 1
## 2 b 2
## 3 c 3
# ID 1 = red, ID 2 = blue, ID 3 = green
clucols <- c("red", "blue", "green")
# Clustering & Dendrogram
# -----------------------
dst <- dist(setNames(dat$x, dat$l))
den <- as.dendrogram(hclust(dst))
o <- order.dendrogram(den)
den <- den %>%
color_branches(col = clucols, clusters = dat$gi[o])
# Transfer branch colors to labels
labels_colors(den) <- get_leaves_branches_col(den)
plot(den)
# Legend
dat %>% distinct(g, gi) %>%
{legend("topright", legend = .$g, col = clucols[.$gi], lty = 1)}
Результат:
Листья окрашены не в желаемом порядке, а по положению кластера на графике слева направо.
Если вы измените строку set.seed(...)
на set.seed(12345)
, вы увидите, что окраска кажется правильной. Но это потому, что кластеры появляются в правильном порядке случайно, если смотреть слева направо:
Как заставить color_branches()
назначать цвета по идентификатору кластера, а не по тому, какой кластер идет первым?
Другие вопросы SO, которые я пробовал
Dendextend: Относительно того, как раскрасить метки дендрограммы в соответствии с определенными группами: этот вопрос связан, но он нацелен только на цветные метки.
Цветные ветки дендрограммы на основе на внешних этикетках вверх к корню, пока метка не совпадет. Предложен ответ
branches_attr_by_cluster
, который я перевел в свой пример следующим образом:den <- den %>% branches_attr_by_clusters( values = clucols[dat$gi[o]], clusters = dat$gi[o], attr = "col")
Однако, увы, результат был тот же.