Как правильно раскрасить края или нарисовать прямоугольники в R-дендрограмме?
я сгенерировал эта дендрограмма через "Р"!--3-->, 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())
чтобы получить рабочий код, который вычисляет параметры и рисует
1 ответов
Итак, вы на самом деле задали около пяти вопросов (5 +/- 3). Что касается написания собственной прямой кишки.hclust как функция, источник library/stats/R/identify.hclust.R
Если вы хотите взглянуть на него.
Я сам бросил на него быстрый взгляд и не уверен, что он делает то, что я думал, что он сделал, прочитав ваше описание-кажется, он рисует несколько прямоугольники, кроме того,x
селектор кажется жестко закодированным для разделения тегов по горизонтали (что не то ,что вы хотите, и нет y
).
Я вернусь, но тем временем вы можете (в дополнение к просмотру источника) попробовать сделать несколько рект.hclust с другой border=
цвета и разные h=
значения, чтобы увидеть, появляется ли шаблон сбоя.
обновление
мне тоже не очень повезло с этим.
одним из возможных kludge для отсечения было бы заполнить метки конечными пробелами, а затем принести край вашего прямоугольника в немного (идея заключается в том, что просто приведение прямоугольника выведет его из зоны отсечения, но перезапишет концы меток).
другой идеей было бы заполнить прямоугольник полупрозрачным (низким Альфа) цветом, сделав затененную область, а не ограничивающую рамку.