微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

用 ggplot2 (R) 覆盖 KDE 和填充直方图

如何解决用 ggplot2 (R) 覆盖 KDE 和填充直方图

我是 R 的新手,我正在努力叠加一个分为 6 个类的填充直方图和一个基于整个分布(而不是 6 个类的单个分布)的 KDE。 我有这个包含 4 列(data1、data2、data3、origin)的数据集,所有数据都是连续的,origin 是我的类别(地理位置)。我可以用 6 个类绘制 data1 的直方图,但是当我添加 KDE 曲线时,它也分为 6 条曲线(每个类一条)。我想我明白我必须在调用 geom_density 时覆盖第一个 aes 参数并创建一个新参数,但我找不到如何执行此操作。

用鸢尾花数据集翻译我的问题,我想要Sepal.Length 的KDE 曲线,而不是每个物种的KDE 曲线Sepal.Length。这是我的代码和我的虹膜数据结果。

ggplot(data=iris,aes(x=Sepal.Length,fill=Species)) + geom_histogram() + theme_minimal() + geom_density(kernel="gaussian",bw= 0.1,alpha=.3)>

Example with Iris dataset

感谢您的帮助。

解决方法

问题是直方图显示计数,它集成到总和,而密度图显示,密度,集成为 1。为了使两者兼容,您必须使用“计算变量”层的统计部分,可通过 after_stat() 访问。您可以缩放密度,使其积分为总和,也可以缩放直方图,使其积分为 1。

将直方图缩放到密度:

library(ggplot2)
ggplot(iris,aes(Sepal.Length,fill = Species)) +
  geom_histogram(aes(y = after_stat(density)),position = 'identity') +
  geom_density(bw = 0.1,alpha = 0.3)
#> `stat_bin()` using `bins = 30`. Pick better value with `binwidth`.

将密度缩放到计数。要正确执行此操作,您应该将 count 计算变量与直方图的 binwidth 参数相乘。

ggplot(iris,fill = Species)) +
  geom_histogram(binwidth = 0.2,position = 'identity') +
  geom_density(aes(y = after_stat(count * 0.2)),bw = 0.1,alpha = 0.3)

reprex package (v1.0.0) 于 2021 年 6 月 22 日创建

作为旁注;直方图的默认位置参数是将条形堆叠在另一个之上。设置 position = "identity" 可以防止这种情况。或者,您也可以在密度层中设置 position = "stack"

编辑:抱歉,我似乎掩盖了问题的“我想要 1 个 KDE 用于整个 Sepal.Length”部分。您必须手动设置组,如下所示:

ggplot(iris,fill = Species)) +
  geom_histogram(binwidth = 0.2) +
  geom_density(bw = 0.1,alpha = 0.3,aes(group = 1,y = after_stat(count * 0.2)))

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。