如何用purrr的pmap处理多变量映射,完善ggplot2配对图?
purrr::pmap 用法说明
pmap 是处理多输入映射的工具,它接受一个包含多个输入的列表,每个列表元素的长度要一致,然后把对应位置的元素传给映射函数:
- 用公式写法时,可通过
..1、..2、..3依次指代列表里的第1、2、3个输入 - 也可以给映射函数的参数命名,让代码可读性更强
配对图代码修复(含pmap应用)
你的代码中用map2仅传递了data和name.x,其实可以结合name.y一起传入,同时设置x轴和y轴标签。用pmap能一次性处理多个输入,完美适配管道流:
library(tidyverse) library(ggpubr) plots <- iris %>% pivot_longer(!Species) %>% left_join(iris %>% pivot_longer(!Species), by = "Species") %>% group_by(name.x, name.y) %>% nest() %>% mutate( plots = pmap( # 传入包含三个输入的命名列表 list(data = data, x_label = name.x, y_label = name.y), # 用命名参数引用输入,逻辑更清晰 ~ ggplot(.data) + geom_point(aes(value.x, value.y, color = Species)) + xlab(.x_label) + ylab(.y_label) ) ) ggarrange(plotlist = plots$plots, common.legend = TRUE, legend = "bottom")
代码说明
pmap的第一个参数是列表,给元素命名后,映射函数里可直接用.data、.x_label、.y_label引用对应输入,比..1、..2的写法更直观- 修改后每个图的x轴会显示
name.x(如Sepal.Length),y轴显示name.y,完全满足你的需求 - 整个流程全程在管道内完成,保持代码流畅性
如果习惯简洁写法,也可以用位置参数替代命名:
mutate( plots = pmap( list(data, name.x, name.y), ~ ggplot(..1) + geom_point(aes(value.x, value.y, color = Species)) + xlab(..2) + ylab(..3) ) )
内容的提问来源于stack exchange,提问作者sisyphos
相关产品推荐
相关产品推荐

