锁定部分网格的纵横比

Lock aspect ratio on part of grid

我正在尝试编写一个函数,其中我们公司的徽标作为函数的一部分在导出时自动添加到每个图表中,在标题和副标题旁边。每个输出的尺寸将取决于当时的需要,因此不幸的是,设置尺寸不会特别有用。

为此,我生成了一系列网格以将所有内容放在一起,如下所示(使用 iris 数据集)。

library(datasets)
library(tidyverse)
library(gridExtra)
library(grid)
library(png)

m <- readPNG("Rlogo.png") # download from: https://www.r-project.org/logo/Rlogo.png

plot <- ggplot(iris, aes(x = Sepal.Length, y = Sepal.Width)) +
  geom_col() +
  ggtitle("Title goes here",
          subtitle = "subtitle down here")


txtTitle <- plot$labels$title
txtSubTitle <- plot$labels$subtitle

plot$labels$title <- NULL
plot$labels$subtitle <- NULL

buffer <- grobTree(rectGrob(gp = gpar(fill = "white", col = "white")))

Title <- grobTree(textGrob(label = txtTitle,  
                           hjust = 1, 
                           x = 0.98))
SubTitle <- textGrob(label = txtSubTitle, 
                     hjust = 1, 
                     x = 0.98)
Logo <- grobTree(rasterGrob(m, x = 0.02, hjust = 0))



TitlesGrid <- grid.arrange(Title, SubTitle, ncol = 1)
TopGrid <- grid.arrange(Logo, TitlesGrid, widths = c(1, 7), ncol = 2)
AllGrid <- grid.arrange(TopGrid, arrangeGrob(plot), heights = c(1,7))

这提供了以下不同纵横比的输出。

第一个示例的标题和副标题之间的差距很好,而第二个示例的差距太大了。我如何才能使 TopGrid 的高度固定为绝对大小,而其余部分填充到所需的大小?

网格图形有绝对单位和相对单位的概念。无论视口大小如何,绝对单位(例如 "cm"、"in"、"pt")始终保持相同的大小。相对单位(称为 "null")根据需要扩大或缩小。在常规 ggplot2 object 中,绘图面板以相对单位指定,而面板周围的各种元素(例如标题、轴刻度等)以绝对单位指定。

您使用 unit() 函数指定绝对或相对单位:

> library(grid)
> unit(1, "cm")
[1] 1cm
> unit(1, "null")
[1] 1null

在你的例子中,grid.arrangeheights 参数可以采用任意网格单位 objects,所以你只需要给顶部高度一个绝对单位:

grid.arrange(TopGrid, arrangeGrob(plot), heights = unit(c(1, 1), c("cm", "null")))