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を色分けに用いております。

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