r - 为什么在ggplot的geom_bar中需要stat =“identity”?
问题描述
从这个问题中,我们看到了一个简单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"
什么?
解决方案
有两层密切相关: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()
更直接。
推荐阅读
- javascript - 有没有办法请求服务器不使用 Transfer-Encoding: 在 XMLHttpRequest 上分块来回答请求?
- javascript - 安装堆分析的片段时在 index.html VueJS 项目中使用 .env 变量
- python - Flask - 对多个函数/端点执行类似的操作
- r - SARIMAX 预测中的 xreg 滞后
- python - Python 脚本不会在 vlc 中打开 Youtube 流
- image - 获取两个图像之间的差异
- flutter - 我应该使用吸气剂来构建小部件子树吗?
- laravel - laravel 8中的会话忘记不能处理cookie问题
- r - 如何在不丢失 R 中数据的行的情况下进行分组过滤?
- c# - 有没有办法提示编译器计算多个字段的整个值?