如何访问已传递给ggplot()的数据框?

时间:2017-07-13 18:29:01

标签: r ggplot2 magrittr

我想将字符串N=xxx设置为我的图的标题,其中xxx是我作为data参数传递给{{ggplot()的数据框中的观察数。 1}}。在我当前的代码中,我第二次将该数据框作为sprintf()的参数显式传递给labs()

ggplot(mtcars, aes(mpg, hp)) + 
    labs(title=sprintf("N=%i", nrow(mtcars))) + 
    geom_point()

这确实产生了所需的标题,但它不适用于更复杂的任务:我使用dplyr管道来构建正在绘制的数据框,因为这是一个耗时的过程,我不想再次重复管道以获得如示例中的行数。

那么,如何从用于修改绘图的函数的参数规范中访问已作为参数传递给ggplot()的数据框?

2 个答案:

答案 0 :(得分:13)

mtcars %>% {
  ggplot(., aes(mpg, hp)) + 
  labs(title = paste("N =", nrow(.))) + 
  geom_point()
}

请注意,在ggplot花括号中包装整个{...}调用时,必须使用.点代词作为ggplot(., ...)中的数据参数。然后,您可以使用呼叫中任意位置的.代词回叫该对象。

enter image description here

答案 1 :(得分:4)

利用另一个magrittr管道衬里功能的另一个选项:发球台操作员%T>%

library(ggplot2)
library(magrittr)
# to solidify where the variable will be out-of-scope defined
nr <- "oops"
mtcars %T>%
  { nr <<- nrow(.) } %>%
  ggplot(aes(mpg, hp)) + 
    labs(title=sprintf("N=%i", nr)) + 
  geom_point()

(也可以使用dplyr&#39; s do({nr <<- nrow(.)}) %>%来完成。)

这与Brian的回答有两点不同:

  1. 主观上&#34;更清洁,&#34;,因为ggplot代码没有在代码块中缩进。 (正如评论的那样,不同管道的混合也可能是负面的。)

  2. 通过在管道和ggplot管道之外创建nr,它有副作用。通过预先分配nr,我认为这可以减少到达当地环境以外的地方,但它仍然有点草率。