Подрисунки или подзаголовки с вязкой?

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

Я знаю, что есть опции для вязания "fig.env", но это не решает проблему (по крайней мере, не используя, например, "fig.env = 'subfigure'"). Здесь есть аналогичный пост о Sweave, но решение представляет собой неэлегантный хак: http://texblog.org/2011/12/01/sweave-subfig-controlling-figure-size-and-placement/


person dynamo    schedule 22.09.2012    source источник
comment
Это вполне возможно в Knitr, потому что вы можете переопределить крючок plot на knit_hooks$set(plot = function(x, options) {...}) и расположить графики так, как вам хочется. Единственная проблема заключается в том, что вам может потребоваться некоторое время, чтобы понять внутренности: github.com/yihui/knitr/blob/master/R/hooks-latex.R Мне кажется хорошей идеей поддерживать внутренние субфигуры, и вы можете отправить запрос на добавление функции здесь: github.com/yihui/knitr/issues Спасибо!   -  person Yihui Xie    schedule 23.09.2012
comment
Прохладный! Функция была запрошена на github — и я вижу, что вы уже приняли вызов.   -  person dynamo    schedule 01.10.2012
comment
Запрос конкретной функции: github.com/yihui/knitr/issues/388   -  person Brian Diggs    schedule 18.10.2012


Ответы (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}

субфигуры в вязании

person Yihui Xie    schedule 02.12.2012
comment
Здорово! Это определенно сделает мой исходный код чище. Спасибо, Ихуи. - person JAponte; 05.12.2012
comment
Спасибо за это! Делает многое намного проще. Тем не менее, я действительно изо всех сил пытаюсь представить хук, который позволит разрывать строки между графиками (либо разумно, либо по спецификации пользователя). Например: Как получить результат plot.lm для отображения в конфигурации 2x2, где каждый график является субфигурой? (Т.е. не используя par(mfrow=c(2,2)), но с `\\` между графиком 2 и 3. Должен ли я отправить запрос функции на GitHub? Или есть простое решение? Спасибо! - person dynamo; 07.02.2013
comment
@Yihui Есть ли способ разместить эти цифры по центру страницы? - person radek; 17.01.2014
comment
Часть \usepackage{subfig} важна =) ; также я могу подтвердить, что эта функциональность теперь есть в основной линии Knitr. - person russellpierce; 12.04.2014
comment
@Yihui, это потрясающе. Не знаю, насколько сложно будет использовать subcaption вместо этого. Вероятно, это позволит нам также использовать подтаблицу. - person Sam; 03.03.2015
comment
@dynamo Прошло некоторое время (почти четыре года), но, наконец, реализовано: github .com/yihui/knitr/issues/1327#issuecomment-346242532 - person Yihui Xie; 22.11.2017

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

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

  • fig.subcap — это список подписей к подрисункам.
  • fig.ncol: количество столбцов субфигурок
  • out.width: выходная ширина фигур. Обычно вы устанавливаете это 100%, деленное на количество подстолбцов.

Для подрисунков также требуется пакет LaTeX subfig. Поэтому строка \usepackage{subfig} должна быть включена в YAML, или, если вы используете внешний текстовый шаблон, вы можете добавить его в этот файл.

Вот базовый шаблон:

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

person Michael Harper    schedule 03.03.2018
comment
Хорошее решение @Michael Harper. Однако у меня есть проблема с этим, когда у меня больше рисунков, чем помещается на одной странице (для документа PDF). Когда у меня есть, скажем, 10 фигур, оставшиеся фигуры просто обрезаются после вязания документа в pdf. Вы знаете, как решить эту проблему? Я также создал для него вопрос здесь< /а>. - person Kevin; 14.05.2020

Вы можете использовать пакет 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}

введите здесь описание изображения

person JAponte    schedule 18.10.2012
comment
Хорошее решение - оно позволяет явно создать графический PDF-файл, а затем вставить его. Но это все еще немного взлома. С нетерпением жду правильной реализации этого в Knitr! - person dynamo; 19.10.2012