ggplot2和ggdendro - 在节点叶子下绘制颜色条

Ein*_*nar 6 plot r ggplot2 ggdendro

目前我正在使用ggplot2ggdendro绘制树状图.但是现在我需要在叶子下面绘制离散变量以及标签.

例如,在一篇出版物中(Zhang et al.,2006),我看到了这样的树状图(注意叶子标签下面的颜色条):

树形图示例

我有兴趣用ggdendro + ggplot2做同样的事情,使用我已经分箱的数据.这可能吗?

Did*_*rts 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
Run Code Online (Sandbox Code Playgroud)

现在保存为对象两个图 - 树形图和颜色条,geom_tile()使用statesx值和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")
Run Code Online (Sandbox Code Playgroud)

现在你可以使用@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))
Run Code Online (Sandbox Code Playgroud)

在此输入图像描述