在网格化、相同大小的 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)
我正在尝试将多个 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)