【发布时间】:2018-10-30 17:48:33
【问题描述】:
给定手动分配的叶子组,我想设置树状图分支的颜色。所以我提前知道我想着色,例如叶子A-C是红色的,所有只长出红色叶子的树枝也应该染成红色。
我可以使用“dendextend”包为我的树状图的分支着色。
但是,我无法控制将哪种颜色分配给哪个集群 ID。 dendrextend 将第一个颜色分配给它找到的第一个集群 ID,无论它是否是 ID 1。但是,我需要以颜色 1 等颜色着色的 ID 1,因为我需要一个图例。
请参阅此示例。我想要一个树状图,它将标签和分支A-C 涂成红色,D-F 涂成蓝色,G-I 涂成绿色。
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() 按集群 ID 分配颜色,而不是按哪个集群先分配颜色?
我尝试过的其他 SO 问题
Dendextend: Regarding how to color a dendrogram’s labels according to defined groups:这个问题是相关的,但它只针对着色标签。
-
Color dendrogram branches based on external labels uptowards the root until the label matches。提出了一个答案
branches_attr_by_cluster,我将其翻译成这样的示例:den <- den %>% branches_attr_by_clusters( values = clucols[dat$gi[o]], clusters = dat$gi[o], attr = "col")但是结果是一样的
【问题讨论】:
标签: r plot dendrogram dendextend