这只是对已接受答案的补充。
根据 ggplot2 的作者 Hadley Wickkam 在他的书《ggplot2: Elegant Graphics for Data Analysis》第 5.2 节“逐层构建绘图”中所说,链接在此
(link here),只需要设置 stat 和 geom 中的一个:每个 geom 都有一个默认的 stat,每个 stat 都有一个默认的 geom。请注意,不要删除 HTML 标记。
上面的被接受的答案解释得很好为什么它们不同。这是为了解释为什么在实践中难以区分它们--每当您使用一个geom层,您也会隐含地使用一个stat层(即使它只是身份转换); 同样,每当您使用一个stat层时,您也会隐含地使用一个geom层。如果您满意任何一层使用的默认值,那么明确指出两层将是多余的。即使您对任一层提供的默认值不满意,您也可以将其作为参数修改每个层(即您可以修改默认的geom作为参数传递给任何
stat_*
函数,并且您可以修改默认的stat作为参数传递给任何
geom_*
函数)。用Hadley Wickham的话来说(与上面相同的来源):
您可以在...
中传递参数(在这种情况下,stat和geom参数会自动分开)
这个概念在概念上有些难以理解,这也是我一直有这个问题的原因。在他关于ggplot2底层哲学的论文中,
在此处找到第4节,“默认层次结构”中,Hadley Wickham解释了这种默认行为背后的实际考虑,即简化代码,否则代码会变得不必要地冗长。
例如,如果没有默认规范,并仅使用图形语法,一个简单散点图的代码可能如下所示:
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()
函数中,这些函数对于geom
和stat
参数都有默认值。stat_*
和geom_*
函数之间的区别在于哪个参数具有不可变(不可更改)的默认值,即stat
或geom
。
来源: http://ggplot2.tidyverse.org/reference/layer.html
所以对于geom_*
函数,您可以更改stat
参数的默认值,但无法更改geom
参数的默认值,而对于stat_*
函数,您可以更改geom
参数的默认值,但无法更改stat
参数的默认值。
图层是数据、统计和几何体的组合,可能包含位置调整。通常使用geom_*
或stat_*
调用创建层,但也可以直接使用此函数[layer()
函数]创建。
stat_*
和geom_*
函数实际上是提供了layer()
函数的合理默认值包装器。对我来说,这是你回答中最令人瞪大眼睛的部分。我的学生们(间接地)非常感激你 :-) - András Aszódi