目前,我正在使用ggplot2
和ggdendro
来绘制树状图。然而,现在我需要在叶子下面绘制离散变量以及标签。
例如,在一份出版物中(Zhang et al。,2006),我看到了这样的树状图(注意叶子标签下面的颜色条):
我有兴趣用ggdendro + ggplot2做同样的事情,使用我已经分箱的数据。这可能吗?
答案 0 :(得分:9)
首先,您需要为颜色条创建数据框。例如,我使用数据USArrests
- 使用hclust()
函数进行聚类并保存对象。然后使用此聚类对象使用函数cutree()
将其划分为集群并保存为列集群。列states
包含群集对象hc
的标签,此对象的级别与hc
的输出中的级别相同。
library(ggdendro)
library(ggplot2)
hc <- hclust(dist(USArrests), "ave")
df2<-data.frame(cluster=cutree(hc,6),states=factor(hc$labels,levels=hc$labels[hc$order]))
head(df2)
cluster states
Alabama 1 Alabama
Alaska 1 Alaska
Arizona 1 Arizona
Arkansas 2 Arkansas
California 1 California
Colorado 2 Colorado
现在将两个图保存为对象 - 使用geom_tile()
作为x值和states
颜色编号的cluster
生成的树形图和颜色条。完成格式化以删除所有轴。
p1<-ggdendrogram(hc, rotate=FALSE)
p2<-ggplot(df2,aes(states,y=1,fill=factor(cluster)))+geom_tile()+
scale_y_continuous(expand=c(0,0))+
theme(axis.title=element_blank(),
axis.ticks=element_blank(),
axis.text=element_blank(),
legend.position="none")
现在您可以使用@Baptiste的答案this question来对齐两个图。
library(gridExtra)
gp1<-ggplotGrob(p1)
gp2<-ggplotGrob(p2)
maxWidth = grid::unit.pmax(gp1$widths[2:5], gp2$widths[2:5])
gp1$widths[2:5] <- as.list(maxWidth)
gp2$widths[2:5] <- as.list(maxWidth)
grid.arrange(gp1, gp2, ncol=1,heights=c(4/5,1/5))