根据Yihui的答案并反映Rmarkdown在过去几年中的变化,以及远离Rnw文件。
如在knitr 块选项中列出的那样,子图需要在块头中设置一些附加设置:
fig.subcap
是子图标题的列表
fig.ncol
: 子图的列数
out.width
: 图片的输出宽度。通常将此设置为 100% 除以子列数。
子图还需要LaTeX包subfig
。因此,在YAML中必须包含行\usepackage{subfig}
,或者如果您正在使用外部tex模板,则可以将其添加到该文件中。
以下是基本模板:
---
output: pdf_document
header-includes:
- \usepackage{subfig}
---
```{r fig-sub, fig.cap='two plots', fig.subcap=c('one plot', 'the other one'), out.width='.49\\linewidth', fig.asp=1, fig.ncol = 2}
plot(1:10)
plot(rnorm(10), pch=19)
```
与ggplot2一起使用
如果你正在绘制包含多个ggplot图的子图,它们可能会很混乱,因为它们在各个图中不对齐。你可能想查看这篇文章,了解如何使用cowplot强制ggplots具有相同的尺寸。
这篇stackoverflow帖子将帮助你确保所有图像都像下面的图像一样对齐:
提供子图列表
我只是想分享一个子图的可能扩展性。我喜欢用它们来处理图形列表。也许你已经编写了一个需要在四个不同试验组或四个不同位置上运行的函数。例如,这里是英国的四个城市的列表:
```{r}
locations <- c("Southampton, UK", "London, UK", "Bristol, UK", "Birmingham,
```
可以使用fig.sub
和lapply
生成子图列表。需要运行的话,就可以使用此列表。
```{r fig-sub-2, fig.cap='A collection of maps', fig.subcap= locations, out.width='.49\\linewidth', fig.asp=1, fig.ncol = 2}
library(ggmap)
lapply(locations, function(x)
ggmap(get_map(x))
)
```
这使得子图非常健壮。如果我需要在额外的几个城市运行我的模型,我只需要将额外的值添加到location
列表中,子图的长度将保持不变。
knit_hooks$set(plot = function(x, options) {...})
重新定义“plot”钩子,并以任何您想要的方式排列图形。唯一的问题是可能需要一段时间才能理解内部结构:https://github.com/yihui/knitr/blob/master/R/hooks-latex.R 对于我来说,支持子图似乎是一个不错的主意,您可以在这里提出功能请求:https://github.com/yihui/knitr/issues 谢谢! - Yihui Xie