geom_tile 图的垂直对齐
Vertical alignment of geom_tile plots
我有来自三项不同研究的数据,我正在使用 ggplot2
的 geom_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.")
然后,我尝试使用 gridExtra
的 arrangeGrob
函数将它们放在一个图形中,我希望它们垂直对齐,但这似乎不起作用:
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
和函数 mget
:ggpubr::ggarrange(plotlist = mget(paste0("plot", 1:3)), nrow = 3, align = "v")
我有来自三项不同研究的数据,我正在使用 ggplot2
的 geom_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.")
然后,我尝试使用 gridExtra
的 arrangeGrob
函数将它们放在一个图形中,我希望它们垂直对齐,但这似乎不起作用:
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
和函数mget
:ggpubr::ggarrange(plotlist = mget(paste0("plot", 1:3)), nrow = 3, align = "v")