动态保存绘图列表

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&lt;-impat(.x.....),那么您可以 imap(~ggsave(plot = plot, file = paste0("/plots/", .y, ".png")))。由于绘图应该每次都被覆盖,并且文件名仅取决于 .y,因此您应该能够在每次迭代时使用新文件名导出每个文件 其实通过在ggplot的labs()函数下使用tag = ..参数,可以显式标注每张图。 不确定标签是什么意思,但我试过了:imap(.x = combined_mtcars, function(i) plot &lt;- 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")))

【讨论】:

以上是关于动态保存绘图列表的主要内容,如果未能解决你的问题,请参考以下文章

怎么将matlab绘制的动态图形保存下来

保存绘图时更改Matplotlib图窗口的分辨率?

保存动态创建的 jQuery Connected Sortable Lists 的顺序

R绘图保存 - 机会默认建议的绘图名称

使用 Dart 和 Flutter,我如何将动态小部件中的数据保存到另一个列表中的地图列表中

如何在 Swift 中将绘图保存到 tableview?