在网格化、相同大小的 ggplot2 图形之间调整 space

Adjust space between gridded, same-sized ggplot2 figures

我正在尝试将多个 ggplot2 图合并为一个 output/grid。我希望这些图(不考虑标签)大小相同。我找到了一种方法 this,但现在我想调整地块之间的 space。

例如:

在这个情节中,我想减少两个情节之间的 space 数量。我试过调整边距、删除刻度等。这已经删除了一些 space.

在这种情况下,有没有办法更好地控制绘图之间的间距调整?

library(MASS)
data(iris)
library(ggplot2)
library(grid)
library(gridExtra)

p1 <- ggplot(iris,aes(Species,Sepal.Width))+geom_violin(fill="light gray")+geom_boxplot(width=.1) +coord_flip() +
  theme(axis.title.y = element_blank()) + ylab("Sepal Width")

p2 <- ggplot(iris,aes(Species,Petal.Width))+geom_violin(fill="light gray")+geom_boxplot(width=.1) + coord_flip() +
  theme(axis.title.y = element_blank(), axis.text.y=element_blank()) + ylab("Petal Width")


p11 <- p1 + theme(plot.margin = unit(c(-0.5,-0.5,-0.5,-0.5),"mm"))
p22 <- p2 + theme(plot.margin = unit(c(-0.5,-0.5,-0.5,-0.5),"mm"),  axis.ticks.y=element_blank())


# 
# make plots the same size, even with different labels
gl <- lapply(list(p11,p22), ggplotGrob)
widths <- do.call(unit.pmax, lapply(gl, "[[", "widths"))
heights <- do.call(unit.pmax, lapply(gl, "[[", "heights"))
lg <- lapply(gl, function(g) {g$widths <- widths; g$heights <- heights; g})

# 
grid.arrange(lg[[1]],lg[[2]], ncol=2) #in gridExtra

您已将 'widths' 设置为两个图的最大值。这意味着 'Petal Widths' 图的 y 轴宽度将与 'Sepal Widths' 图的 y 轴宽度相同。

调整间距的一种方法是,首先,将两个grobs合并为一个布局,删除第二个plot的y轴和左边距:

# Your code, but using p1 and p2, not the plots with adjusted margins
gl <- lapply(list(p1, p2), ggplotGrob)
widths <- do.call(unit.pmax, lapply(gl, "[[", "widths"))
heights <- do.call(unit.pmax, lapply(gl, "[[", "heights"))
lg <- lapply(gl, function(g) {g$widths <- widths; g$heights <- heights; g})

# New code
library(gtable)
gt = cbind(lg[[1]], lg[[2]][, -(1:3)], size = "first")

然后两个plot之间剩余space的宽度可以调整:

gt$widths[5] = unit(2, "lines")

# Draw the plot
grid.newpage()
grid.draw(gt)