【问题标题】:How to use walk to silently plot ggplot2 output with purrr如何使用 walk 以 purrr 静默绘制 ggplot2 输出
【发布时间】:2018-10-19 18:58:36
【问题描述】:

我试图了解如何使用walk 以静默方式(不打印到控制台)返回ggplot2 管道中的绘图。

library(tidyverse)

# EX1: This works, but prints [[1]], [[2]], ..., [[10]] to the console
10 %>%
  rerun(x = rnorm(5), y = rnorm(5)) %>%
  map(~ data.frame(.x)) %>%
  map(~ ggplot(., aes(x, y)) + geom_point())

# EX2: This does not plot nor print anything to the console
10 %>%
  rerun(x = rnorm(5), y = rnorm(5)) %>%
  map(~ data.frame(.x)) %>%
  walk(~ ggplot(., aes(x, y)) + geom_point())

# EX3: This errors: Error in obj_desc(x) : object 'x' not found
10 %>%
  rerun(x = rnorm(5), y = rnorm(5)) %>%
  map(~ data.frame(.x)) %>%
  pwalk(~ ggplot(.x, aes(.x$x, .x$y)) + geom_point())

# EX4: This works with base plotting
10 %>%
  rerun(x = rnorm(5), y = rnorm(5)) %>%
  map(~ data.frame(.x)) %>%
  walk(~ plot(.x$x, .x$y))

我期待示例 #2 能够正常工作,但我一定是遗漏或不理解某些内容。我想要 #1 中没有控制台输出的图。

【问题讨论】:

  • walk 不会返回或打印任何内容,因此如果要打印绘图,则需要明确说明。您可以将 ggplot 语句包装在 print 调用中
  • @camille - 啊,谢谢,请随时回答 - 但是,仍然有点困惑 - 添加了适用于基础绘图的示例 #4。
  • walk 不可见地返回其输入。使用您的 EX2,如果您运行 p = 10 %>% rerun(x = rnorm(5), y = rnorm(5)) %>% map(~ data.frame(.x)) %>% walk(~ ggplot(., aes(x, y)) + geom_point()),然后键入 p,您将看到 p 包含数据帧的输入列表。
  • EX1 不会将单个图或列表元素编号打印到控制台,如果您将其通过管道传输到其他内容。例如,library(gridExtra); 10 %>% rerun(x = rnorm(5), y = rnorm(5)) %>% map(~ data.frame(.x)) %>% map(~ ggplot(., aes(x, y)) + geom_point()) %>% grid.arrange(grobs=., ncol=5)。或者,只需调用一次 map:10 %>% rerun(x = rnorm(5), y = rnorm(5)) %>% map(~ data.frame(.x) %>% ggplot(aes(x, y)) + geom_point()) %>% grid.arrange(grobs=., ncol=5).

标签: r ggplot2 purrr


【解决方案1】:

老实说,我不确定为什么它在您的第四个示例中与 base R plot 一起使用。但是对于ggplot,您需要明确告诉walk 您希望它打印。或者正如 cmets 建议的那样,walk 将返回绘图(我在第一条评论中说错了)但不打印它们。所以你可以使用walk 来保存绘图,然后编写第二条语句来打印它们。或者在一个walk 电话中完成。

这里有两件事:我在 walk 中使用函数符号,而不是 purrr 的缩写 ~ 符号,只是为了更清楚地说明发生了什么。我还将 10 改为 4,这样我就不会在每个人的屏幕上充斥大量的情节。

library(tidyverse)

4 %>%
    rerun(x = rnorm(5), y = rnorm(5)) %>%
    map(~ data.frame(.x)) %>%
    walk(function(df) {
        p <- ggplot(df, aes(x = x, y = y)) + geom_point()
        print(p)
    })

reprex package (v0.2.0) 于 2018 年 5 月 9 日创建。

【讨论】:

  • 不直接相关,但有些人可能会犯和我一样的错误,请注意,不能将 %&gt;% print 语句通过管道传递给您的 ggplot 链,因为由于运算符优先级,它会打印只有链的最后一个元素(geom_point 这里)。因此,必须以print( 开始整个链,或者使用此答案中的附加行。
【解决方案2】:

这应该可以工作

10 %>%
  rerun(x = rnorm(5), y = rnorm(5)) %>%
  map(~ data.frame(.x)) %>%
  map(function(x) {
      ggplot(x, aes(x, y)) + geom_point()
  })

【讨论】:

  • 这并不能解决OP的map打印数字的问题,例如[[1]]
  • 你是对的。我赞成你的答案,它工作得很好。 :D
猜你喜欢
  • 2017-03-05
  • 1970-01-01
  • 2017-07-15
  • 1970-01-01
  • 2021-03-01
  • 2018-03-29
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多