如何强制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)
- 不能为负。您的直方图 + 密度曲线似乎满足此规则
- 曲线下方的区域也必须积分。这似乎也令人满意。作为粗略的指示,您可以在 (0, -0.025)、(0,0.025) 和 (40, 0) 之间画一个三角形,然后观察这个三角形(面积为 1)和您的密度曲线非常相似。
- 您应该能够仅对密度曲线的某些区间进行积分,由于曲线的连续性,这会立即得到满足。
为了以图形方式查看此内容,我提供了一个示例。请注意 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 宽度缩放输出(您可以使用 binwidth
比 bins
更直接地控制它)。
比较:
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))
我有一个图,我需要在其 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)
- 不能为负。您的直方图 + 密度曲线似乎满足此规则
- 曲线下方的区域也必须积分。这似乎也令人满意。作为粗略的指示,您可以在 (0, -0.025)、(0,0.025) 和 (40, 0) 之间画一个三角形,然后观察这个三角形(面积为 1)和您的密度曲线非常相似。
- 您应该能够仅对密度曲线的某些区间进行积分,由于曲线的连续性,这会立即得到满足。
为了以图形方式查看此内容,我提供了一个示例。请注意 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 宽度缩放输出(您可以使用 binwidth
比 bins
更直接地控制它)。
比较:
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))