ggplot2 и ggdendro - построение цветных полос под листьями узла
В настоящее время я использую ggplot2
а также ggdendro
построить дендрограммы. Однако теперь мне нужно построить дискретную переменную под листьями вместе с метками.
Например, в публикации (Zhang et al., 2006) я увидел такую дендрограмму (обратите внимание на цветную полосу под ярлыками листьев):
Я заинтересован в том, чтобы сделать то же самое с ggdendro + ggplot2, используя данные, которые я уже обработал. Это возможно?
1 ответ
Во-первых, вам нужно сделать dataframe для цветной панели. Например я использовал данные 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()
с помощью 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))