保存使用pwalk生成的ggplots列表

时间:2019-04-03 11:36:42

标签: r ggplot2

在@Tung的惊人帮助下,我们创建了一个函数,该函数使用purrr :: pwalk通过循环创建ggplots列表。但是,问题是自动打印地块,并且不可能(或者我无法解决问题)将其另存为地块列表。我来自这篇文章:Passing labels to xlab and ylab in ggplot2

注意:我需要更改每个图的ylab和xlab标签。

要绘制的函数如下:

library(tidyverse)

plot_scatter_with_label <- function(dat,
                                    var_x,
                                    var_y,
                                    label_x,
                                    label_y,
                                    geom_smooth = FALSE,
                                    point_shape = 16,
                                    point_color = "#EB3300",
                                    point_size = 1,
                                    point_alpha = 1,
                                    smooth_method = "loess",
                                    smooth_se = FALSE,
                                    smooth_color = "navy") {

  if (is.character(var_x)) {
    print('character column names supplied, use rlang::sym()')
    var_x <- rlang::sym(var_x)
  } else {
    print('bare column names supplied, use dplyr::enquo()')
    var_x <- enquo(var_x)
  }

  if (is.character(var_y)) {
    var_y <- rlang::sym(var_y)
  } else {
    var_y <- enquo(var_y)
  }

  p <- ggplot(dat, aes(x = !! var_x, y = !! var_y)) + 
    geom_point(shape = point_shape, color = point_color, 
               size = point_size, alpha = point_alpha) + 
    ylab(label_y) + 
    xlab(label_x) +
    ggtitle(paste0(label_x, " ~ ", label_y))
  print(p)

}

创建一个数据框,以便我们可以遍历每一行和每一列

var_y = c("mpg", "hp")
label_y = c("Miles per gallon [Mpg]", "Horse power [CV]")
var_x = c("cyl", "gear")
label_x = c("Cylinders [n]", "Gear [n]")

var_xy <- expand.grid(var_x, var_y, stringsAsFactors = FALSE)
label_xy <- expand.grid(label_x, label_y, stringsAsFactors = FALSE)
select_dat <- data.frame(var_xy, label_xy, stringsAsFactors = FALSE)

pwalk(select_dat, ~ plot_scatter_with_label(mtcars, ..1, ..2,..3,..4))

问题是使用pwalk时,我猜测由于功能plot_scatter_with_label的print(p),将自动显示图表。相反,我想将它们保存在地块列表中。例如: 我想要:

p_list = pwalk(select_dat, ~ plot_scatter_with_label(mtcars, ..1, ..2,..3,..4)) 

其中p_list是要使用某种功能像

那样布置的地块的列表
cowplot::plot_grid(plot_list=p_list, nrow=3,ncol=2)

ggpubr::ggarrange(lot_list=p_list, nrow=3,ncol=2)

@Tung推荐我看一下这篇文章:Multiple plots in for loop ignoring par

但是,我仍然找不到解决方法。

任何帮助他都会受到高度赞赏。

非常感谢

最诚挚的问候,

胡安·安东尼奥

1 个答案:

答案 0 :(得分:0)

pwalk函数被明确设计为不返回输出,而是专注于副作用(例如打印,读取/书写或绘图)。它是pmap的替代函数,它确实返回其输出。

您可以在以下列表中返回图:

  1. 将自定义函数的最后一行从print(p)更改为return(p)
  2. 使用pmap函数而不是pwalk