Pregunta

I generó este dendrograma usando funciones hclust(), as.dendrogram() y plot.dendrogram() de R.

He utilizado la función dendrapply() y una función local de hojas de color, que está trabajando muy bien.

Tengo los resultados de una prueba estadística que indican si un conjunto de nodos ( por ejemplo, el grupo de "_+v\_stat5a\_01_" y "_+v\_stat5b\_01_" en la esquina inferior derecha del árbol) son significativas o importantes .

También tengo una función local que puedo usar con dendrapply() que encuentra el nodo exacta en mi dendrograma que contiene hojas significativos.

Me gustaría o bien (siguiendo el ejemplo):

  1. Color de los bordes que se unen "_+v\_stat5a\_01_" y "_+v\_stat5b\_01_"; o,
  2. Haz un rect() en torno a "_+v\_stat5a\_01_" y "_+v\_stat5b\_01_"

Tengo la siguiente función local (los detalles de los "nodos-en-leafList-partido-nodos-en-clusterList" condición no son importantes, pero que pone de relieve los nodos importantes):

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

Desde dentro de este bloque if, he intentado llamar dendrapply(n, markEdges), pero esto no funcionó:

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

En mi ejemplo ideal, los bordes de conexión "_+v\_stat5a\_01_" y "_+v\_stat5b\_01_" quedarían hechas añicos y de un color rojo.

También he intentado usar rect.hclust() dentro de este bloque if:

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

Sin embargo, el resultado no funciona con dendrogramas horizontales ( es decir. dendrogramas con etiquetas horizontales). Aquí está un ejemplo (nota de la raya roja en la esquina inferior derecha) . Algo que no es correcto acerca de las dimensiones de lo que genera rect.hclust(), y no sé cómo funciona, para poder escribir mi propia versión.

Agradezco cualquier consejo para conseguir edgePar o rect.hclust() funcione correctamente, o para ser capaz de escribir mi propia rect.hclust() equivalente.

Actualizar

Desde hace esta pregunta, he usado getAnywhere(rect.hclust()) para obtener el código funcional que calcula los parámetros y dibuja el objeto rect. Escribí una versión personalizada de esta función para manejar hojas horizontales y verticales, y lo llaman con dendrapply().

Sin embargo, hay algún tipo de efecto que elimina parte de la rect recorte. Para hojas horizontal (hojas que se dibujan en el lado derecho del árbol), el borde más a la derecha de la rect o bien desaparece o es más delgada que la anchura del borde de los otros tres lados de la rect. Para hojas verticales (hojas que se dibujan en la parte inferior del árbol), el borde más inferior de la rect sufre el mismo problema de visualización.

¿Qué había hecho como un medio de marcado importantes agrupaciones es reducir la anchura de la rect tal que me hacen una raya roja vertical entre las puntas de los bordes de racimo y los (horizontal) la hoja de etiquetas.

Esto elimina el problema de la saturación, pero introduce otro problema, porque el espacio entre las puntas de los bordes racimo y las etiquetas de la hoja es de sólo seis o menos píxeles de ancho, lo cual no tiene mucho control sobre. Esto limita la anchura de la raya vertical.

El peor problema es que el x coordenada que las marcas en la franja vertical puede caber entre los dos elementos cambiarán en función de la anchura del árbol más grande (par["usr"]), que a su vez depende de la forma en la jerarquía del árbol termina siendo estructurado.

Me escribió una "corrección" o, mejor llamarla, un truco para ajustar este valor x y el ancho rect para árboles horizontales. No lo hace siempre work constantemente, pero para los árboles que estoy haciendo, parece que para evitar quedar demasiado cerca (o superposición) bordes y etiquetas.

En última instancia, una solución mejor sería encontrar la manera de dibujar el rect por lo que no hay recorte. O una manera coherente para calcular la posición específica en x entre los bordes del árbol y etiquetas para un árbol dado, con el fin de centrar y el tamaño de la franja correctamente.

También estaría muy interesado en un método para anotar bordes con colores o estilos de línea.

¿Fue útil?

Solución

Así que ha hecho preguntará sobre cinco preguntas (5 +/- 3). En cuanto a la escritura de su propia rect.hclust como función, la fuente está en library/stats/R/identify.hclust.R si quieres mirarlo.

Me tomó un vistazo rápido a mí mismo y no estoy seguro de que hace lo que pensé que lo hizo a partir de la lectura de su descripción - parece estar llegando múltiple rectángulos, también, el selector x parece codificarse difícil separar las etiquetas horizontalmente (que no es lo que quiere y no hay y).

Vuelvo, pero mientras tanto se podría (además de buscar en la fuente) trate de hacer rect.hclust múltiple con diferentes colores y diferentes valores border= h= para ver si surge un patrón de falla.

Actualizar

No he tenido mucha suerte hurgando en esto tampoco.

Una posible kludge para el recorte sería de relleno de las etiquetas con espacios a la derecha y luego llevar el borde de su rectángulo en un poco (la idea de que solo con lo que el rectángulo en lo conseguiría salir de la zona de recorte, pero sobrescribir los extremos de las etiquetas).

Otra idea sería para llenar el rectángulo con un color translúcido (bajo alpha), haciendo un área sombreada en lugar de un cuadro delimitador.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top