Wie zeichne ich ein Fan (Polar) Dendrogramm in R?


9

Ich beziehe mich auf so etwas:

Alt-Text

Vorgeschlagener Datensatz zum Anzeigen einer Lösung:

data(mtcars)
plot(hclust(dist(mtcars)))

1
Was ist der Vorteil einer polaren Darstellung (abgesehen von Platzersparnis)? Es sieht für mich schwieriger aus, es anzusehen.
Nico

1
@nico Es ist cooler (-;

1
Es ist auch nützlich, wenn Sie keinen Stamm haben ...
Tal Galili

3
@mbq: du hast dort ein "gutes" Wortspiel verpasst ... du hättest sagen können "es ist mehr Fan " :)
nico

Antworten:


10

In der Phylogenetik ist dies ein Fan-Phylogramm, sodass Sie dieses konvertieren phylound verwenden können ape:

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

Ergebnis:
Alt-Text


(+1) Ich habe nach diesem gesucht, kann ihn aber nicht im apePaket finden!
Chl

Bingo. Das habe ich gesucht. Ich frage mich, ob es etwas Ähnliches in ggplot2 gibt ...
Tal Galili

@Tal Keine offizielle Unterstützung für Baumstrukturen in ggplot2. Schauen Sie sich diesen Google-Gruppenthread an, j.mp/c85l5l (aber er ist definitiv nicht kreisförmig).
Chl

Hallo chl, danke für den Link. Ich werde dort auch mit Bezug auf diesen Code antworten ...
Tal Galili

5

Hast du diesen Beitrag gesehen? http://groups.google.com/group/ggplot2/browse_thread/thread/8e1efd0e7793c1bb

Nehmen Sie das Beispiel, fügen Sie coord_polar () hinzu und kehren Sie die Achsen um, und Sie kommen ziemlich nahe:

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)

1
p <- ggplot(data=x)Ich erhalte diesen Fehler : ggplot2 doesn't know how to deal with data of class phylo. Was vermisse ich?
GaBorgulya

1

Vier Jahre später kann ich diese Frage nun beantworten. Dies kann durch Kombinieren von zwei neuen Paketen erfolgen: circlize und dendextend .

Der Plot kann mit der circlize_dendrogramFunktion erstellt werden (was eine wesentlich genauere Steuerung des "Fan" -Layouts der Funktion plot.phylo ermöglicht).

# 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) 

Und das Ergebnis ist:

Geben Sie hier die Bildbeschreibung ein

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.