R のと関数を使用して、このデンドログラムを生成しました。hclust()as.dendrogram()plot.dendrogram()
dendrapply()関数とローカル関数を使用して葉に色を付けましたが、正常に機能しています。
ノードのセット (たとえば、ツリーの右下隅にある" _+v\_stat5a\_01_" と " "のクラスター) が有意または重要かどうかを示す統計テストの結果があります。_+v\_stat5b\_01_
dendrapply()また、重要な葉を含むデンドログラム内の正確なノードを見つけるために使用できるローカル関数もあります。
私はどちらかをしたいです(例に従って):
_+v\_stat5a\_01_" " と " "を結ぶエッジに色を付け_+v\_stat5b\_01_ます。また、- " " と " "の
rect()周りを描く_+v\_stat5a\_01__+v\_stat5b\_01_
次のローカル関数があります (「nodes-in-leafList-match-nodes-in-clusterList」条件の詳細は重要ではありませんが、重要なノードが強調表示されます)。
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_は破線で赤色になります。
私はまたrect.hclust()、このifブロック内で使用しようとしました:
ma <- match(leafList, orderedLabels)
rect.hclust(scoreClusterObj, h = a$height, x = c(min(ma), max(ma)), border = 2)
しかし、結果は水平樹形図 (つまり、水平ラベルを持つ樹形図) では機能しません。以下に例を示します(右下隅の赤いストライプに注意してください)。生成されるものの次元について何かが正しくなくrect.hclust()、それがどのように機能するのかわかりません。自分のバージョンを書くことができます。
edgePar取得または適切に動作するためのアドバイス、または独自の同等のものrect.hclust()を作成できるようにするためのアドバイスに感謝します。rect.hclust()
アップデート
この質問をして以来、パラメーターを計算してオブジェクトgetAnywhere(rect.hclust())を描画する関数コードを取得していました。rectこの関数のカスタム バージョンを作成して、水平および垂直の葉を処理し、 で呼び出しますdendrapply()。
ただし、 の一部を削除するある種のクリッピング効果がありrectます。水平の葉 (木の右側に描かれる葉) の場合、rectいずれかの右端が消えるか、または の他の 3 つの辺の境界幅よりも細くなりrectます。垂直の葉 (ツリーの下部に描かれる葉) の場合、 の一番下の端でrect同じ表示上の問題が発生します。
rect重要なクラスターをマークする手段として行ったのは、クラスターのエッジの先端と (水平) リーフ ラベルの間に垂直の赤いストライプをレンダリングするように幅を狭めることです。
これにより、クリッピングの問題は解消されますが、別の問題が発生します。つまり、クラスター エッジの先端と葉のラベルの間のスペースが 6 ピクセル程度しかなく、あまり制御できません。これにより、縦縞の幅が制限されます。
より悪い問題は、x縦縞が 2 つの要素の間に収まる場所を示す座標が、より大きなツリー ( par["usr"]) の幅に基づいて変化することです。これは、ツリー階層が最終的にどのように構造化されるかによって異なります。
x私は「修正」、またはより適切に言えば、この値とrect水平方向の木の幅を調整するためのハックを書きました。常に一貫して機能するとは限りませんが、私が作成しているツリーでは、エッジやラベルに近づきすぎないように (またはオーバーラップさせないように) しているようです。
rect最終的には、クリッピングがないように を描画する方法を見つけた方がよいでしょう。xまたは、特定のツリーのエッジとラベルの間の特定の位置を計算する一貫した方法で、ストライプを適切に中央に配置してサイズを調整します。
色や線のスタイルでエッジに注釈を付ける方法にも非常に興味があります。