Pergunta

Eu gerado este dendrograma usando funções hclust(), as.dendrogram() e plot.dendrogram() de R.

Eu usei a função dendrapply() e uma função local para folhas de cor, o que está funcionando bem.

Eu tenho os resultados de um teste estatístico que indicam se um conjunto de nós ( ex do cluster de "_+v\_stat5a\_01_" e "_+v\_stat5b\_01_" no canto inferior direito da árvore) são significativos ou importantes .

Eu também tenho uma função local que eu possa usar com dendrapply() que encontra o nó exata no meu dendrograma que contém folhas significativas.

Gostaria de qualquer um (seguindo o exemplo):

  1. Cor das bordas que se juntam "_+v\_stat5a\_01_" e "_+v\_stat5b\_01_"; ou,
  2. Desenhe uma rect() em torno de "_+v\_stat5a\_01_" e "_+v\_stat5b\_01_"

Eu tenho a seguinte função local (os detalhes dos "nós-em-leafList-match-nós-em-clusterList" condição não são importantes, mas que destaca os nós significativos):

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
       }
     }
  }
}

De dentro deste bloco if, eu tentei chamar dendrapply(n, markEdges), mas isso não funcionou:

markEdges <<- function (n) {
  a <- attributes(n)
  attr(n, "edgePar") <- c(a$edgePar, list(lty=3, col="red"))
}

No meu exemplo ideal, as margens de ligação "_+v\_stat5a\_01_" e "_+v\_stat5b\_01_" seriam frustradas e de uma cor vermelha.

Eu também tentei usando rect.hclust() dentro deste bloco if:

ma <- match(leafList, orderedLabels)  
rect.hclust(scoreClusterObj, h = a$height, x = c(min(ma), max(ma)), border = 2)

Mas o resultado não funciona com dendrogramas horizontais ( i. dendrogramas com rótulos horizontais). Aqui está um exemplo (observe a faixa vermelha no canto inferior direito) . Alguma coisa não está correta sobre as dimensões do que rect.hclust() gera, e eu não sei como ele funciona, para ser capaz de escrever a minha própria versão.

Eu aprecio qualquer conselho para obter edgePar ou rect.hclust() ao trabalho corretamente, ou para ser capaz de escrever meu próprio rect.hclust() equivalente.

Atualizar

Uma vez que esta pergunta, eu usei getAnywhere(rect.hclust()) para obter o código funcional que os parâmetros calcula e desenha o objeto rect. Eu escrevi uma versão personalizada desta função para lidar com folhas horizontais e verticais, e chamá-lo com dendrapply().

No entanto, existe algum tipo de recorte efeito que remove parte do rect. Para folhas horizontais (folhas que são desenhadas no lado direito da árvore), a extremidade mais à direita do rect desaparece ou é mais fino do que a largura da borda dos outros três lados do rect. Para folhas verticais (folhas que são desenhados na parte inferior da árvore), a borda mais inferior do rect sofre o mesmo problema de exibição.

O que tinham feito como um meio de marcação aglomerados significativas é reduzir a largura da rect tal que rende uma faixa vermelha vertical entre as pontas das extremidades de fragmentação e as etiquetas (horizontal) da folha.

Isso elimina a emissão de recorte, mas introduz um outro problema, em que o espaço entre as pontas de ponta cluster e os rótulos folha é de apenas seis ou menos pixels de largura, que eu não tenho muito controle sobre. Isto limita a largura da faixa vertical.

O pior problema é que o x coordenada que as marcas de onde a faixa vertical podem caber entre os dois elementos irão mudar de acordo com a largura da árvore maior (par["usr"]), que por sua vez depende de como as extremidades hierarquia de árvore por ser estruturada.

Eu escrevi uma "correção", ou melhor denominado, um hack para ajustar este valor x ea largura rect para árvores horizontais. Nem sempre woRK de forma consistente, mas para as árvores que estou fazendo, parece para não ficar muito perto (ou sobreposição) bordas e etiquetas.

Em última análise, uma solução melhor seria descobrir como desenhar o rect de modo que não há nenhum corte. Ou uma maneira consistente para calcular a posição específica x entre bordas de árvores e etiquetas para qualquer árvore, a fim de centralizar e dimensionar a faixa corretamente.

Eu também seria muito interessado em um método para anotar bordas com cores ou estilos de linha.

Foi útil?

Solução

Assim que você realmente perguntou sobre cinco perguntas (5 +/- 3). Tanto quanto escrever o seu próprio rect.hclust como função, a fonte está em library/stats/R/identify.hclust.R se você quiser olhar para ele.

Eu levei um rápido olhar para ele próprio e não estou certo de que ele faz o que eu pensei que fez da leitura de sua descrição - parece estar chegando múltipla retângulos, também, o seletor x parece ser codificado para separar as etiquetas na horizontal (o que não é o que você quer e não há y).

Eu vou estar de volta, mas, entretanto, você pode (para além de olhar para a fonte) tentar fazer múltipla rect.hclust com diferentes cores border= e diferentes valores h= para ver se um padrão de falha emerge.

Atualizar

Eu não tive muita sorte cutucando neste também.

Uma possível kludge para o recorte seria para preencher as etiquetas com espaços à direita e, em seguida, trazer a borda do seu rectângulo ligeiramente (a idéia de que apenas trazendo o retângulo em que tirá-lo da zona de recorte, mas substituir as extremidades das etiquetas).

Outra idéia seria a de preencher o retângulo com uma cor translúcida (baixo alfa), fazendo uma área sombreada, em vez de uma caixa delimitadora.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top