使用purrr绘制ggplot2对象列表中的平均线

时间:2017-05-02 21:41:14

标签: r ggplot2 purrr

我正在玩purrr以及此post

中的方法大纲

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

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

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

1 个答案:

答案 0 :(得分:1)

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

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)
  ))

请注意,对于此特定用例,您还可以使用mean_list来完全避免创建aes(xintercept = mean(disp))

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)))))