为什么 ggplot 中的 geom_bar 需要 stat = "identity" ?

use*_*745 7 r ggplot2

这个问题我们看到一个简单geom_line的答案。

library(dplyr)
BactData %>% filter(year(Date) == 2017) %>% 
  ggplot(aes(Date, Svartediket_CB )) + geom_line()
Run Code Online (Sandbox Code Playgroud)

如果我们更改geom_line为,geom_bar我们可能会期望看到条形图,但是

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

但是如果我们添加它会起作用stat = "identity",就像这样

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

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

小智 20

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

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

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

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

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

  • 如果您能提供一些例子,我们将非常欢迎。 (2认同)

小智 7

@史蒂夫克。

我在rdocumentation.org找到了答案。

请参阅下面stat='identity'的含义:

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

希望这有帮助。

点击文档链接:geom_bar 文档


Dij*_*Dij 6

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