knitr的子图或子标题?

时间:2012-09-22 18:03:27

标签: r latex knitr subfigure

是否可以使用knitr生成子图(带有相关的子标题)?这是一个最小的工作示例:

\documentclass{article}

\begin{document}

<<echo = FALSE, fig.cap = c("Some numbers.", "Some more numbers."), out.width = "0.5\\textwidth", fig.align = "center">>=

plot(1:10)
plot(30:100)

@

\end{document}

这导致标记为图1和图2的两个图,其中标题(分别)被定义。但我希望它们被标记为“图1a”和“图1b”,就像使用子标题LaTeX包一样。

我知道有一个knitr选项“fig.env”,但这并没有解决它(至少没有使用,例如,“fig.env ='subfigure'”)。这里有关于Sweave的类似帖子,但解决方案是一个不优雅的黑客:http://texblog.org/2011/12/01/sweave-subfig-controlling-figure-size-and-placement/

3 个答案:

答案 0 :(得分:33)

knitr(&gt; = v1.5)支持subfigures。您可以使用块选项fig.subcap。这是一个最小的例子。

\documentclass{article}
\usepackage{subfig}
\begin{document}

<<fig-sub, fig.cap='two plots', fig.subcap=c('one plot', 'the other one'), out.width='.49\\linewidth'>>=
plot(1:10)
plot(rnorm(10), pch=19)
@

\end{document}

subfigures in knitr

答案 1 :(得分:6)

您可以使用Latex的subcaption包。

\documentclass{article}
\usepackage{subcaption}

\begin{document}

\begin{figure}
\centering
\begin{subfigure}[b]{0.3\textwidth}
\centering
<<echo = FALSE, out.width = "0.5\\textwidth", fig.align = "center">>=
  plot(1:10)
@
\caption{text for first figure}
\label{fig:gull}
\end{subfigure}%

\begin{subfigure}[b]{0.3\textwidth}
\centering
<<echo = FALSE, out.width = "0.5\\textwidth", fig.align = "center">>=
  plot(30:100)
@
\caption{text for second figure}
\label{fig:tiger}
\end{subfigure}
\caption{Figure caption}
\end{figure}

\end{document}

enter image description here

答案 2 :(得分:4)

更新Yihui的答案,以反映过去几年Rmarkdown的变化,以及从Rnw文件的转变。

如knitr chunk options中所列,子图需要在块头中设置一些其他设置:

  • fig.subcap是子图标的列表
  • fig.ncol:子图的列数
  • out.width:数字的输出宽度。您通常会将此100%除以子列数。

子图还需要LaTeX包subfig。因此,行\usepackage{subfig}必须包含在YAML中,或者如果您使用外部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)
```

enter image description here

使用ggplot2

如果您正在绘制包含多个ggplot图的子图,可能会因为它们之间没有排列而混乱。你可能想在这里查看这篇文章,了解如何使用牛皮图来强制ggplots具有相同的尺寸。

This stackoverflow post将帮助您确保所有图表都排成一行,如下图所示:

enter image description here

为子图提供清单

将此作为子图的可能扩展分享。我喜欢使用它们的东西正在为它们提供一系列数字。也许您已经制作了一个功能,您需要在四个不同的试用组上运行,或者在四个不同的位置运行。例如,以下是英国四个城市的列表:

```{r}
locations <- c("Southampton, UK", "London, UK", "Bristol, UK", "Birmingham, 
```

然后可以在fig.sublapply中使用此列表来生成子图表列表。如果你需要运行

```{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))
  )
```

enter image description here

这使得子图非常健壮。如果我需要在额外的几个城市中运行我的模型,我需要做的就是在location列表中添加额外的值,子图的长度也相同。