Comment tracer un dendrogramme de ventilateur (polaire) dans R?

9

Je fais référence à quelque chose comme ça:

texte alternatif

ensemble de données suggéré pour montrer une solution:

data(mtcars)
plot(hclust(dist(mtcars)))
Tal Galili
la source
1
Quel est l'avantage d'une représentation polaire (à part économiser de l'espace)? Il me semble que c'est plus difficile à regarder.
nico
1
@nico C'est plus cool (-;
1
Il est également utile lorsque vous n'avez pas une seule tige ...
Tal Galili
3
@mbq: vous avez raté un "bon" jeu de mots là-bas ... vous auriez pu dire "c'est plus fan " :)
nico

Réponses:

10

En phylogénétique, il s'agit d'un phylogramme en éventail, vous pouvez donc le convertir phyloet utiliser ape:

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

Résultat:
texte alternatif


la source
(+1) J'ai cherché celui-ci, mais je ne le trouve pas dans le apepaquet!
chl
Bingo. Voilà ce que je cherchais. Je me demande s'il y a quelque chose de similaire dans ggplot2 ...
Tal Galili
@Tal Pas de support officiel pour les structures arborescentes dans ggplot2. Regardez ce thread de groupe Google, j.mp/c85l5l (mais ce n'est définitivement pas circulaire).
chl
Bonjour chl, merci pour le lien. J'y répondrai également en référence à ce code ...
Tal Galili
5

Avez-vous vu ce post? http://groups.google.com/group/ggplot2/browse_thread/thread/8e1efd0e7793c1bb

Prenons l'exemple, ajoutez coord_polar () et inversez les axes et vous obtenez assez proche:

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
la source
1
p <- ggplot(data=x)Je reçois cette erreur: ggplot2 doesn't know how to deal with data of class phylo. Qu'est-ce que je rate?
GaBorgulya
1

Quatre ans plus tard, je suis désormais en mesure de répondre à cette question. Cela peut être fait en combinant deux nouveaux packages: circlize et dendextend .

L'intrigue peut être réalisée à l'aide de la circlize_dendrogramfonction (permettant un contrôle beaucoup plus raffiné de la disposition "en éventail" de la fonction 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) 

Et le résultat est:

entrez la description de l'image ici

Tal Galili
la source