我想打印图列表.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}
答案 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}
knitr
\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}
答案 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")
)