2015-04-08 15 views
8

Sto utilizzando un ciclo for per creare più figure grandi su più pagine in un blocco con knitr e rmarkdown. Funziona bene per gli output word e html, ma ha un problema nell'output in pdf.Come aggiungere più figure su più pagine in un blocco utilizzando knitr e RMarkdown?

Questo è un esempio di RMarkdown minimo per riprodurre il mio problema.

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

Il file pdf generato è simile a questo. Due figure sono stampate nella pagina.

enter image description here

Se cambio il fig.height, aggiungere una sezione pochi nel file di RMD, due figure sono ancora stampati nella stessa pagina con diversa disposizione.

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

Grazie per qualsiasi suggerimento per risolvere questo problema.

Sto usando RStudio 0.99.375. Questa è la mia informazione sulla sessione.

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  

risposta

12

Ho risolto il mio problema.

Nel file tex generato, non ci sono nuove righe dopo ogni figura. Questo codice tex generato utilizzando il file rmd sopra:

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

La soluzione è aggiungere una nuova riga dopo ogni ciclo per stampare una figura.

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

Non so perché ho bisogno di due "\ r \ n" qui.Il file tex generato assomiglia:

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

Questo è l'esempio completo della mia Rmd presentare

--- 
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') 
} 


``` 
+0

Se la trama su cui si sta lavorando è un gtable con più groites di trama, è possibile sostituire 'print (p)' con 'grid.draw (p)' e funzionerà ancora. Se non lo fai, renderà anche l'output di TableGrob. –

4

Edit 1 (LaTeX): Io non riesco a ottenere questo a lavorare con RMarkdown, dal momento che ha problemi con le nuove pagine. Ma l'uso puro di LaTeX sembra risolvere il problema con i molteplici grafici in una singola pagina e il testo all'inizio. Non sono sicuro se è quello che vuoi. In RStudio aprire un nuovo file R Sweave (.Rnw) e provare:

\documentclass{article} 
\begin{document} 
\title{A report} 
\author{Me} 
\maketitle 
\section{One section} 
Some text that does not say anything interesting. 

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

\end{document} 

Questo produce il seguente:

just a pdf

Edit 2 (RMarkdown) (in base alla risposta): eseguendo il codice dalla tua risposta ottengo la prima pagina con il testo e quindi una singola pagina per ogni trama. Se questo è ciò che si desidera, è possibile ottenere lo stesso risultato utilizzando semplicemente (vale a dire la rimozione grid.newpage, \r s e keep_tex):

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

## Section A 

Row B 

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

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


``` 

che produce il seguente:

other screenshot

se si cambia dalla fig.height a 7, otterrai lo stesso risultato di LaTeX sopra.

+0

Grazie per il suggerimento. il gatto non è richiesto se l'altezza è cambiata in 8. Sì, giocare con l'altezza può funzionare, ma non si sa perché causare questo problema per l'altra altezza. – Bangyou

+0

@Bangyou Sì, scusa, stavo giocando con 'cat' e l'altezza allo stesso tempo, quindi non mi ero reso conto che l'altezza fosse il problema principale. Non penso che ci sia un modo semplice per ottenere un pdf perfetto (usando RMarkdown) e un ciclo for automatizzato, combinato con un testo del genere. Sembra sempre combinare due grafici nella stessa pagina .. La mia risposta non funziona con le sezioni incluse, ecc. –

+1

@Bangyou Ho cambiato la mia risposta usando LaTeX invece che funziona bene. L'intero RMarkdown to Markdown in pdf probabilmente causa i problemi con la disposizione delle figure. –

Problemi correlati