Субфигуры или субтитры с knitr?

Можно ли создать подфигуры (с соответствующими подзаголовками), используя 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 ответа

Решение

knitr (>= v1.5) поддерживает подфигуры. Вы можете использовать опцию чанка 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}

подфигуры в knitr

Обновление ответа от Yihui, чтобы отразить изменения в Rmarkdown за последние несколько лет, а также отход от файлов Rnw.

Как указано в параметрах блока knitr, для подфигур требуется несколько дополнительных настроек в заголовке блока:

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

Использование с ggplot2

Если вы строите подфигуры, которые содержат несколько графиков ggplot, это может привести к путанице, так как они не располагаются между графиками. Вы можете проверить этот пост здесь о том, как использовать cowplot, чтобы заставить ggplots иметь одинаковые размеры.

Эта запись в стеке поможет вам убедиться, что все графики выстроены в линию, как показано на рисунке ниже:

Предоставление списка подфигурам

Просто делюсь этим как возможным расширением подфигур. Что-то, для чего я люблю их использовать - это кормить их списком фигур. Возможно, вы создали функцию, которую нужно запускать в четырех разных пробных группах или в четырех разных местах. Например, вот список из четырех городов в Великобритании:

```{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 список и под рисунки будут одинаковой длины.

Вы можете использовать пакет субтитров Latex.

\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}

Другие вопросы по тегам