Comment puis-je les bords des couleurs ou dessiner rects correctement dans un R dendrogramme?

StackOverflow https://stackoverflow.com/questions/717747

Question

ce dendrogramme utilisant hclust() de R, les fonctions de as.dendrogram() et plot.dendrogram().

J'ai utilisé la fonction dendrapply() et une fonction locale de feuilles de couleur, ce qui fonctionne très bien.

Je les résultats d'un test statistique qui indiquent si un ensemble de noeuds ( par exemple le groupe de « _+v\_stat5a\_01_ » et « _+v\_stat5b\_01_ » dans le coin inférieur droit de l'arbre) sont significatifs ou importants .

J'ai aussi une fonction locale que je peux utiliser avec dendrapply() qui trouve le nœud exact dans mon dendrogramme qui contient des feuilles importantes.

Je voudrais soit (suivant l'exemple):

  1. Couleur des bords qui se rejoignent « _+v\_stat5a\_01_ » et « _+v\_stat5b\_01_ »; ou,
  2. Dessine un rect() autour "_+v\_stat5a\_01_" et "_+v\_stat5b\_01_"

J'ai la fonction locale suivante (les détails de la condition « noeuds-en-leafList-match-nœuds-en-clusterList » ne sont pas importants, mais il met en évidence des nœuds importants):

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

A partir de cette bloc if, je l'ai essayé d'appeler dendrapply(n, markEdges), mais cela ne fonctionne pas:

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

Dans mon exemple idéal, les bords de connexion « _+v\_stat5a\_01_ » et « _+v\_stat5b\_01_ » seraient brisés et d'une couleur rouge.

J'ai aussi essayé d'utiliser rect.hclust() dans ce bloc if:

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

Mais le résultat ne fonctionne pas avec dendrogrammes horizontal ( i.e.. Dendrogrammes avec des étiquettes horizontales). Voici un exemple (notez la bande rouge dans le coin inférieur droit) . Quelque chose n'est pas correct sur les dimensions de ce rect.hclust() génère, et je ne sais pas comment cela fonctionne, pour être en mesure d'écrire ma propre version.

Je vous remercie des conseils pour obtenir edgePar ou rect.hclust() pour fonctionner correctement, ou pour être en mesure d'écrire mon propre équivalent rect.hclust().

UPDATE

Depuis posant cette question, j'ai utilisé getAnywhere(rect.hclust()) pour obtenir le code fonctionnel qui calcule les paramètres et dessine l'objet rect. J'ai écrit une version personnalisée de cette fonction pour gérer les feuilles horizontales et verticales, et l'appeler avec dendrapply().

Cependant, il y a une sorte d'effet d'écrêtage qui enlève une partie de la rect. Pour les feuilles horizontales (feuilles qui sont tirés sur le côté droit de l'arbre), le bord le plus à droite de la rect disparaît ou est plus mince que la largeur de la bordure des trois autres côtés de la rect. Pour les feuilles verticales (feuilles qui sont tirés sur le bas de l'arbre), le bord inférieur de la rect souffre du même problème d'affichage.

Qu'est-ce que je l'avais fait comme un moyen de marquer d'importants groupes est de réduire la largeur de la rect telle que je rends une bande rouge verticale entre les extrémités des bords du cluster et les étiquettes des feuilles (horizontales).

Ceci élimine le problème de coupure, mais introduit un autre problème, en ce que l'espace entre les pointes de bord de cluster et les étiquettes des feuilles est seulement six ou plus pixels de large, que je n'ai pas beaucoup de contrôle sur. Cela limite la largeur de la bande verticale.

Le problème est pire que la x coordonnée que les marques où la bande verticale peut placer entre les deux éléments vont changer en fonction de la largeur de l'arbre plus grand (par["usr"]), qui à son tour dépend de la façon dont la hiérarchie de l'arborescence finit par être structuré.

J'ai écrit une « correction » ou, préférable de qualifier, un hack pour ajuster cette valeur x et la largeur de rect pour les arbres horizontaux. Il n'a pas toujours work toujours, mais pour les arbres que je fais, il semble garder de trop près (ou chevauchement) des bords et des étiquettes.

En fin de compte, une meilleure solution serait de savoir comment tirer le rect pour qu'il n'y ait pas de coupure. Ou une manière cohérente pour calculer la position de x spécifique entre les bords des arbres et des étiquettes pour un arbre donné, de manière à centrer et la taille de la bande correctement.

Je serais également très intéressé par une méthode pour les bords annoter avec des couleurs ou des styles de ligne.

Était-ce utile?

La solution

Donc, vous avez effectivement posé des questions sur cinq questions (5 +/- 3). En ce qui concerne l'écriture de votre propre rect.hclust comme fonction, la source est en library/stats/R/identify.hclust.R si vous voulez regarder.

Je pris un rapide coup d'œil à moi-même et je suis pas sûr qu'il fait ce que je pensais qu'il a fait à la lecture de votre description - il semble dessiner plusieurs rectangles, également, le sélecteur de x semble être codés en dur pour séparer les étiquettes horizontalement (ce qui est pas ce que vous voulez et il n'y a pas y).

Je serai de retour, mais en attendant, vous pourriez (en plus de regarder à la source) essayer de faire plusieurs rect.hclust avec différentes couleurs border= et différentes valeurs de h= pour voir si un modèle d'échec apparaît.

Mise à jour

Je n'ai pas eu beaucoup de chance à ce piquer soit.

Une bidouille possible pour la coupure serait de rembourrer les étiquettes avec des espaces de fin puis amener le bord de votre rectangle légèrement (l'idée étant que tout ce qui porte le rectangle obtiendrait hors de la zone de découpage, mais écraser les extrémités des étiquettes).

Une autre idée serait de remplir le rectangle avec un translucide (faible alpha) de couleur, ce qui rend une zone ombragée plutôt que d'une zone de délimitation.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top