ggplot2:在后续的geoms调用中引用提供给ggplot(...)的数据

3

我经常遇到这样的场景,不同的几何对象需要看到提供给初始调用ggplot() data 参数的子集。

通常,这发生在长链的可视化之后,在此期间,我实际上不需要保存在我的工作区中的数据,但我的当前解决方法是这样做,然后在每个几何显式地引用它,例如:

(
    #...
    # long chain
    # ...
) -> to_plot
(
    ggplot()
    + geom_ribbon(
        data = (
            to_plot #using intermediate object saved to workspace
            %>% dplyr::filter(
                cells_or_boots=='bootss'
            )
        )
        , mapping = aes(
            x = x
            , ymin = lo
            , ymax = hi
        )
    )
    + geom_line(
        data = (
            to_plot #using intermediate object saved to workspace
            %>% dplyr::filter(
                cells_or_boots=='cells'
            )
        )
        , mapping = aes(
            x = x
            , y = mean
        )
    )
)

是否有类似于 dplyr::cur_data() 的东西可以用于 ggplot2,以实现类似以下的功能:

(
    #...
    # long chain
    # ...
    %>% ggplot()
    + geom_ribbon(
        data = (
            ggplot_cur_data()  #place for hoped-for dplyr::cur_data() equivalent
            %>% dplyr::filter(
                cells_or_boots=='boots'
            )
        )
        , mapping = aes(
            x = x
            , ymin = lo
            , ymax = hi
        )
    )
    + geom_line(
        data = (
            ggplot_cur_data()  #place for hoped-for dplyr::cur_data() equivalent
            %>% dplyr::filter(
                cells_or_boots=='cells'
            )
        )
        , mapping = aes(
            x = x
            , y = mean
        )
    )
)

?

1个回答

9
我们可以将一个函数传递给几何图形的参数:
# suppose you have your longer pipeline here
mtcars %>%
  ggplot()+
    geom_point(
      aes(wt, mpg),
      data = ~ filter(.x, cyl == 6), 
      colour = "red"
    ) +
    geom_point(
      aes(wt, mpg),
      data = ~ filter(.x, cyl == 4), 
      colour = "blue"
    )

另一种方法是使用. %>% [pipeline]来创建匿名函数。起始的.则是传递给ggplot2()的数据的占位符。

输入图片说明

mtcars %>%
  ggplot()+
    geom_point(
      aes(wt, mpg),
      data = . %>% filter(cyl == 6), 
      colour = "red"
    ) +
    geom_point(
      aes(wt, mpg),
      data = . %>% filter(cyl == 4), 
      colour = "blue"
    )

从帮助文件中:

一个函数将被调用,其只有一个参数,即绘图数据。返回值必须是一个数据框,并将用作层数据。可以从公式(例如 ~ head(.x, 10))创建一个函数。


有趣!虽然似乎不能处理匿名函数(我试图在过滤后的数据上启用多个连续的附加操作)? - undefined
我不确定我理解你所说的“匿名函数”的意思。 - undefined
啊,有了TJ的编辑,不需要匿名功能了 :) - undefined
(FYI和匿名函数是一种常见的编程术语,用于描述代码中定义但没有命名的函数,因为它在定义的上下文中立即使用。在tidyverse链中的一个示例是( dat %>% (function(x){print(x); return(x)}) %>% more_operations() ... ),其中链中的第一个函数是一个匿名函数。) - undefined
使用 . 的一个有趣的必要条件是,你不能只写成 data = .,而是必须在管道中使用 data = (. %>% identity())。当然,如果我们对数据不做任何操作,我们应该直接省略 data =,但我想提一下这个问题,因为我遇到过这种情况,有一段时间感到困惑。 - undefined

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接