Wie kann ich Kanten färben oder in einem R-Dendrogramm korrekt zeichnen?

8

Ich habe dieses Dendrogramm mit den Funktionen hclust() , as.dendrogram() und plot.dendrogram() von R generiert.

Ich habe die Funktion dendrapply() und eine lokale Funktion verwendet, um Blätter zu färben, was gut funktioniert.

Ich habe Ergebnisse aus einem statistischen Test, die anzeigen, ob eine Menge von Knoten ( zB der Cluster von " _+v\_stat5a\_01_ " und " _+v\_stat5b\_01_ " in der unteren rechten Ecke des Baumes) sind wichtig oder wichtig.

Ich habe auch eine lokale Funktion, die ich mit dendrapply() verwenden kann, die den exakten Knoten in meinem Dendrogramm findet, der signifikante Blätter enthält.

Ich möchte entweder (dem Beispiel folgend):

  1. Färben Sie die Kanten, die " _+v\_stat5a\_01_ " und " _+v\_stat5b\_01_ " verbinden; oder,
  2. Zeichnen Sie ein rect() um " _+v\_stat5a\_01_ " und " _+v\_stat5b\_01_ "

Ich habe die folgende lokale Funktion (die Details der Bedingung "nodes-in-leafList-match-nodes-in-clusterList" sind nicht wichtig, heben aber signifikante Knoten hervor):

%Vor%

In diesem if -Block habe ich versucht, dendrapply(n, markEdges) aufzurufen, aber das hat nicht funktioniert:

%Vor%

In meinem idealen Beispiel wären die Kanten, die " _+v\_stat5a\_01_ " und " _+v\_stat5b\_01_ " verbinden, gestrichelt und von roter Farbe.

Ich habe auch versucht, rect.hclust() in diesem if Block zu verwenden:

%Vor%

Aber das Ergebnis funktioniert nicht mit horizontalen Dendrogrammen ( d. d. Dendrogramme mit horizontalen Etiketten). Hier ist ein Beispiel (beachten Sie den roten Streifen in der unteren rechten Ecke). Irgendetwas stimmt nicht mit den Dimensionen von rect.hclust() , und ich weiß nicht, wie es funktioniert, um meine eigene Version schreiben zu können.

Ich freue mich, wenn Sie edgePar oder rect.hclust() richtig arbeiten lassen oder mein eigenes rect.hclust() -Äquivalent schreiben können.

AKTUALISIEREN

Nachdem ich diese Frage gestellt habe, habe ich getAnywhere(rect.hclust()) verwendet, um den Funktionscode zu erhalten, der die Parameter berechnet und das Objekt rect zeichnet. Ich schrieb eine benutzerdefinierte Version dieser Funktion, um horizontale und vertikale Blätter zu behandeln, und rufe sie mit dendrapply() auf.

Es gibt jedoch einen Clipping-Effekt, der einen Teil von rect entfernt. Bei horizontalen Blättern (Blätter, die auf der rechten Seite des Baums gezeichnet sind) verschwindet die rechte Kante von rect oder ist dünner als die Rahmenbreite der anderen drei Seiten von rect . Bei vertikalen Blättern (Blätter, die auf der Unterseite des Baums gezeichnet sind) leidet die unterste Kante von rect unter dem gleichen Anzeigeproblem.

Was ich getan habe, um signifikante Cluster zu markieren, ist, die Breite von rect so zu reduzieren, dass ich einen vertikalen roten Streifen zwischen den Spitzen der Clusterränder und den (horizontalen) Blattetiketten rendere.

Dies beseitigt das Clipping-Problem, bringt aber ein weiteres Problem mit sich, da der Abstand zwischen den Spitzen der Cluster-Kanten und den Blattetiketten nur sechs oder mehr Pixel breit ist, über die ich nicht viel Kontrolle habe. Dies begrenzt die Breite des vertikalen Streifens.

Das schlimmere Problem ist, dass die x -Koordinate, die angibt, wo der vertikale Streifen zwischen den beiden Elementen passen kann, sich auf der Breite des größeren Baums ( par["usr"] ) ändert, was wiederum davon abhängt, wie der Baum ist Hierarchie wird am Ende strukturiert.

Ich schrieb eine "Korrektur" oder, besser gesagt, einen Hack, um diesen x Wert und die rect Breite für horizontale Bäume anzupassen. Es funktioniert nicht immer gleich, aber für die Bäume, die ich mache, scheint es zu vermeiden, zu nah an (oder überlappende) Kanten und Beschriftungen zu kommen.

Letztlich wäre eine bessere Lösung, herauszufinden, wie rect gezeichnet wird, so dass kein Clipping auftritt. Oder eine konsistente Methode zur Berechnung der spezifischen x -Position zwischen Baumkanten und Beschriftungen für einen bestimmten Baum, um den Streifen richtig zu zentrieren und zu dimensionieren.

Ich wäre auch sehr an einer Methode interessiert, Kanten mit Farben oder Linienstilen zu kommentieren.

    
Alex Reynolds 04.04.2009, 20:21
quelle

1 Antwort

2

Sie haben also ungefähr fünf Fragen gestellt (5 +/- 3). Soweit Sie Ihre eigene Funktion rect.hclust schreiben, befindet sich die Quelle in library/stats/R/identify.hclust.R , wenn Sie sie betrachten möchten.

Ich habe selbst einen kurzen Blick darauf geworfen und bin nicht sicher, ob es das tut, was ich beim Lesen Ihrer Beschreibung dachte - es scheint, mehrere Rechtecke zu zeichnen, auch der x Selektor scheint hart codiert zu sein, um die Tags horizontal zu trennen (was nicht das ist, was Sie wollen und es gibt kein y ).

Ich komme zurück, aber in der Zwischenzeit könntest du (zusätzlich zur Quelle) versuchen, mehrere rect.hclust mit verschiedenen border= -Farben und verschiedenen h= -Werten zu machen, um zu sehen, ob ein Fehlermuster auftaucht.

Aktualisieren

Ich hatte auch nicht viel Glück dabei.

Ein möglicher Trick für das Clipping wäre, die Beschriftungen mit abschließenden Leerstellen zu füllen und dann die Kante Ihres Rechtecks ​​leicht einzubringen (die Idee wäre, dass das Rechteck nur aus der Beschneidungszone kommt, aber die Enden überschrieben werden der Etiketten).

Eine andere Idee wäre, das Rechteck mit einer transluzenten (niedrige Alpha) Farbe zu füllen, die einen schattierten Bereich statt einer Begrenzungsbox bildet.

    
MarkusQ 09.04.2009, 02:14
quelle

Tags und Links