grid.arrange 定义宽高比时呈现不需要的填充
grid.arrange render unwanted padding when aspect ratio is defined
背景:
我尝试使用 gridExtra
包中的 grid.arrange()
函数在 R markdown pdf 输出中组合 5 个图。将纵横比锁定为 1:1.
对我来说很有意义
问题:
在一行上绘图时,这很好用。然而,当扩展到 2 行时,输出会得到一个填充,它会缩小我希望尽可能大的绘图大小。我找不到任何可以避免这种行为的设置(更改 plot.margin
不会改善)。
我在下面提供了一个最小工作示例(保存到 .Rmd 文件以使用 knitr
进行渲染),但我也附上了一些输出的屏幕转储:
图1) 如果我当时只使用 1 行,输出看起来像我想要的,但不幸的是不在同一个 arrange.grid()
命令中,因此在图之间有一个巨大的垂直 space:
图2) 将地块放在同一个 grid.arrage 内会导致填充(较小的地块)
图3) 跳过 aspect 会删除填充,但是,还有 aspect 1:1。
问题:
有什么方法可以避免这种填充行为并在同一个 arrange.grid 调用中获得多行 arrange.grids 的最大大小?
最小工作示例
---
title: "grid.arrange() padding with aspect-ratio problems"
subtitle: "a miminum working example"
output: pdf_document
fontsize: 10pt
---
```{r setup, include=FALSE}
library(knitr)
library(ggplot2)
library(gridExtra)
knitr::opts_chunk$set(echo = FALSE)
```
### Plots with maximum size, but not within the same grid.arrage-block
```{r plot_problems, echo=FALSE, warning=FALSE, message=FALSE}
plot_speed_dist <- ggplot(cars, aes(speed, dist)) +
geom_point()
aspect_1_theme <- theme_classic() + theme(aspect.ratio=1, plot.background=element_rect(fill="lightgrey"))
no_aspect_theme <- theme_classic() + theme(plot.background=element_rect(fill="lightgrey"))
grid.arrange(arrangeGrob(
plot_speed_dist + ggtitle('A', subtitle = "a") + aspect_1_theme,
plot_speed_dist + ggtitle('B', subtitle = "a") + aspect_1_theme,
plot_speed_dist + ggtitle('C', subtitle = "a") + aspect_1_theme,
nrow=1, ncol=3))
grid.arrange(arrangeGrob(
plot_speed_dist + ggtitle('D', subtitle = "d") + aspect_1_theme,
plot_speed_dist + ggtitle('E', subtitle = "e") + aspect_1_theme,
nrow=1, ncol=3))
```
### Putting plots within the same grid.arrage induces padding (smaller plots)
```{r plot_problems_2, echo=FALSE, warning=FALSE, message=FALSE}
grid.arrange(arrangeGrob(
plot_speed_dist + ggtitle('A', subtitle = "a") + aspect_1_theme,
plot_speed_dist + ggtitle('B', subtitle = "b") + aspect_1_theme,
plot_speed_dist + ggtitle('C', subtitle = "c") + aspect_1_theme,
plot_speed_dist + ggtitle('D', subtitle = "d") + aspect_1_theme,
plot_speed_dist + ggtitle('E', subtitle = "e") + aspect_1_theme,
nrow=2, ncol=3), newpage = T)
```
### Skipping aspect removes padding but, well, also aspect 1:1.
```{r plot_problems_3, echo=FALSE, warning=FALSE, message=FALSE}
grid.arrange(arrangeGrob(
plot_speed_dist + ggtitle('A', subtitle = "a") + no_aspect_theme,
plot_speed_dist + ggtitle('B', subtitle = "b") + no_aspect_theme,
plot_speed_dist + ggtitle('C', subtitle = "c") + no_aspect_theme,
plot_speed_dist + ggtitle('D', subtitle = "d") + no_aspect_theme,
plot_speed_dist + ggtitle('E', subtitle = "e") + no_aspect_theme,
nrow=2, ncol=3), newpage = T)
```
一个选项是在代码块的开头设置 fig.width
和 fig.height
。仔细研究了一下,我们发现 {r plot_problems_2, echo=FALSE, warning=FALSE, message=FALSE, fig.height=7.25, fig.width=9.8}
产生了以下情节。文字和点有点小,但也许这是您可以做出的妥协。
背景:
我尝试使用 gridExtra
包中的 grid.arrange()
函数在 R markdown pdf 输出中组合 5 个图。将纵横比锁定为 1:1.
问题:
在一行上绘图时,这很好用。然而,当扩展到 2 行时,输出会得到一个填充,它会缩小我希望尽可能大的绘图大小。我找不到任何可以避免这种行为的设置(更改 plot.margin
不会改善)。
我在下面提供了一个最小工作示例(保存到 .Rmd 文件以使用 knitr
进行渲染),但我也附上了一些输出的屏幕转储:
图1) 如果我当时只使用 1 行,输出看起来像我想要的,但不幸的是不在同一个 arrange.grid()
命令中,因此在图之间有一个巨大的垂直 space:
图2) 将地块放在同一个 grid.arrage 内会导致填充(较小的地块)
图3) 跳过 aspect 会删除填充,但是,还有 aspect 1:1。
问题: 有什么方法可以避免这种填充行为并在同一个 arrange.grid 调用中获得多行 arrange.grids 的最大大小?
最小工作示例
---
title: "grid.arrange() padding with aspect-ratio problems"
subtitle: "a miminum working example"
output: pdf_document
fontsize: 10pt
---
```{r setup, include=FALSE}
library(knitr)
library(ggplot2)
library(gridExtra)
knitr::opts_chunk$set(echo = FALSE)
```
### Plots with maximum size, but not within the same grid.arrage-block
```{r plot_problems, echo=FALSE, warning=FALSE, message=FALSE}
plot_speed_dist <- ggplot(cars, aes(speed, dist)) +
geom_point()
aspect_1_theme <- theme_classic() + theme(aspect.ratio=1, plot.background=element_rect(fill="lightgrey"))
no_aspect_theme <- theme_classic() + theme(plot.background=element_rect(fill="lightgrey"))
grid.arrange(arrangeGrob(
plot_speed_dist + ggtitle('A', subtitle = "a") + aspect_1_theme,
plot_speed_dist + ggtitle('B', subtitle = "a") + aspect_1_theme,
plot_speed_dist + ggtitle('C', subtitle = "a") + aspect_1_theme,
nrow=1, ncol=3))
grid.arrange(arrangeGrob(
plot_speed_dist + ggtitle('D', subtitle = "d") + aspect_1_theme,
plot_speed_dist + ggtitle('E', subtitle = "e") + aspect_1_theme,
nrow=1, ncol=3))
```
### Putting plots within the same grid.arrage induces padding (smaller plots)
```{r plot_problems_2, echo=FALSE, warning=FALSE, message=FALSE}
grid.arrange(arrangeGrob(
plot_speed_dist + ggtitle('A', subtitle = "a") + aspect_1_theme,
plot_speed_dist + ggtitle('B', subtitle = "b") + aspect_1_theme,
plot_speed_dist + ggtitle('C', subtitle = "c") + aspect_1_theme,
plot_speed_dist + ggtitle('D', subtitle = "d") + aspect_1_theme,
plot_speed_dist + ggtitle('E', subtitle = "e") + aspect_1_theme,
nrow=2, ncol=3), newpage = T)
```
### Skipping aspect removes padding but, well, also aspect 1:1.
```{r plot_problems_3, echo=FALSE, warning=FALSE, message=FALSE}
grid.arrange(arrangeGrob(
plot_speed_dist + ggtitle('A', subtitle = "a") + no_aspect_theme,
plot_speed_dist + ggtitle('B', subtitle = "b") + no_aspect_theme,
plot_speed_dist + ggtitle('C', subtitle = "c") + no_aspect_theme,
plot_speed_dist + ggtitle('D', subtitle = "d") + no_aspect_theme,
plot_speed_dist + ggtitle('E', subtitle = "e") + no_aspect_theme,
nrow=2, ncol=3), newpage = T)
```
一个选项是在代码块的开头设置 fig.width
和 fig.height
。仔细研究了一下,我们发现 {r plot_problems_2, echo=FALSE, warning=FALSE, message=FALSE, fig.height=7.25, fig.width=9.8}
产生了以下情节。文字和点有点小,但也许这是您可以做出的妥协。