Как построить веерную (полярную) дендрограмму в R?


9

Я имею в виду что-то вроде этого:

альтернативный текст

Предлагаемый набор данных для показа решений:

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

1
В чем преимущество полярного представления (помимо экономии места)? Мне кажется, что на это сложнее смотреть.
Нико

1
@nico Это круче (-;

1
Это также полезно, когда у вас нет одного стебля ...
Тал Галили

3
@mbq: ты пропустил "хороший" каламбур там ... ты мог бы сказать "это больше фанат " :)
Нико

Ответы:


10

В филогенетике это филограмма фанатов, так что вы можете преобразовать это в phyloи использовать ape:

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

Результат:
альтернативный текст


(+1) Я искал это, но не могу найти его в apeпакете!
ЧЛ

Бинго. Это то, что я искал. Интересно, есть ли что-то подобное в ggplot2 ...
Тал Галили

@Tal Официальной поддержки древовидных структур в ggplot2 нет. Посмотрите на эту ветку группы Google, j.mp/c85l5l (но она определенно не круговая).
ЧЛ

Привет чл, спасибо за ссылку. Я отвечу там также со ссылкой на этот код ...
Тал Галили

5

Вы видели этот пост? http://groups.google.com/group/ggplot2/browse_thread/thread/8e1efd0e7793c1bb

Возьмите пример, добавьтеordin_polar () и переверните оси, и вы получите довольно близко:

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)Я получаю эту ошибку: ggplot2 doesn't know how to deal with data of class phylo. Что мне не хватает?
ГаБоргуля,

1

Четыре года спустя я теперь могу ответить на этот вопрос. Это может быть сделано путем объединения двух новых пакетов: circlize и dendextend .

Сюжет может быть создан с помощью circlize_dendrogramфункции (позволяющей значительно улучшить контроль над «веерным» макетом функции 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) 

И результат:

введите описание изображения здесь

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.