【发布时间】: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