【问题标题】:What is the difference between geoms and stats in ggplot2?ggplot2中的geoms和stats有什么区别?
【发布时间】:2016-08-04 19:18:56
【问题描述】:

geoms 和 stats 都可用于在 R 包 ggplot2 中绘制绘图,并且它们通常给出相似的结果(例如 geom_area 和 stat_bin)。他们也经常有稍微不同的论点,例如在2-D density plots:

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)

这两种对象之间有什么根本区别吗?

【问题讨论】:

    标签: r plot ggplot2


    【解决方案1】:

    这只是为了补充接受的答案。

    根据 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"
    )
    

    但这确实是仍然令人讨厌的长,因为statposition 的值只是"identity",这基本上意味着“什么都不做”——所以为什么要说那个明确的?

    但是,layer() 函数没有 statposition 的默认值 -- 它们需要在调用 layer() 函数时明确指定。

    为了解决这个问题,Hadley 将 geom_* 函数和 stat_* 函数设置为 layer() 函数的 layer() 函数,geomstat 参数都有默认值。 stat_*geom_* 函数之间的区别在于哪个参数具有不可变(不可更改)默认值statgeom

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

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

    图层是数据、统计数据和几何图形的组合,具有潜在的位置调整功能。通常使用geom_*stat_* 调用创建层,但也可以使用此函数[layer() 函数] 直接创建层。

    【讨论】:

    • 非常感谢您解释stat_*geom_* 函数实际上是为layer() 函数提供合理默认值的包装器。对我来说,这是您回答中最令人大开眼界的方面。我的学生会(间接地)非常感谢你:-)
    【解决方案2】:

    geoms 代表“几何对象”。这些是您在绘图上看到的核心元素,点、线、区域、曲线等对象。

    stats 代表“统计转换”。这些对象以不同的方式汇总数据,例如计数观测值、创建最适合数据的黄土线或向黄土线添加置信区间。

    由于几何是情节的“核心”,因此这些是必需的对象。另一方面,生成情节不需要统计数据,但可以大大增强最终情节。

    正如@eipi10 在 cmets 中指出的那样,这些区别在一定程度上是概念性的,因为大多数几何图形在绘制之前都会进行一些统计转换。这些包括geom_bargeom_smoothgeom_quantile。数据以或多或少“原始”形式呈现的一些常见例外是geom_pointgeom_line 以及不太常用的geom_rug

    【讨论】:

    • AFAIK stats 和 geom 总是在一起的,但是每个 geom 都有一个默认的 stat。因此,您不必明确指定统计信息,但仍需要统计信息。如果您查看ggplot help,您可以看到哪个统计信息是每个几何图形的默认值。您还可以反转该过程并在对stat_xxx() 的调用中指定geom。大多数情况下,您不必担心这些细节,但如果您想更改默认行为,最好了解一下。
    • 可能最常见的情况是geom_bar,其中默认为对行进行计数(geom_bar 的默认统计数据为stat_count)。因此,如果您的数据是预先汇总的,则需要指定stat="identity",这意味着不对原始数据进行任何转换。
    • 感谢您的链接,我会添加一个注释,希望能更好地表达这种情绪。
    • 上面评论的 ggplot_help 链接@eipi10 对我不起作用。我认为这是ggplot2.tidyverse.org/reference 的预期页面,这对我肯定有帮助!
    • 很高兴有帮助。看起来我 4.5 年前评论中的链接不再有效。感谢您发布当前链接。
    【解决方案3】:

    geom 用于几何表示,而 stat 用于统计信息和表示。我认为有时 geom 会使用一些统计功能,例如 geom_bar() 使用的 stat_count()。在这种情况下,geom_bar 接受一个参数(x 或 y),而 stat_count 负责频率计数。

    【讨论】:

      猜你喜欢
      • 2013-12-25
      • 1970-01-01
      • 2018-11-06
      • 2021-12-28
      • 2010-10-02
      • 2011-12-12
      • 2010-09-16
      • 2012-03-14
      • 2012-02-06
      相关资源
      最近更新 更多