r 덴드로 그램에서 가장자리를 올바르게 색상으로 뽑거나 드로우하는 방법은 무엇입니까?
-
23-08-2019 - |
문제
나는 생성했다 이 덴드로 그램 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_
"
다음과 같은 로컬 기능이 있습니다 ( "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는 후행 공간으로 레이블을 채우고 사각형의 가장자리를 약간으로 가져 오는 것입니다 (사각형을 가져 오는 것만으로도 클리핑 영역에서 꺼내지 만 레이블의 끝을 덮어 쓰는 아이디어입니다. ).
또 다른 아이디어는 사각형을 반투명 (낮은 알파) 색상으로 채우고 경계 상자보다는 음영 영역을 만드는 것입니다.