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 任何类型的警告或错误。
我不认为这是一个错误。如果你看到这两个函数的源代码,它看起来像是有意的:ggplot
和 geom_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
使用它的地方,产生您想要的结果。
很清楚下面一行想要做什么:
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 任何类型的警告或错误。
我不认为这是一个错误。如果你看到这两个函数的源代码,它看起来像是有意的:ggplot
和 geom_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
使用它的地方,产生您想要的结果。