【问题标题】:saving list of ggplots generated using pwalk保存使用 pwalk 生成的 ggplots 列表
【发布时间】:2019-04-03 11:36:41
【问题描述】:

在@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(plotlist=p_list, nrow=3,ncol=2)

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

@Tung 推荐我看看这个帖子:Multiple plots in for loop ignoring par

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

他将非常感谢任何帮助。

非常感谢,

最好的问候,

胡安·安东尼奥

Edit:: 更正函数 plotlist 的拼写

【问题讨论】:

  • 你能不能只用pmap 而不是pwalk
  • 是的,如果我通过 return(p) 更改 print(p)。非常感谢@Richard Telford

标签: r ggplot2


【解决方案1】:

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

您可以像这样在列表中返回图:

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

【讨论】:

  • 我太傻了!非常感谢 :) 这正是我正在寻找的 :)
猜你喜欢
  • 1970-01-01
  • 2021-01-09
  • 1970-01-01
  • 2014-11-19
  • 1970-01-01
  • 2016-12-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多