提问者:小点点

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


我在R方面很新,我正在努力覆盖一个分为6个类的填充直方图和一个基于整个分布(而不是6个类的单独分布)的KDE。我有这个数据集4列(data1,data2,data3,起源)与所有的数据是连续的,起源是我的类别(地理位置)。我可以用6个类绘制data1的直方图,但是当我添加KDE曲线时,它也被分成6条曲线(每个类一条)。我想我明白我必须重写第一个aes参数,并在调用geom_density时创建一个新的参数,但是我找不到如何做到这一点。

翻译我的问题与虹膜数据集,我想KDE曲线的萼片。长度和不是一KDE曲线萼片。每个物种的长度。这是我的代码和iris数据的结果。

ggplot(数据=虹膜,aes(x=萼片长度,填充=物种))几何直方图()主题最小()几何密度(kernel=“gaussian”,bw=0.1,alpha=0.3)

Iris数据集示例

谢谢你的帮助。


共1个答案

匿名用户

问题是直方图显示计数,积分为和,密度图显示密度,积分为1。要使两者兼容,您必须使用层的stat部分的“computed variables”(计算变量),可以通过after\u 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, aes(Sepal.Length, 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软件包(v1.0.0)于2021-06-22创建

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

编辑:对不起,我似乎掩盖了“我希望整个萼片都有1 KDE”。长度”——问题的一部分。您必须手动设置组,如下所示:

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