繁体   English   中英

使dendextend将颜色分配给我为树叶预设颜色的分支

[英]Make dendextend assign colors to branches where I preset colors for leaves

给我手动分配的叶子组,我想设置树状图分支的颜色。 因此,我事先知道我想将叶子AC涂成红色,并且仅导致红色叶子的所有分支也应涂成红色。

我可以使用“ dendextend”包为树状图的分​​支着色。 但是,我无法控制将哪种颜色分配给哪个群集ID。 dendrextend将第一种颜色分配给找到的第一个群集ID,而不管它是否是dendrextend 。但是,我需要用颜色1着色的ID 1, dendrextend ,因为我需要图例。

请参阅此示例。 我想要一个树状图,以颜色标记标签,并以红色显示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问题

一种解决方法是使用功能branches_attr_by_labels将颜色分别分配给每个组的分支。

在问题中替换此代码:

den <- den %>%
  color_branches(col = clucols, clusters = dat$gi[o]) 

与下面的代码。

您需要获取一个列表,其中包含每个组的每个元素。 每个元素依次包含要着色的标签和颜色本身。 例如,您可以得到它:

library(purrr)
colmap <- dat %>% group_by(g) %>% summarise(l = list(l)) %>% transpose()
colmap

## [[1]]
## [[1]]$g
## [1] 1
## 
## [[1]]$l
## [1] "A" "B" "C"
## 
## 
## [[2]]
## [[2]]$g
## [1] 2
## 
## [[2]]$l
## [1] "D" "E" "F"
## 
## 
## [[3]]
## [[3]]$g
## [1] 3
## 
## [[3]]$l
## [1] "G" "H" "I"

然后,对于每个元素,应用branches_attr_by_labels 由于它需要树状图和一些变化的参数,并且还返回树状图,因此可以使用purrr::reducebase::Reduce

den <- reduce(.x = colmap, .init = den, .f = function(d, m) 
  branches_attr_by_labels(d, m$l, clucols[m$g] ))

或者,稍长一些:

for(e in colmap){
  den <- branches_attr_by_labels(den, e$l, clucols[e$g])
}

set.seed(123456)结果。 与上图比较:

正确着色的树状图

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM