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

How do I use subset in a ggplot pipe?

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

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

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

除了我更喜欢避免创建临时数据框。

是否有语法可以避免这种情况? 像的东西。在此,除了正确的:

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

这表示对象“.”没有找到。

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

library(ggplot2)
library(magrittr)

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

reprex package (v1.0.0)

于 2021-02-04 创建

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