r - 从dendextend::circlize_dendrogram()的输出中提取簇颜色

标签 r hierarchical-clustering dendextend

我正在尝试提取circlize_dendrogram聚类中使用的颜色。这是一个示例代码:

library(magrittr)
library(dendextend)

cols <- c("#009000", "#FF033E", "#CB410B", "#3B444B", "#007FFF")
dend <- iris[1:40,-5] %>% dist %>% hclust %>% as.dendrogram    

dend <- color_branches(dend, k = 5, col = cols)
dend %<>% set("labels_col", value = cols, k= 5)
dend %<>% set("labels_cex", .8)
dend %<>% set("branches_lwd", 2)

circlize_dendrogram(dend)

enter image description here

以便使用cutree(dend, k = 5)提取列表化的簇。有没有一种方法可以根据给定的cols提取树状图中簇的颜色?我需要它来使用grid包在图例中插入图例。

示例,图例:群集1-#009000;群集2-#FF033E;群集3-#CB410B;群集4-#3B444B;群集5-#007FFFcirclize_dendrogram的问题在于,用于群集的颜色顺序不同。

尽管我可以手动执行此操作,但是如果我可以自动执行此操作将非常有效。如果我可以提取群集的颜色,那是可能的。

最佳答案

好的,这是一个非常棘手的解决方案。我相信有更好的选择,但这是第一步,所以请耐心等待。

这个想法是在dend对象(内部是一个列表)中搜索各个元素名称(在本例中为数字),然后提取相应的颜色,将其保存在数据框中并将其用作图例。

# First we'll extract the elements and corresponding categories...
categories <- cutree(dend, k = 5)

# ... and save them in a data frame
categories_df <- data.frame(elements = as.numeric(names(categories)),
       categories = categories, 
       color = NA)

# now here's a little function that extracts the color for each element
# from the 'dend' object. It uses the list.search() function from the
# 'rlist' package

library(rlist)

extract_color <- function(element_no, dend_obj) {
  dend.search <- list.search(dend_obj, all(. == element_no))
  color <- attr(dend.search[[1]], "edgePar")$col
  return(color)
}

# I use 'dplyr' to manipulate the data
library(dplyr)

categories_df <- categories_df %>% 
  group_by(elements) %>% 
  mutate(color = extract_color(elements, dend))

现在,这为我们提供了以下数据框架:
> categories_df
Source: local data frame [40 x 3]
Groups: elements [40]

   elements categories   color
      (dbl)      (int)   (chr)
1         1          1 #CB410B
2         2          1 #CB410B
3         3          1 #CB410B
4         4          1 #CB410B
5         5          1 #CB410B
6         6          2 #009000
7         7          1 #CB410B
8         8          1 #CB410B
9         9          3 #007FFF
10       10          1 #CB410B
..      ...        ...     ...

我们可以将其汇总为仅包含类别颜色的数据框,例如
legend_data <- categories_df %>% 
  group_by(categories) %>% 
  summarise(color = unique(color))

> legend_data
Source: local data frame [5 x 2]

  categories   color
       (int)   (chr)
1          1 #CB410B
2          2 #009000
3          3 #007FFF
4          4 #FF033E
5          5 #3B444B

现在很容易生成图例:
circlize_dendrogram(dend)
legend(-1.05, 1.05, legend = legend_data$categories, fill = legend_data$color, cex = 0.7)

这给你:

enter image description here

您可以使用cutree(dend, k = 5)确认类别颜色的数字与每个元素的类别相对应。

关于r - 从dendextend::circlize_dendrogram()的输出中提取簇颜色,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36759467/

相关文章:

r - R中实现的图划分算法

r - 如何修复 r : 'more cluster centers than distinct data points' 中的 kmeans 错误

python - 100万个对象的层次聚类

r - 使用 `plm()` 估计具有嵌套结构的重复测量随机效应模型

r - 颜色树状图基于外部标签向根分支,直到标签匹配

r - 使用dendextend在R中绘制缠结子图

r - R中水平树状图的树切割和簇周围的矩形

r - 新引用类(class)的意义是什么?

r - 考虑键列之间的范围匹配,合并两个数据框

r - 如何在 R 中编写帕斯卡三角形的程序?