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