Jak wykreślić Dendrogram wachlarza (Polar) w R?


9

Mam na myśli coś takiego:

alternatywny tekst

sugerowany zestaw danych do pokazania rozwiązań:

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

1
Jaka jest korzyść z przedstawienia biegunowego (oprócz oszczędności miejsca)? Wydaje mi się, że trudniej jest na to patrzeć.
nico

1
@nico It is more cool (-;

1
Przydaje się również, gdy nie masz jednej łodygi ...
Tal Galili

3
@mbq: opuściłeś tam „dobrą” grę słów… mógłbyś powiedzieć „to więcej fanów ” :)
nico

Odpowiedzi:


10

W filogenetyce jest to filogram wentylatora, więc możesz go przekonwertować phyloi użyć ape:

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

Wynik:
alternatywny tekst


(+1) Szukałem tego, ale nie mogę go znaleźć w apepakiecie!
chl

Bingo Właśnie tego szukałem. Zastanawiam się, czy jest coś podobnego w ggplot2 ...
Tal Galili,

@Tal Brak oficjalnego wsparcia dla struktur drzewnych w ggplot2. Spójrz na ten wątek grupy Google, j.mp/c85l5l (ale zdecydowanie nie jest okrągły).
chl

Cześć, dziękuję za link. Odpowiem tam również w odniesieniu do tego kodu ...
Tal Galili,

5

Widziałeś ten post? http://groups.google.com/group/ggplot2/browse_thread/thread/8e1efd0e7793c1bb

Weźmy przykład, dodaj coordin_polar () i odwróć osie, a będziesz bardzo blisko:

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)Otrzymuję ten błąd: ggplot2 doesn't know how to deal with data of class phylo. czego mi brakuje?
GaBorgulya

1

Cztery lata później jestem teraz w stanie odpowiedzieć na to pytanie. Można to zrobić, łącząc dwa nowe pakiety: cyrkuluj i dendextend .

Wykres można wykonać za pomocą circlize_dendrogramfunkcji (umożliwiając znacznie bardziej wyrafinowaną kontrolę nad układem „wentylatora” funkcji 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) 

Rezultat to:

wprowadź opis zdjęcia tutaj

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.