使用 grid.arrange 指定绘图的宽度和高度
Specify widths and heights of plots with grid.arrange
我有三个地块,我尝试将它们与 grid.arrange 结合起来。最后一个图的高度应小于前两个图,所有图的宽度应相同。
一个工作示例:
p1 <- qplot(mpg, wt, data=mtcars)
p2 <- p1
p3 <- p1 + theme(axis.text.y=element_blank(), axis.title.y=element_blank())
grid.arrange(arrangeGrob(p1,p2, ncol=1, nrow=2),
arrangeGrob(p3, ncol=1, nrow=1), heights=c(4,1))
在这里,最后一个图的宽度比前两个大。在我的真实数据中,即使我将文本和标题保留在 y-axis 上,我的第三个图仍然有不同的宽度。
我尝试添加 "widths":
grid.arrange(arrangeGrob(p1,p2, ncol=1, nrow=2),
arrangeGrob(p3, ncol=1, nrow=1), heights=c(4,1), widths=c(2,1))
但它变成了两列图...
我也试过另一个密码:
p1 <- ggplotGrob(p1)
p2 <- ggplotGrob(p2)
p3 <- ggplotGrob(p3)
#
stripT <- subset(p2$layout, grepl("spacer", p2$layout$name))
p3 <- p3[-stripT$t, ]
grid.draw(rbind(p1, p2, p3, size = "first"))
我有相同的宽度,但现在我不知道如何更改高度...
好吧,有人可以帮我将高度和宽度方面结合起来形成最终图吗?
尝试 cowplot
包中的 plot_grid
:
library(ggplot2)
library(gridExtra)
library(cowplot)
p1 <- qplot(mpg, wt, data=mtcars)
p2 <- p1
p3 <- p1 + theme(axis.text.y=element_blank(), axis.title.y=element_blank())
plot_grid(p1, p2, p3, align = "v", nrow = 3, rel_heights = c(1/4, 1/4, 1/2))
对于 gtable,您需要手动设置面板的高度,
g1 <- ggplotGrob(p1)
g2 <- ggplotGrob(p2)
g3 <- ggplotGrob(p3)
library(gridExtra)
g <- rbind(g1, g2, g3)
set_panel_heights <- function(g, heights){
g$heights <- grid:::unit.list(g$heights) # hack until R 3.3 comes out
id_panels <- unique(g$layout[g$layout$name=="panel", "t"])
g$heights[id_panels] <- heights
g
}
g <- set_panel_heights(g, lapply(1:3, grid::unit, "null"))
grid::grid.draw(g)
虽然有点冗长,但这种方法比指定相对高度更通用:您可以混合各种网格单位,
grid::grid.newpage()
g <- do.call(rbind, replicate(3, ggplotGrob(ggplot()), simplify = FALSE))
g <- set_panel_heights(g, list(unit(1,"in"), unit(1,"line"), unit(1,"null")))
grid::grid.draw(g)
我有三个地块,我尝试将它们与 grid.arrange 结合起来。最后一个图的高度应小于前两个图,所有图的宽度应相同。
一个工作示例:
p1 <- qplot(mpg, wt, data=mtcars)
p2 <- p1
p3 <- p1 + theme(axis.text.y=element_blank(), axis.title.y=element_blank())
grid.arrange(arrangeGrob(p1,p2, ncol=1, nrow=2),
arrangeGrob(p3, ncol=1, nrow=1), heights=c(4,1))
在这里,最后一个图的宽度比前两个大。在我的真实数据中,即使我将文本和标题保留在 y-axis 上,我的第三个图仍然有不同的宽度。
我尝试添加 "widths":
grid.arrange(arrangeGrob(p1,p2, ncol=1, nrow=2),
arrangeGrob(p3, ncol=1, nrow=1), heights=c(4,1), widths=c(2,1))
但它变成了两列图...
我也试过另一个密码:
p1 <- ggplotGrob(p1)
p2 <- ggplotGrob(p2)
p3 <- ggplotGrob(p3)
#
stripT <- subset(p2$layout, grepl("spacer", p2$layout$name))
p3 <- p3[-stripT$t, ]
grid.draw(rbind(p1, p2, p3, size = "first"))
我有相同的宽度,但现在我不知道如何更改高度...
好吧,有人可以帮我将高度和宽度方面结合起来形成最终图吗?
尝试 cowplot
包中的 plot_grid
:
library(ggplot2)
library(gridExtra)
library(cowplot)
p1 <- qplot(mpg, wt, data=mtcars)
p2 <- p1
p3 <- p1 + theme(axis.text.y=element_blank(), axis.title.y=element_blank())
plot_grid(p1, p2, p3, align = "v", nrow = 3, rel_heights = c(1/4, 1/4, 1/2))
对于 gtable,您需要手动设置面板的高度,
g1 <- ggplotGrob(p1)
g2 <- ggplotGrob(p2)
g3 <- ggplotGrob(p3)
library(gridExtra)
g <- rbind(g1, g2, g3)
set_panel_heights <- function(g, heights){
g$heights <- grid:::unit.list(g$heights) # hack until R 3.3 comes out
id_panels <- unique(g$layout[g$layout$name=="panel", "t"])
g$heights[id_panels] <- heights
g
}
g <- set_panel_heights(g, lapply(1:3, grid::unit, "null"))
grid::grid.draw(g)
虽然有点冗长,但这种方法比指定相对高度更通用:您可以混合各种网格单位,
grid::grid.newpage()
g <- do.call(rbind, replicate(3, ggplotGrob(ggplot()), simplify = FALSE))
g <- set_panel_heights(g, list(unit(1,"in"), unit(1,"line"), unit(1,"null")))
grid::grid.draw(g)