10

のクラスタリングで使用される色を抽出しようとしています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)

ここに画像の説明を入力

を使用して、集計されたクラスターが抽出されるようにしcutree(dend, k = 5)ます。指定されたものに基づいて樹状図のクラスターの色を抽出する方法はありcolsますか? gridパッケージを使用してプロットに凡例を挿入するために必要です。

例、凡例: クラスター 1 - #009000; クラスター 2 - #FF033E; クラスター 3 - #CB410B; クラスター 4 - #3B444B; クラスター 5 - #007FFF. の問題circlize_dendrogramは、クラスタに使用される色の順序が異なることです。

これは手動でもできますが、自動でできると効率的です。クラスターの色を抽出できれば、それは可能です。

4

2 に答える 2

8

わかりました、これは非常にハックな解決策です。もっと良いものがあると確信していますが、これは最初の刺し傷なので、我慢してください。

アイデアは、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)

これにより、次のことが得られます。

ここに画像の説明を入力

cutree(dend, k = 5)カテゴリの色の数字が各要素のカテゴリに対応していることを確認するために使用できます。

于 2016-04-25T09:07:54.553 に答える