R-保存使用地图创建的ggplot对象

问题描述

假设我们运行以下代码

iris %>% 
    group_split(Species) %>% 
    map(~ggplot(.,aes(x = Sepal.Length,y = Sepal.Width))+
            geom_point())

这将创建三个单独的散点图,分别是“隔片长度”与“隔片宽度”,并按物种分组。

但是,现在,我想将这三个文件另存为.png。我希望它们被称为setosa.pngversicolor.pngvirginica.png。如何在不离开map loop ”的情况下执行此操作?我知道我可以将图表保存在列表中,然后调用for循环将其保存,但这是我要避免的具体事情。

我想这样开始:

iris %>% 
    group_split(Species) %>% 
    map(~ggplot(.,y = Sepal.Width))+
            geom_point()) %>%
    map(ggsave)

但是由于我没有提供文件名,所以此代码将失败。那怎么办呢?

解决方法

在同一map中执行此操作,而不要添加另一个map命令。您可以从Species列中提取first值来获取文件名。

library(dplyr)
library(ggplot2)

iris %>% 
  group_split(Species) %>% 
  purrr::map(~ggsave(paste0(first(.$Species),'.png'),ggplot(.,aes(x = Sepal.Length,y = Sepal.Width))+
            geom_point()))
,

这是不用purrr的另一种方式。但是,它需要创建一个自定义函数:

library(dplyr)
library(ggplot2)
save_plots <- function(df) {
  sapply(1:nrow(df),function(v) {ggsave(filename = paste(df$Species[v],"png",sep="."),plot = df$plot[v][[1]],device = "png")})
  }


iris %>%
  nest_by(Species) %>%
  mutate(plot = list(ggplot(data,y = Sepal.Width))+
                       geom_point())) %>%
  save_plots()