使用Knitr循环遍历ggplots列表,并为每个图形添加标题

6
我正在使用ggplot2创建一系列图。每个图都有一个程序化的名称,我想使用这些名称来为它们中的每一个添加标题。我希望从列表中提取名称并将其动态传递给fig.cap。
有没有办法做到这一点?以下是一个MCVE,您可以在列表和单独的图之间切换以查看图表是否消失或显示:
---
output: pdf_document
---

```{r, include = FALSE}
library(ggplot2)
library(knitr)
opts_chunk$set(echo=FALSE)
```

```{r}
## Plot 1
listOfPlots <- list(
  # Plot 1
  ggplot(data = diamonds) +
    geom_point(aes(carat, price)),

  ## Plot 2
  ggplot(data = diamonds) +
    geom_point(aes(carat, depth))
)

names(listOfPlots) <- c("This is caption 1", "This is caption 2")
```


```{r, fig.cap = c("This is caption 1", "This is caption 2"), echo=TRUE}

listOfPlots

# listOfPlots$`This is caption 1`
# listOfPlots$`This is caption 2`
```

注意:

  • Yihui 和其他人已经指出 (https://groups.google.com/forum/#!topic/knitr/MJVLiVyGCro),如果要在一个代码块中有多个图像并给它们添加标题,需要设置 echo=TRUE,因为使用内嵌图像和 pandoc 可能会产生问题。
  • 我不想显示代码,并且图像的数量可能是可变的,所以我不想硬编码。有趣的是,即使设置了 echo=TRUE,使用 ggplots 的列表也无法正常工作,我必须单独调用每个 ggplot。

1
作为R Markdown的小技巧,您可以在第一个代码块中使用include=FALSE参数来抑制任何输出。这意味着您不必将所有函数都包装在SupressStartupMessages()中:https://yihui.name/knitr/options/#code-evaluation。希望这有所帮助 :) - Michael Harper
1个回答

6
如果要为R Markdown中的不同图形添加标题,它们之间需要有空格。正如Yihui on your link所述,这里的技巧是在两个图像之间添加一些换行符。
```{r, fig.cap=c("Caption 1", "Caption 2")} 
listOfPlots[[1]]
cat('\n\n') 
listOfPlots[[2]]
``` 

注意,双方括号 仅用于返回图形本身。

使用循环

假设您正在寻找一种更通用的方法,该方法可以适用于任何长度的列表,我们可以使用循环自动创建图形之间的换行符。请注意,results="asis" 在块标题中是必需的:

```{r, fig.cap=c("Caption 1", "Caption 2"), echo=FALSE, results="asis"} 

for(plots in listOfPlots){
  print(plots)
  cat('\n\n') 
}

``` 

enter image description here

作为最后的提示,您可能希望在标题中直接使用列表的名称。 语法{r,fig.cap = names(listOfPlots)}可以实现此目的。

你也可以使用 glue::glue_data() 包来创建图表标题。例如,fig.cap = glue::glue_data(diamonds, "Figure Caption for {var}")。如果你使用 tidyr::nest()purrr::map() 来创建分层数据的图表,这将非常有用。 - phargart

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接