.Rnw中的针织衫印刷图形列表

时间:2018-06-23 06:01:51

标签: r knitr tidyverse

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

3 个答案:

答案 0 :(得分:3)

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

aes_string用于以编程方式创建aes调用,但为了整洁而被弃用; aes文档中就是一个例子,但是this answer也让我想起了如何做。

我首先命名向量,并使用其自己的值作为名称。然后,我在其上映射并应用一个函数,该函数采用字符串y,并使用rlang::sym创建它的符号。这使我可以使用整洁的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

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

答案 1 :(得分:2)

尝试:

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

enter image description here

建议您切换到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}

enter image description here

答案 2 :(得分:1)

这将在工作目录中创建五个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")
  )