如何强制y轴在ggplot中显示密度

How to force y-axis to show density in ggplot

我有一个图,我需要在其 y 轴上显示密度而不是频率。

这是我使用的代码:

ggplot(stocks_orig, aes(x=Value)) + geom_histogram(aes(y=..density..), colour="black", fill="white", bins=20)+geom_density(aes(y=..density..),alpha=.2, fill="lightblue", size=1)+
  geom_vline(aes(xintercept = -0.019), linetype = "dashed", size = 1, color = "blue") + annotate("text", x =0.0, y = 51, label ="number1")+
  geom_vline(aes(xintercept = -0.029), linetype = "dotted", size = 1, color = "blue") + annotate("text", x =-0.051, y = 25, label = "number2")+ 
  labs(title="Title", subtitle="subtitle", caption="Caption")

这是我得到的图,它显示了频率,尽管使用了 aes(y=..density..):

这是我的数据:

> dput(stocks_orig[1:10,])
structure(list(Date = structure(c(14613, 14614, 14615, 14616, 
14617, 14620, 14621, 14622, 14623, 14624), class = "Date", tzone = "Europe/Prague"), 
    Growth = c(0.0139029051689914, -0.001100605444033, -0.000800320170769155, 
    -0.000300045009001992, 0.00359353551013022, 0.00169855663558151, 
    -0.00662187630888697, 0.00836491633162767, 0.00259662584726591, 
    -0.00944445882799969), Medium = c(0.0181345701954827, 0.00458945233380722, 
    0.00159872136369707, 0.00697561373642514, 0.00409161790325356, 
    0.000699755114273265, -0.0108587433348759, 0.00717420374800045, 
    0.00119928057548219, -0.0118701725704874), Value = c(0.0273232956488904, 
    0.0134096869099177, 0.0061808590750811, 0.0120273802127185, 
    0.000499875041650993, -0.000800320170769155, -0.021938907518754, 
    0.0119285708652738, 0.00379279823869626, -0.0170444346092585
    )), row.names = c(NA, -10L), class = c("data.table", "data.frame"
), .internal.selfref = <pointer: 0x0000024c38fd1ef0>)

你确定这不是密度?要使曲线成为密度,它必须满足三个规则(有关更多数学解释,请参见 this

  1. 不能为负。您的直方图 + 密度曲线似乎满足此规则
  2. 曲线下方的区域也必须积分。这似乎也令人满意。作为粗略的指示,您可以在 (0, -0.025)、(0,0.025) 和 (40, 0) 之间画一个三角形,然后观察这个三角形(面积为 1)和您的密度曲线非常相似。
  3. 您应该能够仅对密度曲线的某些区间进行积分,由于曲线的连续性,这会立即得到满足。

为了以图形方式查看此内容,我提供了一个示例。请注意 x 范围的减小如何导致 y-axis 增加(因为面积需要为 1):

ggplot(NULL, aes(x = rnorm(5000))) +
  geom_density(aes(y=..density..), size = 1)

ggplot(NULL, aes(x = rnorm(5000, sd = 0.1))) +
  geom_density(aes(y=..density..), size = 1)

我假设您希望 bin 高度加一,并且密度曲线遵循相同的缩放比例。默认行为是不同的,并且设计为使曲线下的面积总计为 1。这意味着对于窄 x 范围,峰值密度可以远高于 1。为了使 bin 的总高度添加到 1,您可以按 bin 宽度缩放输出(您可以使用 binwidthbins 更直接地控制它)。

比较:

ggplot(mtcars, aes((wt-3)/100)) +
  geom_histogram(aes(y=..density..), binwidth = 1/120) +
  geom_density(aes(y=..density..))

ggplot(mtcars, aes((wt-3)/100)) +
  geom_histogram(aes(y=..density../120), binwidth = 1/120) +
  geom_density(aes(y=..density../120))