9
votes
$\begingroup$

I'm referring to something like this:

alt text

suggested dataset for showing a solutions:

data(mtcars)
plot(hclust(dist(mtcars)))
$\endgroup$
  • 1
    $\begingroup$ What is the advantage of a polar representation (aside from saving space)? It looks to me like it is trickier to look at. $\endgroup$ – nico Oct 29 '10 at 9:56
  • 1
    $\begingroup$ @nico It is more cool (-; $\endgroup$ – user88 Oct 29 '10 at 10:08
  • 1
    $\begingroup$ It is also useful when you don't have one stem... $\endgroup$ – Tal Galili Oct 29 '10 at 10:29
  • 3
    $\begingroup$ @mbq: you missed a "good" pun there... you could have said "it's more fan" :) $\endgroup$ – nico Oct 30 '10 at 8:22
10
votes
$\begingroup$

In phylogenetics, this is a fan phylogram, so you can convert this to phylo and use ape:

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

Result:
alt text

$\endgroup$
  • $\begingroup$ (+1) I looked for this one, but cannot found it in the ape package! $\endgroup$ – chl Oct 29 '10 at 9:56
  • $\begingroup$ Bingo. That's what I was looking for. I wonder if there is something similar in ggplot2... $\endgroup$ – Tal Galili Oct 29 '10 at 10:33
  • $\begingroup$ @Tal No official support for tree structures in ggplot2. Look at this Google group thread, j.mp/c85l5l (but it's definitively not circular). $\endgroup$ – chl Oct 30 '10 at 12:52
  • $\begingroup$ Hello chl, thank you for the link. I'll respond there with reference to this code as well... $\endgroup$ – Tal Galili Oct 30 '10 at 23:16
5
votes
$\begingroup$

Did you see this post? http://groups.google.com/group/ggplot2/browse_thread/thread/8e1efd0e7793c1bb

Take the example, add coord_polar() and reverse the axes and you get pretty close:

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)
$\endgroup$
  • 1
    $\begingroup$ p <- ggplot(data=x) I get this error: ggplot2 doesn't know how to deal with data of class phylo. What am I missing? $\endgroup$ – GaBorgulya Apr 14 '11 at 23:42
1
vote
$\begingroup$

Four years later, I am now able to answer this question. It can be done by combining two new packages: circlize and dendextend.

The plot can be made using the circlize_dendrogram function (allowing for a much more refined control over the "fan" layout of the plot.phylo function).

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

And the result is:

enter image description here

$\endgroup$

Not the answer you're looking for? Browse other questions tagged or ask your own question.