为什么ggplot的geom_bar需要stat =“ identity”?

时间:2019-11-23 15:04:00

标签: r ggplot2

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

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

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

  

错误:不得将stat_count()用作美观对象。

但是如果我们添加stat = "identity"的话,它会起作用

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

为什么geom_bar在没有stat = "identity"的情况下无法工作-即stat = "identity"的目的是什么?

3 个答案:

答案 0 :(得分:2)

有两层密切相关:geom_bar()geom_col()。关键区别在于它们默认情况下如何汇总数据。

对于geom_bar(),默认行为是为每个 x 值计算行数。它不期望 y 值,因为它会自行计算-实际上,如果您给它一个警告,它就会标记警告,因为它认为您很困惑。指定如何进行聚合作为geom_bar()的参数,默认值为stat = "count"

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

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

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

答案 1 :(得分:2)

@Stevec。

我在 rdocumentation.org 找到了答案。

见下文stat='identity'的含义:

<块引用>

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

希望这对您有所帮助。

点击文档链接:geom_bar documentation

答案 2 :(得分:1)

默认情况下,geom_bar()使用stat_count()绘制x每个级别(某些分组变量)上案件的发生频率。相比之下,可以通过提供参数stat_identity()来绘制stat = "identity"各个级别的值,而用x覆盖。原因geom_bar()旨在绘制频率,否则单个值可能更有效地由单个点表示。