knitr 在 .Rnw 中打印图形列表

knitr printing list of graphs in .Rnw

我想打印抛出的图表列表 .Rnw。想知道如何完成任务。

\documentclass{article}


\begin{document}
\SweaveOpts{concordance=TRUE}

\begin{figure}[H]
<< label = Plot >>=
library(tidyverse)
Ys <- c("disp", "hp", "drat", "wt", "qsec")

Plots <- 
  Ys %>% 
  map(function(y)
    ggplot(data = mtcars, mapping = aes(x = mpg, y = y)) +
      geom_point(aes_string(y = y))
  )

print(Plots)
@
\end{figure}


\end{document}

这将在工作目录中创建五个 png(这是 Rnw 文件的位置,除非您使用 opts_knit$set(root.dir='../../') 之类的内容对其进行了修改)。

Ys %>% 
  purrr::iwalk(
    ~ggplot(mtcars, aes_string(x = "mpg", y = .x)) +
        geom_point() +
        ggsave(filename = .y, device = "png")
  )

您可以使用 purrr::walk 上的一种变体来静默映射地块列表并使用 ggsave 保存它们。 walk2 映射两个列表,或 iwalk 映射一个列表及其名称。 iwalk 如果您给出地块列表名称,则非常简单;我在这里做的方式有点笨拙,但在野外,例如从已拆分的数据框中绘制时,或者使用已经有名称的矢量时,它可能会有所不同。

aes_string 用于以编程方式创建 aes 调用,但它已被弃用,取而代之的是 tidy eval; aes 文档中就是这方面的一个示例,但 .

也提醒了我该怎么做

我先给向量命名,用它自己的值作为名字。然后我映射它并应用一个函数,该函数接受字符串 y 并使用 rlang::sym 创建它的符号。这允许我使用 tidy eval 创建一个带有 !!y_sum.

的裸列名称
# 
Plots <- Ys %>%
  setNames(., nm = .) %>%
  map(function(y) {
    y_sym <- rlang::sym(y)

    ggplot(data = mtcars, aes(x = mpg, y = !!y_sym)) +
      geom_point()
  })

列表中的一个地块示例,可以通过名称访问:

Plots$hp

然后为了保存绘图,iwalk 过度使用名称来创建文件名。您可以向 ggsave 添加其他参数,例如尺寸和分辨率。

Plots %>%
  iwalk(~ggsave(filename = sprintf("%s_vs_mpg.png", .y), plot = .x))
#> Saving 7 x 5 in image
#> Saving 7 x 5 in image
#> Saving 7 x 5 in image
#> Saving 7 x 5 in image
#> Saving 7 x 5 in image

如果需要,您可以一步完成所有操作:绘制地图并保存在一个函数中。我采用了将绘图保存到列表的方法,因为这就是您在问题中所做的,并且允许您在文档中提取单个绘图,而不是仅将它们保存为文件。

尝试:

\documentclass{article}

\begin{document}
\SweaveOpts{concordance=TRUE}

<< label = Plot >>=
library(tidyverse)
Ys <- c("disp", "hp", "drat", "wt", "qsec")

Plots <- 
  Ys %>% 
  map(function(y)
    ggplot(data = mtcars, mapping = aes(x = mpg, y = y)) +
      geom_point(aes_string(y = y))
  )

@

<<results=tex,echo=FALSE, >>=

for(i in 1:length(Plots)){
file=paste("myfile", i, ".png", sep="")
png(file, res = 80)
print(Plots[[i]])
dev.off()
cat(  "\begin{figure}\n\includegraphics{", file, "}\n\n\end{figure}\n", sep="")
}
@

\end{document}

确实建议切换到knitr

将4块地块合二为一

\documentclass{article}


\begin{document}
\SweaveOpts{concordance=TRUE}
\begin{figure}

<< label = Plot , fig=TRUE,results=hide>>=
library(tidyverse)
library(gridExtra)
Ys <- c("disp", "hp", "drat", "wt", "qsec")

plotLlist<-list()
for (i in 1:length(Ys)) {
  plotLlist[[i]]<- ggplot(data = mtcars,  aes_string(x = "mpg", y = Ys[i])) +
  geom_point(aes_string(y = Ys[i]))

}
print(grid.arrange(grobs =plotLlist[1:4], nrow = 2))

@
\end{figure}


\end{document}