Subfigures or Subcaptions with knitr that span more than one page?

501 views Asked by At

Very similar to this post. However I have more plots than that fit on one page causing the remaining plots to be cut off after pressing Knit. Does any one know how to solve this by plotting the other plots on the next page?

title: 'title'
author: "--"
date: "`r Sys.Date()`"
output: pdf_document
header-includes:
  - \usepackage{subfig}
  - \usepackage{float}

## To make the example more reproducible ##

```{r echo=FALSE, message=FALSE}
knitr::opts_chunk$set(fig.width=6, fig.height=9, fig.show="hold", 
hightligh=TRUE, warnings=TRUE, error=FALSE, cache=FALSE, echo=FALSE, 
dpi=100)

library(ggplot2)

```

```{r test, fig.cap='A collection of figs', fig.subcap= "-", out.width="49%", fig.asp=1, fig.ncol = 2, fig.show = 
"asis", fig.align="center"}

       for (ii in 1:10) {
       qplot(1:3, 1:3, main=ii)
       }

```

## this part is only to resemble the answer by *Michael Harper* in the post mentioned before and should be uncommented to replicate (google maps API needed) ## 

# ```{r}
# locations <- c("Southampton, UK", "London, UK", "Bristol, UK", 
# "Birmingham, UK", "Liverpool, UK", "Southampton, UK", "London, UK", 
# "Bristol, UK", "Birmingham, UK", "Liverpool, UK") 
# ggmap::register_google(key = "....")
# ```

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

The answer from Michael Harper in the same post got me quite far but not to the point that the number of plots exceed the number of plots that fit on one page.

output form the code above showing only 6 out of 10 plots

1

There are 1 answers

0
Kevin On

For completeness I will show how to solve the problem with the solution from @MichaelHarper posted here.

---
title: "tmp"
author: "Kevin Ouwerkerk"
date: "4-5-2020"
output: pdf_document
header-includes:
  - \usepackage{subfig}
  - \usepackage{float}

---

```{r echo=FALSE, message=FALSE}
library(ggplot2)

knitr::opts_chunk$set(warnings=TRUE, error=FALSE, cache=FALSE, echo=FALSE, 
dpi=100)

plots <- list()
```

```{r test}
   for (ii in 1:10) {
   plots[[ii]] <- qplot(1:3, 1:3, main=ii)
   }
```

```{r split-function}
knitr::opts_chunk$set(echo = FALSE)

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

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

```

If you have a very long caption and you get the error Error in dirname(name) : path too long you can remove {{caption}} in the code chunk name right after the text argument in the cat function