R言語のggplot2パッケージを用いて階層的クラスタリングの結果を可視化する方法についてお伝えいたします。

一般に、階層的クラスタリングの結果は、デンドログラムまたは樹形図として可視化されます。ggplot2パッケージには、デンドログラムまたは樹形図を可視化する機能が備わっておりません。しかし、ggplot2パッケージと合わせてggdendroパッケージを用いれば、ggplot2にデンドログラムまたは樹形図を可視化できる機能が追加されます。

ここでは、このggdendroパッケージの機能について見ていくことにします。サンプルデータは、Rに組み込まれているPlantGrowth(植物の成長の実験からの結果)を用いることにします。


data(PlantGrowth)
str(PlantGrowth)
'data.frame':	30 obs. of  2 variables:
 $ weight: num  4.17 5.58 5.18 6.11 4.5 4.61 5.17 4.53 5.33 5.14 ...
 $ group : Factor w/ 3 levels "ctrl","trt1",..: 1 1 1 1 1 1 1 1 1 1 ...

また、予めggplot2とggdendroを読み込んでおきます。


library(ggplot2)
library(ggdendro)

ggdendrogram()を用いる方法

階層的クラスタリングの結果をすぐに可視化するにはggdendrogram()を用いるのが便利です。

ggdendrogram()の引数

引数 説明
data hclust()の結果やdendroオブジェクトなど
segments セグメントの線を描画するかどうか
labels セグメントのラベルを描画するかどうか
leaf_labels リーフラベルを描画するかどうか
rotate 図を90度回転させるかどうか
theme_dendro ブランクテーマを適用するかどうか

h <- hclust(dist(PlantGrowth$weight))
ggdendrogram(h, segments = TRUE, labels = TRUE, leaf_labels = TRUE, rotate = FALSE, theme_dendro = TRUE)

dendro_data()を用いる方法

dendro_data()は、階層的クラスタリングの結果をggplot2で扱えるように変換します。そのため、描画の方法はggplot2を通して行われるため、柔軟な設定が可能となります。

dendro_data()の引数

引数 説明
model stats::hclust()やstats::dendrogram()、tree::tree()の結果
type 「rectangle」または「triangle」を指定。それぞれ、セグメントの線を四角形または三角形で描画する

h <- hclust(dist(PlantGrowth$weight))
d <- as.dendrogram(h)
dd <- dendro_data(d, type = "rectangle")

g <- ggplot(segment(dd))
g <- g + geom_segment(aes(x = x, y = y, xend = xend, yend = yend))
plot(g)

タイトルやx軸ラベル、y軸ラベルの描画や、図を回転させるなどは、ggplot2の機能を用いて表すことができます。
例えば、サンプルデータPlantGrowthの列groupごとに色を分けるときは、次のようになります。


library(tidyverse)

h <- hclust(dist(PlantGrowth$weight))
d <- as.dendrogram(h)
dd <- dendro_data(d, type = "rectangle")
dd$labels <- dd$labels %>%
  left_join(PlantGrowth %>% add_rownames("x") %>% mutate(x = as.numeric(x)), by = "x")
  

g <- ggplot(segment(dd))
g <- g + geom_segment(aes(x = x, y = y, xend = xend, yend = yend))
g <- g + geom_text(data = dd$labels, aes(x, y, label = label, color = group), hjust = 1, angle = 90)
g <- g + ylim(-0.3, 3)
plot(g)

簡単に補足しますと、dendro_data関数の結果のlabelsデーターフレームに、元のPlantGrowthを結合し、geom_text関数にこの結合されたlabelsデータフレームのgroupを色分けに用いております。

R×ggplot2 階層的クラスタリングの結果を可視化する方法