ggplot() 中不能直接调用 subset=.()

subset=.() cannot be called in ggplot() directly

很清楚下面一行想要做什么:

ggplot(data=mtcars, aes(x=mpg, y=cyl), subset=.(gear=="5")) + 
geom_point(aes(colour=gear))

但它不起作用(子集被忽略)。确实有效的是:

ggplot(data=mtcars, aes(x=mpg, y=cyl)) +
geom_point(aes(colour=gear), subset=.(gear=="5"))

或者还有:

ggplot(data=subset(mtcars, gear=="5"), aes(x=mpg, y=cyl)) +
geom_point(aes(colour=gear))

因此,子集似乎只能从几何调用中调用,而不能直接从 ggplot() 中调用。 这是错误还是正确的行为? ggplot 不会 return 任何类型的警告或错误。

我不认为这是一个错误。如果你看到这两个函数的源代码,它看起来像是有意的:ggplotgeom_point:

对于ggplot

> getAnywhere(ggplot.data.frame)
A single object matching ‘ggplot.data.frame’ was found
It was found in the following places
  registered S3 method for ggplot from namespace ggplot2
  namespace:ggplot2
with value

function (data, mapping = aes(), ..., environment = globalenv()) 
{
    if (!missing(mapping) && !inherits(mapping, "uneval")) 
        stop("Mapping should be created with aes or aes_string")
    p <- structure(list(data = data, layers = list(), scales = Scales$new(), 
        mapping = mapping, theme = list(), coordinates = coord_cartesian(), 
        facet = facet_null(), plot_env = environment), class = c("gg", 
        "ggplot"))
    p$labels <- make_labels(mapping)
    set_last_plot(p)
    p
}
<environment: namespace:ggplot2>

geom_point

> geom_point
function (mapping = NULL, data = NULL, stat = "identity", position = "identity", 
    na.rm = FALSE, ...) 
{
    GeomPoint$new(mapping = mapping, data = data, stat = stat, 
        position = position, na.rm = na.rm, ...)
}
<environment: namespace:ggplot2>

如果您查看省略号参数 ...,您会发现它未在 ggplot 函数中使用。因此,您对参数 subset=.() 的使用不会在任何地方转移或使用。但是,由于 ggplot 函数中存在省略号,因此它不会给出任何错误或警告。

另一方面,geom_point 函数使用省略号并将其转移到 GeomPoint$new 使用它的地方。在这种情况下,您的 subset=.() 参数被转移到 GeomPoint$new 使用它的地方,产生您想要的结果。