Rはhclust()
,as.dendrogram()
およびplot.dendrogram()
の関数を使用してthis dendrogramを生成しました。Rのデンドログラムでは、エッジの色を付けたり、矩形を正しく描くにはどうしたらいいですか?
私はdendrapply()
関数を使用してローカルな関数を使って葉を色づけしました。これは問題なく動作しています。
Iは、(ツリーの右下隅に「_+v\_stat5a\_01_
」の例えばクラスタと「_+v\_stat5b\_01_
」)ノードのセットかどうかを示す統計的検定の結果を持っているが重要または重要です。
私はdendrapply()
と一緒に使用できるローカル関数を持っています。これは、重要な葉を含む私の樹形図の正確なノードを見つけます。
Iは、(次の例)たい:
- カラー "
_+v\_stat5a\_01_
" 及び "_+v\_stat5b\_01_
" に参加エッジ。または、 - 私は次のローカル機能(「ノード・イン・leafListマッチ・ノード・イン・ClusterListが」条件の詳細は上がらないを持って周り
rect()
「_+v\_stat5a\_01_
」と「_+v\_stat5b\_01_
」
を描きます)重要なのは、それは重要なノードを強調している「T:
markSignificantClusters <<- function (n) {
if (!is.leaf(n)) {
a <- attributes(n)
leafList <- unlist(dendrapply(n, listLabels))
for (clusterIndex in 1:length(significantClustersList[[1]])) {
clusterList <- unlist(significantClustersList[[1]][clusterIndex])
if (nodes-in-leafList-match-nodes-in-clusterList) {
# I now have a node "n" that contains significant leaves, and
# I'd like to use a dendrapply() call to another local function
# which colors the edges that run down to the leaves; or, draw
# a rect() around the leaves
}
}
}
}
このif
ブロック内からは、私がdendrapply(n, markEdges)
を呼び出して試してみましたが、これは動作しませんでした:
markEdges <<- function (n) {
a <- attributes(n)
attr(n, "edgePar") <- c(a$edgePar, list(lty=3, col="red"))
}
私の理想的な例では、 "_+v\_stat5a\_01_
"と "_+v\_stat5b\_01_
"を接続するエッジは赤く塗りつぶされています。
Iはまた、このif
ブロック内rect.hclust()
を用いて試みた:
ma <- match(leafList, orderedLabels)
rect.hclust(scoreClusterObj, h = a$height, x = c(min(ma), max(ma)), border = 2)
をしかし、結果は、水平デンドログラム(横ラベル付き即ち樹状図)で動作しません。 Here is an example(右下に赤い線があります)。 rect.hclust()
が生成する次元については何かが正しくないので、自分のバージョンを書くことができるように、どのように動作するのかわかりません。
edgePar
またはrect.hclust()
を正しく動作させるためのアドバイス、またはrect.hclust()
相当のものを書くことができたら助けてください。
UPDATEがこの質問をしているので、私はパラメータを計算し、rect
オブジェクトを描画する機能コードを取得するためにgetAnywhere(rect.hclust())
を使用しました。私は水平と垂直の葉を扱うためにこの関数のカスタムバージョンを書いて、それをdendrapply()
と呼んでいます。
しかし、rect
の一部を削除する何らかのクリッピングエフェクトがあります。水平の葉(木の右側に描画された葉)については、rect
の右端が消えているか、またはrect
の他の3辺の境界の幅よりも薄いです。縦の葉(木の下に描画された葉)では、rect
の一番下の辺が同じ表示問題を抱えています。
重要なクラスタをマーキングする手段として、rect
の幅を小さくして、クラスタエッジの先端と(水平)葉のラベルの間に垂直の赤い線を描くようにしています。
これはクリッピングの問題を解決しますが、クラスタのエッジの先端とリーフのラベルの間のスペースが6ピクセル程度しかないという別の問題が発生します。これにより、垂直ストライプの幅が制限されます。
より悪い問題は縦ストライプは、2つの要素の間に収まることができる場所マークx
- 座標を順番にツリー階層が終わる方法に依存し、より大きなツリー(par["usr"]
)の幅に基づいて変更されるということです構造化されている。
私は、この「x
」の値と水平のツリーの幅「rect
」を調整するための「訂正」またはより良いハックと書いています。それは常に一貫して機能するとは限りませんが、私が作っている樹木にとっては、縁やラベルに近づきすぎる(または重なり合う)ことを避けているようです。
結局のところ、より良い解決方法は、rect
を描画してクリッピングが発生しないようにすることです。または、特定のツリーのツリーエッジとラベルの間の特定のx
位置を計算して、ストライプを適切にセンタリングしてサイズを決める一貫した方法。
また、色や線のスタイルでエッジに注釈を付ける方法にも興味があります。
まあ、私はdendextendパッケージでrect.dendrogram関数を書いています。'branches_attr_by_labels'と呼ばれるラベルに基づいてブランチを着色する機能もあります。 –