r 덴드로 그램에서 가장자리를 올바르게 색상으로 뽑거나 드로우하는 방법은 무엇입니까?

StackOverflow https://stackoverflow.com/questions/717747

문제

나는 생성했다 이 덴드로 그램 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_"

다음과 같은 로컬 기능이 있습니다 ( "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-수직 스트라이프가 두 요소 사이에 맞을 수있는 곳에 큰 나무의 너비에 따라 변경 될 것입니다 (par["usr"]), 이는 트리 계층 구조가 어떻게 구조화되는지에 달려 있습니다.

나는 "수정"을 썼거나, 더 잘 말하면, 이것을 조정하기위한 해킹 x 가치와 rect 수평 나무의 폭. 항상 일관되게 작동하지는 않지만, 내가 만드는 나무의 경우 가장자리와 라벨에 너무 가까워 지거나 겹치는 것을 막는 것 같습니다.

궁극적으로 더 나은 수정은 rect 클리핑이 없도록. 또는 특정을 계산하는 일관된 방법 x 주어진 나무의 나무 가장자리와 레이블 사이에 위치하여 스트라이프를 올바르게 중심하고 크기를 높이십시오.

또한 색상이나 라인 스타일로 가장자리에 주석을 달 수있는 방법에 관심이 있습니다.

도움이 되었습니까?

해결책

그래서 당신은 실제로 5 가지 질문에 대해 물었습니다 (5 +/- 3). 기능과 같은 자신의 rect.hclust를 작성하는 한 소스가 library/stats/R/identify.hclust.R 당신이 그것을보고 싶다면.

나는 그것을 스스로 간단히 한 눈에 보았고 그것이 당신의 설명을 읽음으로 생각했던 일을 확실하지 않습니다. 다수의 사각형, 또한 x 셀렉터는 태그를 가로로 분리하기 위해 하드 코딩 된 것으로 보입니다 (원하는 것이 아니며 없습니다. y).

돌아올거야,하지만 그 동안 소스를 보는 것 외에도 여러 가지 rect.hclust를 시도해보십시오. border= 색상과 다른 h= 실패 패턴이 나타나는지 확인하는 값.

업데이트

나는 이것에 대해서도 많은 운이 없었다.

클리핑을위한 가능한 한 가지 Kludge는 후행 공간으로 레이블을 채우고 사각형의 가장자리를 약간으로 가져 오는 것입니다 (사각형을 가져 오는 것만으로도 클리핑 영역에서 꺼내지 만 레이블의 끝을 덮어 쓰는 아이디어입니다. ).

또 다른 아이디어는 사각형을 반투명 (낮은 알파) 색상으로 채우고 경계 상자보다는 음영 영역을 만드는 것입니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top