現在、樹状図をプロットするためにggplot2
とを使用しています。ggdendro
しかし今、ラベルとともに葉の下に離散変数をプロットする必要があります。
たとえば、ある出版物 (Zhang et al., 2006) で、次のような系統樹を見ました (葉のラベルの下にあるカラー バーに注目してください)。
すでにビニングしたデータを使用して、ggdendro + ggplot2 で同じことを行うことに興味があります。これは可能ですか?
まず、カラーバーのデータフレームを作成する必要があります。たとえば、データを使用し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
オブジェクトとして 2 つのプロットを保存します。デンドログラムとカラーバーは、x 値と色数としてgeom_tile()
使用して作成されます。すべての軸を削除するためにフォーマットが行われます。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 の回答を使用して、両方のプロットを揃えることができます。
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))