【问题标题】:How to add multiple figures across multiple pages in a chunk using knitr and RMarkdown?如何使用 knitr 和 RMarkdown 跨多个页面添加多个图形?
【发布时间】:2015-06-13 00:31:49
【问题描述】:

我正在使用 for 循环使用 knitr 和 rmarkdown 在一个块中创建跨多个页面的多个大图。它适用于 word 和 html 输出,但在 pdf 输出中存在一个问题。

这是重现我的问题的最小 RMarkdown 示例。

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

生成的 pdf 文件如下所示。页面中打印了两个数字。

如果我改变了fig.height,在rmd文件中添加几个部分,两个数字仍然以不同的排列方式打印在同一个页面中。

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

```

感谢您提出解决此问题的任何建议。

我正在使用 RStudio 0.99.375。这是我的会话信息。

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     

【问题讨论】:

    标签: r rstudio knitr r-markdown


    【解决方案1】:

    我已经解决了我的问题。

    在生成的 tex 文件中,每个图形后面都没有新行。我们使用上面的 rmd 文件生成的这个 tex 代码:

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

    解决方法是在每个循环之后添加一个新行来打印一个图形。

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

    不知道为什么我需要两个“\r\n”。生成的 tex 文件如下所示:

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

    这是我的 Rmd 文件的完整示例

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

    【讨论】:

    • 如果您正在使用的绘图是具有多个绘图 grobs 的 gtable,您可以将 print(p) 替换为 grid.draw(p),它仍然可以工作。如果不这样做,它也会呈现 TableGrob 输出。
    【解决方案2】:

    Edit 1 (LaTeX):我似乎无法让它与 RMarkdown 一起使用,因为它在新页面上存在问题。但是使用纯 LaTeX 似乎可以解决单个页面中的多个绘图和开头的文本的问题。不确定它是否是你想要的。在 RStudio 中打开一个新的 R Sweave (.Rnw) 文件并尝试:

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

    这会产生以下内容:

    编辑 2 (RMarkdown)(根据您的回答):运行您回答中的代码我会得到第一页的文本,然后是每个情节的单页。如果这是您想要的,您只需使用(即删除grid.newpage\rs 和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')
    }
    
    
    ```
    

    这会产生以下内容:

    如果您将 fig.height 更改为 7,您将获得与上面的 LaTeX 相同的结果。

    【讨论】:

    • 感谢您的建议。如果将高度更改为 8,则不需要 cat。是的,使用高度可以工作,但不知道为什么会导致其他高度出现此问题。
    • @Bangyou 是的,对不起,我同时在玩cat 和高度,所以我没有意识到高度是主要问题。我认为没有一种简单的方法可以获得完美的 pdf(使用 RMarkdown)和自动 for 循环,并结合这样的文本。它似乎总是在同一页面中合并两个图。我的答案确实不适用于包含的部分等。
    • @Bangyou 我改用 LaTeX 更改了答案,效果很好。整个 RMarkdown 到 Markdown 到 pdf 可能会导致图形排列出现问题。
    • 感谢您的建议。乳胶为我工作。但我更喜欢直接使用 RMarkdown。稍后会接受你的答案,看看是否有其他答案可以使用 RMarkdown。
    【解决方案3】:

    在您的降价解决方案中,我无法执行包含三个垂直堆叠的数字以减少 fig.height 参数。似乎## A 部分仍然单独存在

    ## Frecuencias
    ```{r frecuencia, fig.cap = 'Frecuencias', fig.subcap=c('Total', 'Judicial', 'Gravedad e incapacidad'), fig.ncol=1, fig.align='center', out.height='25%'}
    vals$plotfrectotal
    vals$plotfrecjud
    vals$plotfrecporinc
    ```
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-05-20
      • 1970-01-01
      • 1970-01-01
      • 2021-02-18
      • 2021-08-21
      相关资源
      最近更新 更多