首页 > 解决方案 > knitr 打印 .Rnw 中的图形列表

问题描述

我想打印图表列表 throw .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}

标签: rknitrtidyverse

解决方案


您可以使用其中一种变体purrr::walk来静默映射绘图列表并将它们保存为ggsave. walk2映射两个列表,或iwalk映射一个列表及其名称。iwalk如果您给出情节列表名称,那真的很简单;我在这里做的方式有点尴尬,但是在野外,例如从已拆分的数据框或已经有名称的向量进行绘图时,它可能会有所不同。

aes_string用于以aes编程方式创建调用,但不推荐使用它以支持 tidy eval;这方面的一个例子是在aes文档中,但我也被这个答案提醒了如何做到这一点。

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

# https://stackoverflow.com/a/50726130/5325862
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

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


推荐阅读