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

35

这个问题中,我们可以看到在回答中使用了一个简单的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" 的目的是什么?


3
你有没有仔细阅读文档?"geom_bar()函数使每个组中的案例数量成比例地影响条形图的高度(或者如果提供了权重美学,则为权重之和)。如果您希望条形图的高度代表数据中的值,请改用geom_col()函数。geom_bar()函数默认使用stat_count()函数:它计算每个x位置处的案例数。geom_col()函数使用stat_identity()函数:它保留数据不变。" geom_bar函数被添加为一种替代方法,可以为您进行计数。 - camille
@camille,geom_bar(stat = "identity")geom_col()完全相同吗? - stevec
1
就我所见,是的。geom_bar 是一个期望进行一些计算的版本;stat_identity 是其中一种可能的计算方式,其中 y 值被放置在它们的实际值处。 - camille
3个回答

45
有两个紧密相关的图层:`geom_bar()` 和 `geom_col()`。它们之间的关键区别是默认情况下如何对数据进行聚合。
对于 `geom_bar()`,默认行为是对每个 `x` 值计数行数。它不需要一个 `y` 值,因为它会自己来进行计数 - 实际上,如果你提供了一个 `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
如果您能提供一些示例,那将不胜感激。 - Jack Armstrong

6

@Stevec。

我在rdocumentation.org找到了答案。

下面是stat='identity'的含义:

"柱状图中的高度通常代表以下两种情况之一:每组中的案例数量,或数据框中某列的值。默认情况下,geom_bar使用 stat="bin"。这使得每个条形图的高度等于每个组中案例的数量,并且不兼容将值映射到y美学上。如果您希望每个条形图的高度代表数据中的值,请使用 stat="identity" 并将一个值映射到 y 美学."

希望这有所帮助。

请访问文档链接:geom_bar文档


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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接