当初の問題が自己解決してしまったけど悔しいので調べたことを書く。
ラベルの編集
普通にデンドログラムをプロットするとこんな感じになる。
data("UScitiesD")
hc <- hclust(UScitiesD)
plot(hc)
それぞれの項目を指すラベルは書き換えることができる。例えばhclustオブジェクトをそのままplot()
に渡す場合は、labels=
引数で任意のラベルを指定することができる。
plot(hc, labels = 1:10)
回転
デンドログラムを回転させるには、一旦dendrogramオブジェクトに変換した後にplot()
に渡し、horiz=
引数にTRUE
を指定してやる必要がある。
plot(as.dendrogram(hc), horiz = TRUE)
回転+ラベル指定
ここで若干ハマった。これを普通にやろうとすると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距離
そこでラベルをつけないといけないなと思ってロクにドキュメントも読まずに(よくない)色々調べてたんだけど、改めてヘルプ確認してみたらそもそもstringdistmatrix()
はuseNames=
で出力にもとの文字列を使うよう指定できたので、結局あまり意味がなかった。
plot(hclust(stringdist::stringdistmatrix(w, method = "dl", useNames = "string")))