如何在 ggplot 管道中使用子集?

use*_*586 4 r ggplot2 magrittr

我正在尝试将 ggplot 与子集结合使用,为 MyName 的不同值制作单独样式的线条。

如果我将数据框设置为临时变量 temp,在子集函数中引用该变量,则此方法有效

temp <- data.frame(x = ..., y = ..., MyName = ...)
temp %>% ggplot(aes(x = x, y= y) + geom_line(data = subset(temp, MyName == "Var Name"), ...)
Run Code Online (Sandbox Code Playgroud)

只是我更喜欢避免创建临时数据框。

有没有一种语法可以让我避免这种情况?类似的东西。在此,除了正确的:

data.frame(x = ..., y = ..., MyName = ...) %>%
%>% ggplot(aes(x = x, y= y) + geom_line(data = subset(., MyName == "Var Name"), ...)
Run Code Online (Sandbox Code Playgroud)

这表示对象“.” 未找到。

teu*_*and 7

您可以使用 lambda 语法作为data层的参数。然后它知道使用提供给主 ggplot 调用的数据。

library(ggplot2)
library(magrittr)

iris %>% ggplot(aes(Sepal.Width, Sepal.Length)) +
  geom_point(data = ~subset(., Species == "setosa"))
Run Code Online (Sandbox Code Playgroud)

由reprex 包(v1.0.0)于 2021-02-04 创建

关于幕后发生的事情的一些额外细节;ggplot2 对函数中的所有参数使用fortify()S3 泛型 。存在一个调用 的方法,它将 lambda 语法公式替换为“真实”函数。然后ggproto方法使用绘图数据作为唯一参数来调用该函数。请注意,这与管道运算符的工作方式不同,但仍然很方便。datalayer()ggplot2:::fortify.formula()rlang::as_function()ggplot2:::Layer$layer_data()