使用 purrr 在 ggplot2 objects 列表中绘制平均线

Using purrr to plot a mean line on a list of ggplot2 objects

我正在玩 purrr 并且方法概述在这个 post

我的目标是使用purrr::map2(或某些变体)按组(cyl)应用一个函数(在本例中是指),然后创建一些使用先前应用的结果的图结果图中的一个函数。或者,换句话说,我想使用 dplyr 链中的 mean_list 列表列为每个图中的平均值添加一条垂直线。这可能吗?

library(tidyverse)
 mt_list <- mtcars %>%
  group_by(cyl) %>%
  nest() %>%
  mutate(mean_list = map2(data, cyl, ~mean(.$disp))) %>%
  mutate(plot = map2(data, cyl, ~ggplot(data = .x) +
                       geom_point(aes(y = drat, x = disp)) #+
                       #geom_vline(data = mean_list ,aes(xintercept) Unsure about this step
  ))

这是我想要的一种情节的示例,但是当重点是将所有内容都包含在像 mt_list[=19 这样的漂亮小标题中时,这似乎是一种愚蠢的方法=]

mt_list$plot[[1]] +
  geom_vline(aes(xintercept = mt_list$mean_list[[1]]))

这可以通过将 mean_list 作为第二个参数传递给 map2 而不是 cyl,然后在 geom_vline 中使用 xintercept = .y 来完成。

mt_list <- mtcars %>%
  group_by(cyl) %>%
  nest() %>%
  mutate(mean_list = map(data, ~mean(.$disp))) %>%
  mutate(plot = map2(data, mean_list, ~ ggplot(data = .x) +
                       geom_point(aes(y = drat, x = disp)) +
                       geom_vline(xintercept = .y)
  ))

请注意,对于此特定用例,您还可以通过使用 aes(xintercept = mean(disp)):

完全避免必须创建 mean_list
mt_list <- mtcars %>%
  group_by(cyl) %>%
  nest() %>%
  mutate(plot = map(data, ~ ggplot(data = .) +
                      geom_point(aes(y = drat, x = disp)) +
                      geom_vline(aes(xintercept = mean(disp)))))