geom_tile 图的垂直对齐

Vertical alignment of geom_tile plots

我有来自三项不同研究的数据,我正在使用 ggplot2geom_tile 绘制这些数据。这些列是 category - 绘制在 y 轴上,x - x 轴,以及 score - 将对图块进行颜色编码。 study 列指定了研究。

数据如下:

library(dplyr)
set.seed(1)
df <- data.frame(category=strsplit("Peptide,Amino Acid,Nucleotide,Xenobiotics,Carbohydrate,Cofactors and Vitamins,Lipid,Lysophospholipid,Gamma-glutamyl Amino Acid,Leucine  Isoleucine and Valine Metabolism,Fatty Acid  Dicarboxylate,Long Chain Fatty Acid,Sterol,Secondary Bile Acid Metabolism,Polyunsaturated Fatty Acid (n3 and n6),Other Tentative Assignments,Energy,Cofactors And Vitamins,Sulfur Metabolism,Amino Acids,Carnitine And Fatty Acid Metabolsim,Glycerophospholipid Biosynthesis,Stimulating/Exogenous Compounds,Carboxylic Acid,Bile Acids,Gamma-Glutamyls,Arachidonate Metabolism,Gsh Homeostasis,Medium Chain Fatty Acid,Urea cycle; Arginine and Proline Metabolism",split=",")[[1]],
                 x=rep("x",30),score=log10(runif(30,0,1)),study=c(rep("study1",12),rep("study2",10),rep("study3",8)),stringsAsFactors = F)

我使用 geom_tile 分别绘制每项研究,但将 geom_tile 中的 width 参数定义为所有三个图的 0.5:

library(ggplot2)
plot1 <- ggplot(data=df %>% dplyr::filter(study == "study1"),aes(x=x,y=category))+geom_tile(aes(fill=score),width=0.5)+
  scale_fill_gradient2(low='darkblue',mid='white',high='darkred')+
  theme_minimal()+xlab("")+labs(fill="score")+ylab("Pathway")+
  theme(axis.text.x=element_blank(),plot.title=element_text(size=16,hjust=0,face="bold"),axis.title=element_text(size=18,face="bold"),axis.text=element_text(size=16),legend.text=element_text(size=16),legend.title=element_text(size=16,face="bold"))+ggtitle("A.")

plot2 <- ggplot(data=df %>% dplyr::filter(study == "study2"),aes(x=x,y=category))+geom_tile(aes(fill=score),width=0.5)+
  scale_fill_gradient2(low='darkblue',mid='white',high='darkred')+
  theme_minimal()+xlab("")+labs(fill="score")+ylab("Pathway")+
  theme(axis.text.x=element_blank(),plot.title=element_text(size=16,hjust=0,face="bold"),axis.title=element_text(size=18,face="bold"),axis.text=element_text(size=16),legend.text=element_text(size=16),legend.title=element_text(size=16,face="bold"))+ggtitle("B.")

plot3 <- ggplot(data=df %>% dplyr::filter(study == "study3"),aes(x=x,y=category))+geom_tile(aes(fill=score),width=0.5)+
  scale_fill_gradient2(low='darkblue',mid='white',high='darkred')+
  theme_minimal()+xlab("")+labs(fill="score")+ylab("Pathway")+
  theme(axis.text.x=element_blank(),plot.title=element_text(size=16,hjust=0,face="bold"),axis.title=element_text(size=18,face="bold"),axis.text=element_text(size=16),legend.text=element_text(size=16),legend.title=element_text(size=16,face="bold"))+ggtitle("C.")

然后,我尝试使用 gridExtraarrangeGrob 函数将它们放在一个图形中,我希望它们垂直对齐,但这似乎不起作用:

library(gridExtra)

combined.plot <- gridExtra::arrangeGrob(grobs=list(plot1,plot2,plot3),ncol=1,nrow=3)

因为这是我得到的:

所以我的问题是如何创建一个图,其中三个图的图块宽度完全相同且垂直对齐(即,图块对齐而不是长类别文本)。

您可以使用包 ggpubr:

中的函数 ggarrange
ggpubr::ggarrange(plot1, plot2, plot3, nrow = 3, align = "v")

PS:

  • 使用 egg::ggarrange 可以获得类似的结果,但是对于图 B 而言它未对齐 y-lab(未添加白色 space):egg::ggarrange(plot1, plot2, plot3)
  • 不要输入所有图表,您可以使用参数 plotlist 和函数 mgetggpubr::ggarrange(plotlist = mget(paste0("plot", 1:3)), nrow = 3, align = "v")