8

R のと関数を使用して、このデンドログラムを生成しました。hclust()as.dendrogram()plot.dendrogram()

dendrapply()関数とローカル関数を使用して葉に色を付けましたが、正常に機能しています。

ノードのセット (たとえば、ツリーの右下隅にある" _+v\_stat5a\_01_" と " "のクラスター) が有意または重要かどうかを示す統計テストの結果があります。_+v\_stat5b\_01_

dendrapply()また、重要な葉を含むデンドログラム内の正確なノードを見つけるために使用できるローカル関数もあります。

私はどちらかをしたいです(例に従って):

  1. _+v\_stat5a\_01_" " と " "を結ぶエッジに色を付け_+v\_stat5b\_01_ます。また、
  2. " " と " "の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または、特定のツリーのエッジとラベルの間の特定の位置を計算する一貫した方法で、ストライプを適切に中央に配置してサイズを調整します。

色や線のスタイルでエッジに注釈を付ける方法にも非常に興味があります。

4

1 に答える 1

2

つまり、実際には約 5 つの質問をしました (5 +/- 3)。独自の rect.hclust のような関数を作成する限り、library/stats/R/identify.hclust.Rそれを見たい場合はソースが含まれています。

私はそれを自分でちらっと見ましたが、あなたの説明を読んで思ったことがうまくいくかどうかわかりません.複数の長方形を描いているようです.また、xセレクターはタグを水平に分離するためにハードコードされているようですあなたが望むものではなく、ありませんy)。

border=戻ってきますが、それまでの間、(ソースを確認することに加えて) 異なる色と異なる値で複数の rect.hclust を実行してh=、失敗パターンが発生するかどうかを確認してください。

アップデート

私もこれを突っついたことはあまりありませんでした。

クリッピングの 1 つの考えられる問題は、ラベルに末尾のスペースを埋め込んでから、長方形の端をわずかに持ってくることです (長方形を入れるだけでクリッピング ゾーンから外れますが、ラベルの端を上書きするという考えです)。 )。

もう 1 つのアイデアは、四角形を半透明 (低アルファ) の色で塗りつぶし、バウンディング ボックスではなく影付きの領域を作成することです。

于 2009-04-09T02:14:22.667 に答える