LoginSignup
6
12

More than 5 years have passed since last update.

デンドログラムのラベル操作や回転

Posted at

当初の問題が自己解決してしまったけど悔しいので調べたことを書く。

ラベルの編集

普通にデンドログラムをプロットするとこんな感じになる。

data("UScitiesD")
hc <- hclust(UScitiesD)
plot(hc)

Rplot.png

それぞれの項目を指すラベルは書き換えることができる。例えばhclustオブジェクトをそのままplot()に渡す場合は、labels=引数で任意のラベルを指定することができる。

plot(hc, labels = 1:10)

Rplot01.png

回転

デンドログラムを回転させるには、一旦dendrogramオブジェクトに変換した後にplot()に渡し、horiz=引数にTRUEを指定してやる必要がある。

plot(as.dendrogram(hc), horiz = TRUE)

Rplot02.png

回転+ラベル指定

ここで若干ハマった。これを普通にやろうとするとhclustオブジェクトかdendrogramオブジェクトのラベルを先に書き換えておく必要がある。

hclustオブジェクトのラベルを書き換える場合

これは簡単で$labelsの中身を書き換えれば良い。

hc$labels <- 1:10
plot(as.dendrogram(hc), horiz = TRUE)

dendrogramオブジェクトのラベルを書き換える場合

一度dendrogramオブジェクトにしてしまうとラベルを操作するのが多少面倒で、dendextendパッケージのlabels()関数を使うことになる。また、ラベルの順序もクラスタリング後のものに合わせて並び替えておく必要がある。クラスタリング後の順序はhclustオブジェクトの$orderから参照できる。

de <- as.dendrogram(hc)
dendextend::labels(de) <- (1:10)[hc$order]
plot(de, horiz = TRUE)

「当初の問題」とやら

そもそもやりたかったのは

  • 文字列間の編集距離を計算
  • 距離に基づいてクラスタリングし、デンドログラムを描く
  • デンドログラムはラベルが水平になるように回転させる

ということだった。文字列間の編集距離行列はstringdistパッケージのstringdistmatrix()などで計算できるので、これをhclust()に渡せばクラスタリングができるのだが、stringdistmatrix()はデフォルトでラベルを数字に置き換えてしまうので、プロットするとこんな感じになる。

w <- c("aaa", "aab", "aba", "bbb", "bab", "aaaa", "ccc", "abb", "ccccc")
plot(hclust(stringdist::stringdistmatrix(w, method = "dl")))
# dl: Damarau-Levenshtein距離

Rplot03.png

そこでラベルをつけないといけないなと思ってロクにドキュメントも読まずに(よくない)色々調べてたんだけど、改めてヘルプ確認してみたらそもそもstringdistmatrix()useNames=で出力にもとの文字列を使うよう指定できたので、結局あまり意味がなかった。

plot(hclust(stringdist::stringdistmatrix(w, method = "dl", useNames = "string")))

Rplot04.png

参考

6
12
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
6
12