Domanda

questo dendrogramma utilizzando le funzioni hclust(), as.dendrogram() e plot.dendrogram() di R.

Ho usato la funzione dendrapply() e una funzione locale per le foglie di colore, che sta lavorando bene.

Ho i risultati di un test statistico che indicano se un insieme di nodi ( es il gruppo di "_+v\_stat5a\_01_" e "_+v\_stat5b\_01_" nell'angolo in basso a destra della struttura) sono significativi o importanti .

Ho anche una funzione locale che posso usare con dendrapply() che trova il nodo esatto nel mio dendrogramma che contiene foglie significativi.

Vorrei che (seguendo l'esempio):

  1. Colore dei bordi che si uniscono "_+v\_stat5a\_01_" e "_+v\_stat5b\_01_"; o,
  2. Disegnare un rect() intorno "_+v\_stat5a\_01_" e "_+v\_stat5b\_01_"

Ho la seguente funzione locale (i dettagli dei "nodi-in-leafList match-nodi-in-clusterList" condizione non sono importanti, ma che mette in evidenza i nodi significativi):

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

Da all'interno di questo blocco if, ho provato a chiamare dendrapply(n, markEdges), ma questo non ha funzionato:

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

Nel mio esempio ideale, i bordi di collegamento "_+v\_stat5a\_01_" e "_+v\_stat5b\_01_" sarebbe tratteggiato e di colore rosso.

Inoltre ho provato usando rect.hclust() all'interno di questo blocco if:

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

Ma il risultato non funziona con dendrogrammi orizzontali ( cioè. dendrogrammi con le etichette orizzontali). Ecco un esempio (notare la striscia rossa nell'angolo in basso a destra) . Qualcosa non è corretta circa le dimensioni di ciò che rect.hclust() genera, e non so come funziona, per essere in grado di scrivere la mia versione.

Mi rendo conto qualche consiglio per ottenere edgePar o rect.hclust() per funzionare correttamente, o per essere in grado di scrivere il mio rect.hclust() equivalente.

Aggiorna

Dal momento che questa domanda, ho usato getAnywhere(rect.hclust()) per ottenere il codice funzionale che calcola i parametri e disegna l'oggetto rect. Ho scritto una versione personalizzata di questa funzione per gestire i fogli orizzontali e verticali, e lo chiamano con dendrapply().

Tuttavia, v'è una sorta di effetto che rimuove parte del rect clipping. Per ante orizzontali (foglie che vengono disegnati sul lato destro dell'albero), il bordo destro della rect sia scompare o è più sottile della larghezza del bordo degli altri tre lati del rect. Per ante verticali (foglie che vengono disegnati sul fondo dell'albero), il bordo in basso del rect soffre lo stesso problema di visualizzazione.

quello che avevo fatto come un mezzo di marcatura cluster significativi è quello di ridurre la larghezza della rect tale che io rendo una striscia rossa verticale tra le punte dei bordi del cluster e le etichette (orizzontali) foglia.

Questo elimina il problema di clipping, ma introduce un altro problema, in quanto lo spazio tra le punte bordo cluster e le etichette foglia è solo sei o giù di lì pixel di larghezza, che non ho molto controllo su. Questo limita la larghezza della banda verticale.

Il problema peggiore è che il x coordinata che segna dove la striscia verticale può inserirsi tra i due elementi cambieranno in base alla larghezza della struttura più grande (par["usr"]), che a sua volta dipende dalla gerarchia albero finisce per essere strutturato.

ho scritto una "correzione" o, meglio Definito, un trucco per regolare questo valore x e la larghezza rect per gli alberi orizzontali. Non sempre work costantemente, ma per gli alberi che sto facendo, a quanto pare per evitare di avvicinarsi troppo (o sovrapposizione) bordi e le etichette.

In definitiva, una correzione migliore sarebbe quella di trovare il modo di disegnare la rect in modo che non v'è alcun clipping. O un modo coerente per calcolare la posizione x specifica tra archi d'albero e le etichette per un determinato albero, in modo da centrare e dimensioni la striscia in modo corretto.

Vorrei anche essere molto interessato a un metodo di annotare i bordi con i colori o stili di linea.

È stato utile?

Soluzione

Così avete in realtà chiesto di cinque domande (5 +/- 3). Per quanto riguarda la scrittura del proprio rect.hclust come la funzione, la fonte è in library/stats/R/identify.hclust.R se si vuole guardare.

Ho preso una rapida occhiata a me stesso e non sono sicuro che fa quello che ho pensato che ha fatto dalla lettura tua descrizione - sembra essere il disegno più rettangoli, inoltre, il selettore x sembra essere codificato duro per separare i tag in orizzontale (che non è ciò che si vuole e non c'è y).

Torno, ma nel frattempo si potrebbe (oltre a guardare alla fonte) prova a fare rect.hclust multiple con colori diversi border= e valori h= diversi per vedere se un modello di fallimento emerge.

Aggiorna

Non ho avuto molta fortuna frugando in questa operazione.

Una possibile kludge per il ritaglio sarebbero per riempire le etichette con spazi finali e quindi portare il bordo del rettangolo leggermente (l'idea è che solo portare il rettangolo in otterrebbe fuori della zona di ritaglio, ma sovrascrive le estremità delle etichette).

Un'altra idea sarebbe quella di riempire il rettangolo con un colore (basso alfa) traslucido, rendendo un'area ombreggiata piuttosto che un riquadro.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top