Rmarkdown / knitr子图不同图形尺寸

时间:2020-04-03 15:38:51

标签: r r-markdown knitr

我正在尝试为Rmarkdown中的子图实现不同的高度和宽度。我希望只为fig.heightfig.width提供一个向量,因为这似乎对out.heightout.width

有用
---
title: "Untitled"
output: pdf_document
header-includes:
   - \usepackage{subfig}
---



```{r, echo = FALSE, fig.height = c(1,2,3), fig.width=c(1,1,1), fig.cap='Caption', fig.subcap=c('Subcaption 1', 'Subcaption 2', 'Subcaption 3')}
library(ggplot2)
df <- data.frame(
  x = rnorm(30),
  y = rnorm(30)
)
p1 <- p2 <- p3 <- ggplot(df, aes(x, y)) +
  geom_point()

print(p1)

print(p2)

print(p3)
```

但是,结果是这样

enter image description here

因此,似乎所有子图都使用值fig.height = 3,fig.width = 1

有人知道如何分别为每个子图指定这些值吗?

1 个答案:

答案 0 :(得分:0)

这些并不是真正的“子图”,它们只是并排的数字。因此,您可以通过输入更多内容来获得所需的内容:

```{r, echo = FALSE}
library(ggplot2)
df <- data.frame(
  x = rnorm(30),
  y = rnorm(30)
)
p1 <- p2 <- p3 <- ggplot(df, aes(x, y)) + geom_point()
```
```{r echo = FALSE, fig.height=1, fig.width=1}
print(p1)
```
```{r echo = FALSE, fig.height=2, fig.width=1}
print(p2)
```
```{r echo = FALSE, fig.height=3, fig.width=1}
print(p3)
```

您可能可以使用https://yihui.org/knitr/demo/reference/中的想法来实现此操作的自动化,但是我不确定是否值得这样做。另一种有前途的方法是使用gridExtra::grid.arrange函数,尽管我不确定它是否允许所需的布局。

在评论后添加编辑,表明需要真正的LaTeX子图:

这比较困难,因为如您所见,fig.height并未针对每个子图单独处理。我认为您可以通过增加额外的利润来获得想要的高度。要完全控制垂直居中,您需要使用YAML选项关闭图形的裁剪

output: 
  pdf_document:
    fig_crop: FALSE

使用该选项时,此代码

```{r, echo = FALSE, fig.height=3, fig.width=1,fig.subcap=c("first", "second", "third"),fig.cap="Main"}
library(ggplot2)
df <- data.frame(
  x = rnorm(30),
  y = rnorm(30)
)
p1 <- p2 <- p3 <- ggplot(df, aes(x, y)) + geom_point()
p1 + theme(plot.margin = margin(t = 1, b = 1, unit = "in") + theme_get()$plot.margin)
p2 + theme(plot.margin = margin(t = 1/2, b = 1/2, unit = "in") + theme_get()$plot.margin)
p3
```

提供以下输出:

screenshot