ggplot2中的geoms和stats有什么区别?

tlu*_*luh 12 plot r ggplot2

既geoms和统计信息可用于使曲线在R包GGPLOT2,并且它们常常给出相似的结果(例如,geom_area和stat_bin).它们通常也有不同的参数,例如在二维密度图中:

geom_density_2d(mapping = NULL, data = NULL, stat = "density2d",
  position = "identity", ..., lineend = "butt", linejoin = "round",
  linemitre = 1, na.rm = FALSE, show.legend = NA, inherit.aes = TRUE)

stat_density_2d(mapping = NULL, data = NULL, geom = "density_2d",
  position = "identity", ..., contour = TRUE, n = 100, h = NULL, na.rm =
  FALSE, show.legend = NA, inherit.aes = TRUE)
Run Code Online (Sandbox Code Playgroud)

两种类型的物体之间是否存在根本差异?

Chi*_*cht 27

这仅仅是为了补充已接受的答案.

根据ggplot2的作者Hadley Wickkam的说法,在他的书"ggplot2:数据分析的优雅图形" (链接在这里)上.第5.2节"逐层构建图"中的91:

你只需要设置stat和geom中的一个:每个geom都有一个默认的stat,每个stat都有一个默认的geom.

上面接受的答案解释了为什么两者不同.这是为了解释为什么它们在实践中难以区分 - 无论何时使用geom层,你也隐式使用stat层(即使它只是身份转换); 同样,无论何时使用stat图层,您也隐式使用geom图层.

如果您对任一层使用的默认值都没问题,那么明确说明两个层将是多余的.即使您对任一图层提供的默认值都不满意,也可以将默认值修改为每个图层的参数(即您可以将默认geom修改为参数以传递给任何stat_*函数,并且您可以将默认属性修改为传递给任何geom_*函数的参数).用Hadley Wickham的话来说(与上面相同):

您可以传入params ...(在这种情况下,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()
Run Code Online (Sandbox Code Playgroud)

使用比例和坐标的默认值,我们可以写一些东西,如:

ggplot(data = Diamonds, aes(x = carat, y = price)) + 
layer(
geom = "point", stat = "identity", position = "identity"
)
Run Code Online (Sandbox Code Playgroud)

但是,这仍然的烦人病程长,因为值statposition只是"identity",这基本上意味着"什么也不做" -那么,为什么非要说明确?

但是,该layer()函数没有stat或的默认值position- 它们需要在layer()函数调用中明确指定.

为了解决这个问题,Hadley将geom_*函数和函数作为stat_*函数的包装器,layer()它们具有geomstat参数的默认值.stat_*geom_*函数之间的区别在于哪个参数具有不可变(不可更改)的默认值,stat或者geom.

资料来源:http://ggplot2.tidyverse.org/reference/layer.html

因此,对于geom_*函数,您可以更改stat参数的默认值,但不能更改参数的默认值geom,而对于stat_*函数,您可以更改geom参数的默认值,但不能更改参数的默认值stat.

图层是数据,stat和geom的组合,具有潜在的位置调整.通常使用geom_*stat_*调用创建图层,但也可以使用此函数[ layer()函数] 直接创建图层.

  • 非常感谢您解释“ stat_ *”和“ geom_ *”函数实际上是包装器,为“ layer()”函数提供了明智的默认值。对我来说,这是您答案中最令人大开眼界的方面。我的学生(间接)将非常感谢您:-) (3认同)

lmo*_*lmo 15

geoms代表"几何对象".这些是您在绘图中看到的核心元素,对象如点,线,区域,曲线.

统计数据代表"统计变革".这些对象以不同的方式汇总数据,例如计算观察值,创建最适合数据的黄土线,或者向黄土线添加置信区间.

由于geoms是绘图的"核心",因此这些是必需的对象.另一方面,统计数据不需要生成情节,但可以大大提高最终情节.

正如@ eipi10在评论中指出的那样,这些区别在某种程度上是概念性的,因为大多数geoms在绘制之前经历了一些统计变换.这些措施包括geom_bar,geom_smooth,和geom_quantile.数据以或多或少的"原始"形式呈现的一些常见例外是geom_pointgeom_line不太常用的geom_rug.

  • AFAIK统计数据和geom总是在一起,但每个geom都有一个默认的统计数据.因此,您不必明确指定统计信息,但仍需要统计信息.如果查看[ggplot help](http://docs.ggplot2.org/current/),您可以看到每个geom的默认值.您还可以反转该过程并在对`stat_xxx()`的调用中指定`geom`.大多数情况下,您不必担心这些细节,但如果您想要更改默认行为,最好知道. (8认同)
  • 可能最重要的情况是`geom_bar`,其中默认是计数行(`geom_bar`的默认属性是`stat_count`).因此,如果您的数据是预先汇总的,则需要指定`stat ="identity"`,这意味着不会对原始数据进行转换. (7认同)
  • 感谢您的链接,我会添加一个注释,以期更好地涵盖这种情绪. (3认同)