这只是为了补充接受的答案。
根据 ggplot2 的作者 Hadley Wickkam 在他的书“ggplot2:用于数据分析的优雅图形”(link here) 中的说法。 91,第 5.2 节“逐层构建绘图”:
你只需要设置stat和geom之一:每个geom都有一个default stat,每个stat都有一个default geom。
上面接受的答案很好地解释了为什么两者不同。这是为了解释为什么它们在实践中难以区分——每当你使用 geom 层时,你也隐含地使用了 stat 层(即使它只是身份转换);同样,每当您使用 stat 层时,您也隐含地使用了 geom 层。
如果您对任一层使用的默认值都满意,那么明确说明这两个层将是多余的。即使您对任一层提供的默认值都不满意,您也可以将默认值修改为每个层的参数(即,您可以将默认 geom 作为参数修改为传递给任何stat_* 函数,并且您可以修改默认值stat 作为参数传递给任何geom_* 函数)。用 Hadley Wickham 的话来说(与上述相同):
您可以在... 中传递参数(在这种情况下,stat 和 geom 参数会自动分开)
这在概念上有点难以理解,这就是为什么我也有这个问题。 Hadley Wickham 在他关于 ggplot2 背后的哲学的论文 found here 中的第 4 节“默认的层次结构”中解释了这种默认行为背后的实际考虑因素,即简化代码,否则会不必要地冗长。
例如,没有默认规范,仅使用图形语法,简单散点图的代码可能如下所示:
ggplot() +
layer(
data = diamonds, mapping = aes(x = carat, y = price),
geom = "point", stat = "identity", position = "identity"
) +
scale_y_continuous() +
scale_x_continuous() +
coord_cartesian()
使用默认的比例和坐标,我们可以改写如下:
ggplot(data = Diamonds, aes(x = carat, y = price)) +
layer(
geom = "point", stat = "identity", position = "identity"
)
但这确实是仍然令人讨厌的长,因为stat 和position 的值只是"identity",这基本上意味着“什么都不做”——所以为什么要说那个明确的?
但是,layer() 函数没有 stat 或 position 的默认值 -- 它们需要在调用 layer() 函数时明确指定。
为了解决这个问题,Hadley 将 geom_* 函数和 stat_* 函数设置为 layer() 函数的 layer() 函数,geom 和 stat 参数都有默认值。 stat_* 和geom_* 函数之间的区别在于哪个参数具有不可变(不可更改)默认值stat 或geom。
来源:http://ggplot2.tidyverse.org/reference/layer.html
因此对于geom_* 函数,您可以更改stat 参数的默认值,但不能更改geom 参数的默认值,而对于stat_* 函数,您可以更改@ 的默认值987654350@参数而不是stat参数的默认值。
图层是数据、统计数据和几何图形的组合,具有潜在的位置调整功能。通常使用geom_* 或stat_* 调用创建层,但也可以使用此函数[layer() 函数] 直接创建层。