【问题标题】:Why is stat = "identity" necessary in geom_bar in ggplot?为什么在ggplot的geom_bar中需要stat =“identity”?
【发布时间】:2019-11-23 15:04:00
【问题描述】:

this 的问题中,我们在答案中看到了一个简单的geom_line

library(dplyr)
BactData %>% filter(year(Date) == 2017) %>% 
  ggplot(aes(Date, Svartediket_CB )) + geom_line()

如果我们将geom_line 更改为geom_bar,我们可能希望看到一个条形图,但是

错误:stat_count() 不得与 y 美学一起使用。

但如果我们像这样添加stat = "identity",它就可以工作

library(dplyr)
BactData %>% filter(year(Date) == 2017) %>% 
  ggplot(aes(Date, Svartediket_CB )) + geom_bar(stat = "identity")

为什么没有stat = "identity" 就不能geom_bar 工作 - 即stat = "identity" 的目的是什么?

【问题讨论】:

  • 您阅读过文档吗? “geom_bar() 使条形的高度与每组中的案例数成正比(或者如果提供了权重美学,则为权重的总和)。如果您希望条形的高度表示数据中的值,改用 geom_col()。geom_bar() 默认使用 stat_count():它计算每个 x 位置的案例数。geom_col() 使用 stat_identity():它保留数据原样。 geom_bar 被添加为替代方案,它会为您计算。
  • @camille 所以geom_bar(stat = "identity")geom_col() 做同样的事情吗?
  • 就我所见,是的。 geom_bar 是一个希望做一些计算的版本; stat_identity 是一种可能的计算方法,其中 y 值放置在它们的实际值处

标签: r ggplot2


【解决方案1】:

有两个密切相关的层:geom_bar()geom_col()。关键区别在于它们默认聚合数据的方式。

对于geom_bar(),默认行为是计算每个x 值的行数。它不期望一个 y 值,因为它会自己计算这个值——事实上,如果你给它一个,它会标记一个警告,因为它认为你很困惑。将如何执行聚合指定为geom_bar() 的参数,默认值为stat = "count"

如果您在 geom_bar() 中明确说出 stat = "identity",您就是在告诉 ggplot2 跳过聚合并提供 y 值。这反映了下面geom_col() 的自然行为。

对于geom_col(),默认不会尝试聚合数据。从文档中,“geom_col() 使用stat_identity():它使数据保持原样”。因此,它希望您已经计算出 y 值并直接使用它们。而geom_col() 没有参数来改变这种行为 - 它总是会绘制你提供的 y 值,而你需要提供它们。

如果你有 y 值,你可以使用任何一种语法,但我发现geom_col() 更直接。

【讨论】:

  • 如果你能提供一些例子,那将是受欢迎的。
【解决方案2】:

@Stevec.

我在rdocumentation.org找到了答案。

请看下面stat='identity'的含义:

“条形图的高度通常代表以下两种情况之一:每组中的案例计数,或数据框列中的值。默认情况下,geom_bar 使用 stat="bin"。这使得每个条形的高度等于每个组中的案例数,它与将值映射到 y 审美不兼容。如果您希望条形的高度表示数据中的值,请使用 stat="identity" 并映射 a对 y 美学的价值。”

希望这对您有所帮助。

点击文档链接:geom_bar documentation

【讨论】:

    【解决方案3】:

    默认情况下,geom_bar() 使用stat_count() 绘制x(一些分组变量)每个级别的案例频率。相比之下,这可以通过提供参数stat = "identity" 来用stat_identity() 覆盖,以绘制x 的每个级别的值。 geom_bar() 的原因是为了绘制频率,否则单个值可以更有效地由单个点表示。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-02-19
      • 1970-01-01
      • 2015-08-31
      • 1970-01-01
      • 2014-09-24
      • 1970-01-01
      • 2020-05-03
      相关资源
      最近更新 更多