缩放 geom_density 以将 geom_bar 与 y 上的百分比匹配

Del*_*eet 5 r ggplot2

由于我上次尝试问这个问题时对数学感到困惑,所以再试一次。我想将直方图与平滑分布拟合相结合。我希望 y 轴以百分比表示。

我找不到得到这个结果的方法。上次,我设法找到一种方法将 缩放geom_bar到与 相同的比例geom_density,但这与我想要的相反。

我当前的代码产生这个输出:

ggplot2::ggplot(iris, aes(Sepal.Length)) +
  geom_bar(stat="bin", aes(y=..density..)) +
  geom_density()
Run Code Online (Sandbox Code Playgroud)

在此处输入图片说明

密度和 bar y 值匹配,但缩放是无意义的。我想要 y 轴上的百分比,而不是密度。

一些新的尝试。我们从一个修改为显示百分比而不是计数的条形图开始:

gg = ggplot2::ggplot(iris, aes(Sepal.Length)) +
  geom_bar(aes(y = ..count../sum(..count..))) +
  scale_y_continuous(name = "%", labels=scales::percent)
Run Code Online (Sandbox Code Playgroud)

在此处输入图片说明

然后我们尝试向其添加一个 geom_density 并以某种方式使其正确缩放:

gg + geom_density()
Run Code Online (Sandbox Code Playgroud)

在此处输入图片说明

gg + geom_density(aes(y=..count..))
Run Code Online (Sandbox Code Playgroud)

在此处输入图片说明

gg + geom_density(aes(y=..scaled..))
Run Code Online (Sandbox Code Playgroud)

在此处输入图片说明

gg + geom_density(aes(y=..density..))
Run Code Online (Sandbox Code Playgroud)

和第一个一样。

gg + geom_density(aes(y = ..count../sum(..count..)))
Run Code Online (Sandbox Code Playgroud)

在此处输入图片说明

gg + geom_density(aes(y = ..count../n))
Run Code Online (Sandbox Code Playgroud)

在此处输入图片说明

似乎下降了大约 10 倍......

gg + geom_density(aes(y = ..count../n/10))
Run Code Online (Sandbox Code Playgroud)

与...一样:

gg + geom_density(aes(y = ..density../10))
Run Code Online (Sandbox Code Playgroud)

在此处输入图片说明

但是临时插入数字似乎是个坏主意。

一个有用的技巧是检查绘图的计算值。如果保存它,这些通常不会保存在对象中。但是,可以使用:

gg_data = ggplot_build(gg + geom_density())
gg_data$data[[2]] %>% View
Run Code Online (Sandbox Code Playgroud)

由于我们知道 x=6 附近的密度拟合应该是大约 0.04 (4%),我们可以四处寻找 ggplot2 计算得出的值,我看到的唯一结果是密度/10。

我如何geom_density适应与修改后的 y 轴相同的比例geom_bar

额外问题:为什么条形的分组不同?当前函数在条形之间没有空格。

Ann*_*naZ 5

这是一个简单的解决方案:

library(scales) # ! important
library(ggplot2)
ggplot(iris, aes(Sepal.Length)) +
    stat_bin(aes(y=..density..), breaks = seq(min(iris$Sepal.Length), max(iris$Sepal.Length), by = .1), color="white") +
    geom_line(stat="density", size = 1) +
    scale_y_continuous(labels = percent, name = "percent") +
    theme_classic()
Run Code Online (Sandbox Code Playgroud)

输出:

在此输入图像描述

  • 我不太确定为什么 y 轴有意义。这些条加起来很容易就会超过 100%。我们如何解释 y 百分比轴? (2认同)