2011-11-08 19 views
11

Ho una situazione in cui sto tracciando un dendrogramma con punti dati forniti con etichette di classe. Vorrei vedere che il clustering agglomerato raggruppa quelli con la stessa etichetta insieme. La codifica a colori delle etichette facilita la lettura di questo dendrogramma. C'è un modo per raggiungere questo obiettivo con ggdendro in R?Etichettatura di foglie ggdendro in più colori

risposta

17

Rubare la maggior parte della messa a punto da this post ...

library(ggplot2) 
library(ggdendro) 
data(mtcars) 
x <- as.matrix(scale(mtcars)) 
dd.row <- as.dendrogram(hclust(dist(t(x)))) 
ddata_x <- dendro_data(dd.row) 

p2 <- ggplot(segment(ddata_x)) + 
    geom_segment(aes(x=x, y=y, xend=xend, yend=yend)) 

... e l'aggiunta di un fattore di raggruppamento ...

labs <- label(ddata_x) 
labs$group <- c(rep("Clust1", 5), rep("Clust2", 2), rep("Clust3", 4)) 
labs 
#  x y text group 
# 1 1 0 carb Clust1 
# 2 2 0 wt Clust1 
# 3 3 0 hp Clust1 
# 4 4 0 cyl Clust1 
# 5 5 0 disp Clust1 
# 6 6 0 qsec Clust2 
# 7 7 0 vs Clust2 
# 8 8 0 mpg Clust3 
# 9 9 0 drat Clust3 
# 10 10 0 am Clust3 
# 11 11 0 gear Clust3 

... si può usare l'argomento aes(colour=)-geom_text() per colorare le etichette:

p2 + geom_text(data=label(ddata_x), 
       aes(label=label, x=x, y=0, colour=labs$group)) 

enter image description here

(Se si desidera fornire i propri colori, è possibile utilizzare scale_colour_manual(), fare qualcosa di simile:

p2 + geom_text(data=label(ddata_x), 
       aes(label=label, x=x, y=0, colour=labs$group)) + 
    scale_colour_manual(values=c("blue", "orange", "darkgreen")) 
+0

Grazie! Sono relativamente nuovo a R, questo mi aiuta molto. – chet

+1

Eseguendo il codice, ottengo 2 errori: 1) in 'geom_segment', non riesce a trovare' x0' ma questo viene semplicemente corretto cambiando gli argomenti in 'x = x, y = y, xend = xend, yend = yend'; 2) in 'geom_text', dice:' Non so come selezionare automaticamente la scala per l'oggetto di tipo funzione. Defaulting to continue Errore in data.frame (x = c (1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11), y = 0, label = function (x,: argument implica numero di righe diverso: 11, 1, 0'. Come posso risolverlo? Perché ho un caso simile da trattare (es. colorare le etichette) e fornisce lo stesso errore. –

+0

@DavidePassaretti - Con l'aiuto di Andrie de Vries (** ggdendro ** 's author) e Roland (un altro SO regolare), ho modificato il codice in modo che funzioni con la versione corrente di ** ggdendro **. Grazie per l'avviso che questa risposta non era più funzionale ! –