2009-04-04 23 views
8

Rはhclust(),as.dendrogram()およびplot.dendrogram()の関数を使用してthis dendrogramを生成しました。Rのデンドログラムでは、エッジの色を付けたり、矩形を正しく描くにはどうしたらいいですか?

私はdendrapply()関数を使用してローカルな関数を使って葉を色づけしました。これは問題なく動作しています。

Iは、(ツリーの右下隅に「_+v\_stat5a\_01_」の例えばクラスタと「_+v\_stat5b\_01_」)ノードのセットかどうかを示す統計的検定の結果を持っているが重要または重要です。

私はdendrapply()と一緒に使用できるローカル関数を持っています。これは、重要な葉を含む私の樹形図の正確なノードを見つけます。

Iは、(次の例)たい:

  1. カラー "_+v\_stat5a\_01_" 及び "_+v\_stat5b\_01_" に参加エッジ。または、
  2. 私は次のローカル機能(「ノード・イン・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位置を計算して、ストライプを適切にセンタリングしてサイズを決める一貫した方法。

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

+0

まあ、私はdendextendパッケージでrect.dendrogram関数を書いています。'branches_attr_by_labels'と呼ばれるラベルに基づいてブランチを着色する機能もあります。 –

答えて

2

実際に5つの質問(5 +/- 3)を聞いたことがあります。あなた自身のrect.hclustのような関数を書く限り、ソースはlibrary/stats/R/identify.hclust.Rにあります。

が、私はそれを自分自身をチラッを取って、それは私はそれはあなたの説明を読んでからやったと思った何がわからない - それは 複数四角形を描画しているようだ、また、 xセレクタはハードにコーディングされているように見えますタグを水平に分離します(これはあなたが望むものではなく、 yはありません)。

私は戻ってきますが、その間に、異なったborder=の色と異なるh=の値を持つrect.hclustを複数試して、失敗パターンが現れるかどうか試してみてください。

更新

私はこのいずれかで突っつい多くの幸運を持っていませんでした。

クリッピングの可能性のある1つの原因は、ラベルに後続のスペースを埋め込み、長方形のエッジをわずかに持ち上げることです(四角形を取り込むだけで、クリッピングゾーンから外に出て、ラベルの端)。

もう1つの考え方は、四角形を半透明(低アルファ)の色で塗りつぶし、境界ボックスではなく陰影の付いた領域にすることです。

関連する問題