¿Cómo trazar un Dendrograma de ventilador (Polar) en R?

9

Me refiero a algo como esto:

texto alternativo

conjunto de datos sugerido para mostrar soluciones:

data(mtcars)
plot(hclust(dist(mtcars)))
Tal Galili
fuente
1
¿Cuál es la ventaja de una representación polar (aparte de ahorrar espacio)? Me parece que es más difícil de ver.
nico
1
@nico Es más genial (-;
1
También es útil cuando no tienes un tallo ...
Tal Galili
3
@mbq: te perdiste un "buen" juego de palabras allí ... podrías haber dicho "es más fan " :)
nico

Respuestas:

10

En filogenética, este es un filograma de abanico, por lo que puede convertirlo phyloy usar ape:

library(ape)
library(cluster) 
data(mtcars)
plot(as.phylo(hclust(dist(mtcars))),type="fan")

Resultado:
texto alternativo


fuente
(+1) ¡Busqué este, pero no lo encontré en el apepaquete!
chl
Bingo. Eso es lo que estaba buscando. Me pregunto si hay algo similar en ggplot2 ...
Tal Galili
@Tal No hay soporte oficial para estructuras de árbol en ggplot2. Mire este hilo del grupo de Google, j.mp/c85l5l (pero definitivamente no es circular).
chl
Hola chl, gracias por el enlace. También responderé allí con referencia a este código ...
Tal Galili
5

¿Viste esta publicación? http://groups.google.com/group/ggplot2/browse_thread/thread/8e1efd0e7793c1bb

Tome el ejemplo, agregue coord_polar () e invierta los ejes y se acercará bastante:

library(cluster) 
data(mtcars)
x <- as.phylo(hclust(dist(mtcars)))

p <- ggplot(data=x)
p <- p + geom_segment(aes(y=x,x=y,yend=xend,xend=yend), colour="blue",alpha=1) 
p <- p + geom_text(data=label.phylo(x), aes(x=y, y=x, label=label),family=3, size=3) + xlim(0, xlim) + coord_polar()

theme <- theme_update(  axis.text.x = theme_blank(),
                        axis.ticks = theme_blank(),
                        axis.title.x = theme_blank(),
                        axis.title.y = theme_blank(),
                        legend.position = "none"
                     )
p <- p + theme_set(theme)
print(p)
Charlotte Wickham
fuente
1
p <- ggplot(data=x)Me sale este error: ggplot2 doesn't know how to deal with data of class phylo. ¿Qué me estoy perdiendo?
GaBorgulya
1

Cuatro años después, ahora puedo responder esta pregunta. Se puede hacer combinando dos paquetes nuevos: circlize y dendextend .

La trama se puede hacer usando la circlize_dendrogramfunción (lo que permite un control mucho más refinado sobre el diseño "fan" de la función plot.phylo).

# install.packages("dendextend")
# install.packages("circlize")
library(dendextend)
library(circlize)

# create a dendrogram
hc <- hclust(dist(datasets::mtcars))
dend <- as.dendrogram(hc)

# modify the dendrogram to have some colors in the branches and labels
dend <- dend %>% 
   color_branches(k=4) %>% 
   color_labels

# plot the radial plot
par(mar = rep(0,4))
# circlize_dendrogram(dend, dend_track_height = 0.8) 
circlize_dendrogram(dend, labels_track_height = NA, dend_track_height = .4) 

Y el resultado es:

ingrese la descripción de la imagen aquí

Tal Galili
fuente