动态保存绘图列表
Posted
技术标签:
【中文标题】动态保存绘图列表【英文标题】:Save a list of plots dynamically 【发布时间】:2019-01-14 21:10:55 【问题描述】:我能够根据数据框列表生成一些图:
df1 <- mtcars
df2 <- mtcars
combined_mtcars <- list(first_df = df1, second_df = df2)
# make the plots
imap(.x = combined_mtcars, ~ggplot(.x, aes(x = hp, y = mpg, group = cyl)) +
geom_line() +
ggtitle(.y))
然后我想将每个绘图保存到一个名为 /plots 的目录中。所以我尝试像这样添加 ggsave:
imap(.x = combined_mtcars, ~ggplot(.x, aes(x = hp, y = mpg, group = cyl)) +
geom_line() +
ggtitle(.y)) %>%
imap(~ggsave(plot = .y, file = paste0("/plots/", .y, ".png")))
这导致错误“在图像中保存 6.62 x 5.57 UseMethod("grid.draw") 中的错误: 'grid.draw' 没有适用的方法应用于“字符”类的对象。
如何保存文件名与标题 .y 相同的每次迭代?
【问题讨论】:
.y
是剧情吗? ggsave
要求第一个对象是 ggplot
对象,在您的示例中,在我看来 .y 是标题。 ***.com/questions/43170744/…
嗨@Chabo .y 是我希望将情节保存为的名称。所以不,这不是情节本身
如果您将创建 ggplot 的每次迭代指定为 plot<-impat(.x.....)
,那么您可以 imap(~ggsave(plot = plot, file = paste0("/plots/", .y, ".png")))
。由于绘图应该每次都被覆盖,并且文件名仅取决于 .y,因此您应该能够在每次迭代时使用新文件名导出每个文件
其实通过在ggplot的labs()
函数下使用tag = ..
参数,可以显式标注每张图。
不确定标签是什么意思,但我试过了:imap(.x = combined_mtcars, function(i) plot <- ggplot(.x, aes(x = hp, y = mpg, group = cyl) + geom_line() + ggtitle(.y)) ggsave(plot, file = paste0("/plots/", .y, ".png")) )
给出了错误“.f(.x[[i]], .y[[i]], ...) 中的错误: 未使用的参数 (.y[[i]]) "
【参考方案1】:
我们需要确保 ggplot 对象作为第一个参数传递,使用 labs()
函数中的 tag
参数允许我们将绘图分配给“变量”。
imap(.x = combined_mtcars, ~ggplot(.x, aes(x = hp, y = mpg, group = cyl)) +
geom_line() +
labs(title = .y, tag="Plot")%>%
imap(~ggsave(plot = Plot, file = paste0("/plots/", .y, ".png")))
如果这不起作用,请尝试此操作,因为 ggsave 可能会默认为正确的绘图。
imap(.x = combined_mtcars, ~ggplot(.x, aes(x = hp, y = mpg, group = cyl)) +
geom_line() +
ggtitle(.y)) %>%
imap(~ggsave(file = paste0("/plots/", .y, ".png")))
【讨论】:
以上是关于动态保存绘图列表的主要内容,如果未能解决你的问题,请参考以下文章
保存动态创建的 jQuery Connected Sortable Lists 的顺序