ggplot2和ggdendro - 在节点叶下绘制彩色条形图

7

目前我正在使用ggplot2ggdendro来绘制树状图。然而,现在我需要在叶子下方绘制离散变量以及标签。

例如,在一篇出版物(Zhang等人,2006)中,我看到了这样的树状图(请注意标签下方的彩色条):

Example dendrogram

我有兴趣使用已经分组的数据,通过ggdendro + ggplot2实现相同的效果。这是否可能?

1个回答

12

首先,您需要为颜色条创建数据框。例如,我使用的数据是 USArrests - 使用 hclust() 函数进行聚类并保存对象。然后,使用此聚类对象使用函数 cutree() 将其分成群集,并将其保存为列 cluster。列 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()制作的色条,其中使用states作为x值,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 的答案来 解决这个问题,以使两个绘图对齐。

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

这里输入图片描述


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接