Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How to add multiple figures across multiple pages in a chunk using knitr and RMarkdown?

I am using a for loop to create multiple big figures across multiple pages in one chunk with knitr and rmarkdown. It works fine for word and html outputs, but has one problem in pdf output.

This is a minimal RMarkdown example to reproduce my problem.

---
title: "Knitr test"
date: "6 April 2015"
output: pdf_document
---


```{r, echo=FALSE, fig.width=6.5,fig.height=10}
library(ggplot2)
for (i in seq(1, 4)){
    p <- ggplot(cars, aes(speed, dist)) + geom_point() 
    print(p)
}
```

The generated pdf file looks like this. Two figures are printed in the page.

enter image description here

If I change the fig.height, add a few section in the rmd file, two figures are still printed in the same page with different arrangement.

---
title: "Knitr test"
output: pdf_document
date: "6 April 2015"
---

## Section A

Row B

```{r plot_phenotype, echo = FALSE, fig.height=8, fig.width=6.5}
library(ggplot2)
for (i in seq(1, 4))
{
    p <- ggplot(cars, aes(speed, dist)) + geom_point()
    print(p)
}

```

enter image description here

Thanks for any suggestion to fix this problem.

I am using RStudio 0.99.375. This is my session information.

sessionInfo()
R version 3.1.3 (2015-03-09)
Platform: x86_64-w64-mingw32/x64 (64-bit)
Running under: Windows 7 x64 (build 7601) Service Pack 1

locale:
[1] LC_COLLATE=English_Australia.1252  LC_CTYPE=English_Australia.1252   
[3] LC_MONETARY=English_Australia.1252 LC_NUMERIC=C                      
[5] LC_TIME=English_Australia.1252    

attached base packages:
[1] stats     graphics  grDevices utils     datasets  methods   base     

other attached packages:
[1] rmarkdown_0.5.3.1 knitr_1.9.5      

loaded via a namespace (and not attached):
 [1] colorspace_1.2-5 digest_0.6.8     evaluate_0.5.5   formatR_1.0     
 [5] ggplot2_1.0.0    grid_3.1.3       gtable_0.1.2     htmltools_0.2.6 
 [9] MASS_7.3-34      munsell_0.4.2    plyr_1.8.1       proto_0.3-10    
[13] Rcpp_0.11.5      reshape2_1.4.1   scales_0.2.4     stringr_0.6.2   
[17] tcltk_3.1.3      tools_3.1.3      yaml_2.1.13     
like image 663
Bangyou Avatar asked Apr 08 '15 07:04

Bangyou


People also ask

How to include images and figures in R Markdown?

Default settings for including images and figures in R Markdown Use fig.width and fig.height for R-generated figures only Arguments out.width and out.height apply to both existing images and R-generated figures Use dpi to change the resolution of images and figures The fig.retina argument is a resolution multiplier

What are the default settings for images and figures in knitr?

Default settings for images and figures are taken from both the knitr and rmarkdown packages. If a setting exists in both packages the rmarkdown value will be used. For example both packages include a default setting for fig.retina. The knitr source code shows a default value of 1 for fig.retina.

What is the default Rmarkdown value for R in knitr?

If a setting exists in both packages the rmarkdown value will be used. For example both packages include a default setting for fig.retina. The knitr source code shows a default value of 1 for fig.retina. However if you leave fig.retina blank in your R chunk it will apply the default rmarkdown value of 2.

What is the default fig width and height in R Markdown?

Use fig.width and fig.height for R-generated figures only Default is fig.width = 7 and fig.height = 5 (in inches, though actual width will depend on screen resolution). Remember that these settings will default to rmarkdown values, not knitr values. How images and figures in the HTML document are affected by using fig.width and fig.height:


1 Answers

I have solved my problem.

In the generated tex file, there aren't new lines after each figure. This tex code us generated using rmd file above:

\includegraphics{test_files/figure-latex/plot_phenotype-1.pdf}
\includegraphics{test_files/figure-latex/plot_phenotype-2.pdf}
\includegraphics{test_files/figure-latex/plot_phenotype-3.pdf}
\includegraphics{test_files/figure-latex/plot_phenotype-4.pdf}

The solution is to add a new line after each cycle to print a figure.

cat('\r\n\r\n')

Not sure why I need two "\r\n" here. The generated tex file looks like:

\includegraphics{test_files/figure-latex/plot_phenotype-1.pdf}

\includegraphics{test_files/figure-latex/plot_phenotype-2.pdf}

\includegraphics{test_files/figure-latex/plot_phenotype-3.pdf}

\includegraphics{test_files/figure-latex/plot_phenotype-4.pdf}

This is the full example of my Rmd file

---
title: "Knitr test"
output:
  pdf_document:
    keep_tex: yes
date: "6 April 2015"
---

## Section A

Row B

```{r plot_phenotype, echo = FALSE, fig.height=8, fig.width=6.5}
library(ggplot2)
library(grid)
for (i in seq(1, 4))
{
    grid.newpage()
    p <- ggplot(cars, aes(speed, dist)) + geom_point()

    print(p)
    cat('\r\n\r\n')
}


```
like image 144
Bangyou Avatar answered Sep 28 '22 17:09

Bangyou