Как правильно раскрасить края или нарисовать прямоугольники в R-дендрограмме?

я сгенерировал эта дендрограмма через "Р"!--3-->, 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()) чтобы получить рабочий код, который вычисляет параметры и рисует

1 ответов


Итак, вы на самом деле задали около пяти вопросов (5 +/- 3). Что касается написания собственной прямой кишки.hclust как функция, источник library/stats/R/identify.hclust.R Если вы хотите взглянуть на него.

Я сам бросил на него быстрый взгляд и не уверен, что он делает то, что я думал, что он сделал, прочитав ваше описание-кажется, он рисует несколько прямоугольники, кроме того,x селектор кажется жестко закодированным для разделения тегов по горизонтали (что не то ,что вы хотите, и нет y).

Я вернусь, но тем временем вы можете (в дополнение к просмотру источника) попробовать сделать несколько рект.hclust с другой border= цвета и разные h= значения, чтобы увидеть, появляется ли шаблон сбоя.

обновление

мне тоже не очень повезло с этим.

одним из возможных kludge для отсечения было бы заполнить метки конечными пробелами, а затем принести край вашего прямоугольника в немного (идея заключается в том, что просто приведение прямоугольника выведет его из зоны отсечения, но перезапишет концы меток).

другой идеей было бы заполнить прямоугольник полупрозрачным (низким Альфа) цветом, сделав затененную область, а не ограничивающую рамку.