Как вставить разрыв страницы между подфигурами внутри фрагмента кода с помощью knitr - PullRequest
0 голосов
/ 31 октября 2018

У меня есть следующий код R arkdown:

---
output:
  pdf_document: default
  keep_tex: yes
header-includes: 
  - \usepackage{subfig}
---


```{r setup, include=FALSE}
knitr::opts_chunk$set(echo = F)
library(ggplot2)
library(knitr)
```
## Including Plots

You can also embed plots, for example:
```{r pressure, echo=FALSE, fig.width = 20, fig.height=10, fig.cap=LETTERS[1:3], fig.subcap=LETTERS[1:5], fig.ncol=2,  out.width='0.4\\linewidth'}
for (x in 1:3) {
  df <- data.frame(a = runif(50))
  p <- ggplot(df, aes(x=a)) + geom_histogram(bins=10)
  print(p)
  df <- data.frame(a = runif(50))
  p <- ggplot(df, aes(x=a)) + geom_histogram(bins=10)
  print(p)
  df <- data.frame(a = runif(50))
  p <- ggplot(df, aes(x=a)) + geom_histogram(bins=10)
  print(p)
  df <- data.frame(a = runif(50))
  p <- ggplot(df, aes(x=a)) + geom_histogram(bins=10)
  print(p)
  df <- data.frame(a = runif(50))
  p <- ggplot(df, aes(x=a)) + geom_histogram(bins=10)
  print(p)
  cat('\n\\pagebreak\n')
}

Мне бы хотелось иметь три разные фигуры, каждая из которых содержит пять подфигур. Я пытаюсь разбить фигуру на пятой подфигуре, но она не работает.

1 Ответ

0 голосов
/ 31 октября 2018

fig.cap рассчитан на один аргумент, и поэтому нам придется программно генерировать новые фрагменты кода для каждого из трех графиков, которые вы хотите. Как объяснил здесь , мы можем использовать функцию knit_expand. Я исправил приведенный пример, включив в него подписи подфигуры и способ печати графиков из списка.

Я написал функцию splitSubFig, которая будет ограничивать количество подфигур на график. Если мы перейдем по этому номеру, он создаст новую страницу. Обратите внимание, вам нужно будет использовать results="asis" в заголовке чанка для создания фигур:

---
output:
  pdf_document: default
header-includes: 
  - \usepackage{subfig}
---


```{r setup, include=FALSE}
knitr::opts_chunk$set(echo = F)

library(ggplot2)
library(knitr)

# Function to create a separate chunk to generate a plot for each item in list
splitSubFig <- function(plots, caption, maxlength) {

  knitr::opts_knit$set(progress = FALSE, verbose = FALSE)

  n <- length(plots)
  numPages <- ceiling(n / maxlength)
  splitPlots <- split(plots, rep(1:ceiling(n/maxlength), each=maxlength)[1:n])

  for (page in 1:numPages) {

    cat(
      knit(text=knit_expand(
        text=(
          "```{r {{caption}}{{page}}, fig.cap='{{caption}}: {{page}}', fig.subcap=LETTERS[1:length(splitPlots[page])],  out.width='8cm', fig.ncol=2, echo = FALSE, message = FALSE}
for(i in splitPlots[page]){

for(plots in i){
 print(plots)
}

}
```"),
caption = caption,
page = LETTERS[page])))
  }
}

```

```{r, results="asis"}

plots <- list(ggplot(data.frame(a = runif(50)), aes(x=a)) + geom_histogram(bins=10, fill = "red"),
             ggplot(data.frame(a = runif(50)), aes(x=a)) + geom_histogram(bins=10),
             ggplot(data.frame(a = runif(50)), aes(x=a)) + geom_histogram(bins=10),
             ggplot(data.frame(a = runif(50)), aes(x=a)) + geom_histogram(bins=10),
             ggplot(data.frame(a = runif(50)), aes(x=a)) + geom_histogram(bins=10),
             ggplot(data.frame(a = runif(50)), aes(x=a)) + geom_histogram(bins=10, fill = "blue"),
             ggplot(data.frame(a = runif(50)), aes(x=a)) + geom_histogram(bins=10),
             ggplot(data.frame(a = runif(50)), aes(x=a)) + geom_histogram(bins=10),
             ggplot(data.frame(a = runif(50)), aes(x=a)) + geom_histogram(bins=10),
             ggplot(data.frame(a = runif(50)), aes(x=a)) + geom_histogram(bins=10))

splitSubFig(plots, caption = "Your Caption", maxlength = 6)
```

enter image description here

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

...