使用 gridExtra 时一致的绘图面板 width/height

Consistent plotting panel width/height when using gridExtra

我正在尝试使用 ggplot2 和 gridExtra 在 R 中构建一个 5 x 6 的绘图矩阵。为简单起见,我可以使用 2 x 2 矩阵和一些假数据来展示我的问题。

#Load libraries
  library(ggplot2); library(gridExtra)

#Data
  data = rbind(data.frame(x=rnorm(100,0,1),ALP='A',NUM=1),data.frame(x=rnorm(100,20000,1000),ALP='A',NUM=2),data.frame(x=rnorm(100,100,10),ALP='B',NUM=1),data.frame(x=rnorm(5000,1000),ALP='B',NUM=2))

#Ggplot2 facet_grid
  ggplot(data,aes(x=x,y=..scaled..,fill='red')) + geom_density() + facet_grid(ALP~NUM,scales='free') + guides(fill=FALSE)

结果看起来不太好,因为各个刻面标签的 x 尺度差异很大。我尝试使用 gridExtra 手动完成。

#Assemble grobs
  plt1 = ggplot(subset(data,ALP=='A'&NUM==1),aes(x=x,y=..scaled..,fill=ALP)) + geom_density() + facet_grid(.~NUM,scales='free') + guides(fill=FALSE) + theme(axis.title.x=element_blank(),axis.title.y=element_blank())
  plt2 = ggplot(subset(data,ALP=='A'&NUM==2),aes(x=x,y=..scaled..,fill=ALP)) + geom_density() + facet_grid(ALP~NUM,scales='free') + guides(fill=FALSE) + theme(axis.text.y=element_blank(),axis.ticks.y=element_blank(),axis.title.y=element_blank(),axis.title.x=element_blank())
  plt3 = ggplot(subset(data,ALP=='B'&NUM==1),aes(x=x,y=..scaled..,fill=ALP)) + geom_density() + guides(fill=FALSE) + theme(axis.title.x=element_blank(),axis.title.y=element_blank())
  plt4 = ggplot(subset(data,ALP=='B'&NUM==2),aes(x=x,y=..scaled..,fill=ALP)) + geom_density() + facet_grid(ALP~.,scales='free') + guides(fill=FALSE) + theme(axis.text.y=element_blank(),axis.ticks.y=element_blank(),axis.title.y=element_blank(),axis.title.x=element_blank())

#Plot it out
  grid.arrange(plt1,plt2,plt3,plt4,nrow=2,ncol=2,left=textGrob("scaled",rot=90,vjust=1),bottom=textGrob("x"))

我快到了,不幸的是,右上角的绘图面板 (x,y) 比其他所有面板都小。同样,左下角的绘图面板 (x,y) 比其他所有面板都大。我希望所有绘图面板 (x,y) 都相同 height/width。我找到了一些使用 gtable 的代码,但它似乎只有在 grob 没有刻面标签时才能始终如一地工作。当 rows/columns 的数量增加时,效果会更加夸张。

作为分面的替代方法,您可以使用 gtable,

plt <- lapply(list(plt1,plt2, plt3,plt4), ggplotGrob)

left <- rbind(plt[[1]], plt[[3]])
right <- rbind(plt[[2]], plt[[4]])
all <- cbind(left, right)
grid.newpage()
grid.draw(all)

此布局的面板尺寸应全部相等 (1null)。