Я создаю list
из ggplot
тепловых карт, которые имеют одинаковое количество строк, но разное количество столбцов и разную длину их меток тика оси X:
plot.list <- vector(mode="list",length(3))
n.cols <- c(600,30,300)
x.labs <- c("medium","this is a long label","sh")
library(ggplot2)
for(i in 1:3){
set.seed(1)
df <- reshape2::melt(matrix(rnorm(100*n.cols[i]),100,n.cols[i],dimnames = list(paste0("G",1:100),paste0("S",1:n.cols[i]))))
plot.list[[i]] <- ggplot(data=df,mapping=aes(x=Var2,y=Var1,fill=value))+
geom_tile()+theme_minimal()+scale_fill_gradient2(name="Scaled Value",low="darkblue",mid="gray",high="darkred")+
scale_x_discrete(name=NULL,breaks=unique(df$Var2)[floor(length(unique(df$Var2))/2)],labels=x.labs[i])+
scale_y_discrete(name=NULL)+
theme(legend.position=NULL,axis.title.x=element_blank(),axis.text.x=element_text(angle=90,hjust=1,vjust=0.5))
if(i != 1) plot.list[[i]] <- plot.list[[i]]+theme(axis.text.y=element_blank())
if(i != 3) plot.list[[i]] <- plot.list[[i]]+theme(legend.position = "none")
}
Затем я хочу объединить их по горизонтали с очень маленьким полем, разделяющим их, и иметь их ширину относительно числа столбцов.
Пытаясь добиться этого, используя gridExtra
'arrangeGrob
:
gridExtra::arrangeGrob(grobs=plot.list,ncol=length(plot.list),widths=n.cols,padding=0.01)
Или с cowplot
plot_grid
:
cowplot::plot_grid(plotlist=plot.list,align="v",axis="tb",ncol=length(plot.list),rel_widths=n.cols)
дает мне:
Итак, мои вопросы:
- Как сделать так, чтобы они имели одинаковую высоту и чтобы метки оси X расширялись вниз на разную длину?
- Уменьшить расстояние между ними? Я попытался уменьшить значение
padding
, но не увидел изменений
Обратите внимание, что я знаю, что использование facet_grid
может быть очевидным способом создания этого в первую очередь, но мне специально нужно сначала создать список графиков, а только потом объединять их.