在@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
但是,我仍然找不到解决方法。
任何帮助他都会受到高度赞赏。
非常感谢
最诚挚的问候,
胡安·安东尼奥
答案 0 :(得分:0)
pwalk
函数被明确设计为不返回输出,而是专注于副作用(例如打印,读取/书写或绘图)。它是pmap
的替代函数,它确实返回其输出。
您可以在以下列表中返回图:
print(p)
更改为return(p)
pmap
函数而不是pwalk