遮蔽密度曲线下的区域,以标记最高密度区间 (HDI)
Shade an area under density curve, to mark the Highest Density Interval (HDI)
我认为这应该很简单,但尽管网上有大量信息,我还是迷路了。
我的问题:我有一个数据点向量,我想为其绘制密度曲线,然后为曲线下方的区域着色以表示最高密度区间(人类发展指数)。当然,我正在尝试使用 ggplot2
包来实现这一点,特别是 qplot()
,因为我的数据是一个向量,而不是数据框。
可重现的例子
library(ggplot2)
library(HDInterval)
## create data vector
set.seed(789)
dat <- rnorm(1000)
## plot density curve with qplot and mark 95% hdi
qplot(dat, geom = "density")+
geom_vline(aes(xintercept = c(hdi(dat))))
所以我明白了:
但我真正想要的是这样的:
有没有一种简单的方法可以用 ggplot2::qplot
实现这一点?
您可以使用 ggridges 包执行此操作。诀窍是我们可以提供 HDInterval::hdi
作为 geom_density_ridges_gradient()
的分位数函数,并且我们可以用它生成的 "quantiles" 进行填充。 "quantiles" 是下尾、中、上尾的数字。
作为一般性建议,我建议不要使用 qplot()
。这更有可能引起混淆,将向量放入 tibble 中并不费力。
library(tidyverse)
library(HDInterval)
library(ggridges)
#>
#> Attaching package: 'ggridges'
#> The following object is masked from 'package:ggplot2':
#>
#> scale_discrete_manual
## create data vector
set.seed(789)
dat <- rnorm(1000)
df <- tibble(dat)
## plot density curve with qplot and mark 95% hdi
ggplot(df, aes(x = dat, y = 0, fill = stat(quantile))) +
geom_density_ridges_gradient(quantile_lines = TRUE, quantile_fun = hdi, vline_linetype = 2) +
scale_fill_manual(values = c("transparent", "lightblue", "transparent"), guide = "none")
#> Picking joint bandwidth of 0.227
由 reprex package (v0.3.0)
于 2019-12-24 创建
scale_fill_manual()
中的颜色是按三组的顺序排列的,所以如果你,例如,只想给左边的尾巴加阴影,你可以写values = c("lightblue", "transparent", "transparent")
。
当我读到这篇文章时 post 我真的很感谢你的回答,Wilke。但是我想知道如何调整hdi的可信质量。最后我找到了解决方案!当我弄清楚分位数参数的来源时(我通过点 [[2]] 访问它)它点击了触发器。我编写了以下函数(因为将值传递给 HDInterval::hdi 并没有开箱即用):
hdi_custWidth <- function(...) {
dots <- list(...)
quantiles <- dots[[2]]
hdi_width <- quantiles[[length(quantiles)]] # uses the last entry if its a vector which should be the biggest one; better pass a single double < 1.0
if (is.na(hdi_width)) hdi_width <- .89 # happens is quantiles = 1L
message(paste0('HDI credible interval width = ', hdi_width))
HDInterval::hdi(dots[[1]], credMass = hdi_width)
}
你可以用它来改变上面 post 的 repex:
library(tidyverse)
library(HDInterval)
library(ggridges)
#>
#> Attaching package: 'ggridges'
#> The following object is masked from 'package:ggplot2':
#>
#> scale_discrete_manual
## create data vector
set.seed(789)
dat <- rnorm(1000)
df <- tibble(dat)
## plot density curve with qplot and mark 95% hdi
ggplot(df, aes(x = dat, y = 0, fill = stat(quantile))) +
geom_density_ridges_gradient(quantile_lines = TRUE, quantile_fun = hdi_custWidth, quantiles = .90, vline_linetype = 2) +
scale_fill_manual(values = c("transparent", "lightblue", "transparent"), guide = "none")
#> Picking joint bandwidth of 0.227
当然,您可以在分位数参数中选择 0 到 1 之间的任何值(不仅仅是 .90)并获得相应的 hdi 可信质量。
我认为这应该很简单,但尽管网上有大量信息,我还是迷路了。
我的问题:我有一个数据点向量,我想为其绘制密度曲线,然后为曲线下方的区域着色以表示最高密度区间(人类发展指数)。当然,我正在尝试使用 ggplot2
包来实现这一点,特别是 qplot()
,因为我的数据是一个向量,而不是数据框。
可重现的例子
library(ggplot2)
library(HDInterval)
## create data vector
set.seed(789)
dat <- rnorm(1000)
## plot density curve with qplot and mark 95% hdi
qplot(dat, geom = "density")+
geom_vline(aes(xintercept = c(hdi(dat))))
所以我明白了:
但我真正想要的是这样的:
有没有一种简单的方法可以用 ggplot2::qplot
实现这一点?
您可以使用 ggridges 包执行此操作。诀窍是我们可以提供 HDInterval::hdi
作为 geom_density_ridges_gradient()
的分位数函数,并且我们可以用它生成的 "quantiles" 进行填充。 "quantiles" 是下尾、中、上尾的数字。
作为一般性建议,我建议不要使用 qplot()
。这更有可能引起混淆,将向量放入 tibble 中并不费力。
library(tidyverse)
library(HDInterval)
library(ggridges)
#>
#> Attaching package: 'ggridges'
#> The following object is masked from 'package:ggplot2':
#>
#> scale_discrete_manual
## create data vector
set.seed(789)
dat <- rnorm(1000)
df <- tibble(dat)
## plot density curve with qplot and mark 95% hdi
ggplot(df, aes(x = dat, y = 0, fill = stat(quantile))) +
geom_density_ridges_gradient(quantile_lines = TRUE, quantile_fun = hdi, vline_linetype = 2) +
scale_fill_manual(values = c("transparent", "lightblue", "transparent"), guide = "none")
#> Picking joint bandwidth of 0.227
由 reprex package (v0.3.0)
于 2019-12-24 创建scale_fill_manual()
中的颜色是按三组的顺序排列的,所以如果你,例如,只想给左边的尾巴加阴影,你可以写values = c("lightblue", "transparent", "transparent")
。
当我读到这篇文章时 post 我真的很感谢你的回答,Wilke。但是我想知道如何调整hdi的可信质量。最后我找到了解决方案!当我弄清楚分位数参数的来源时(我通过点 [[2]] 访问它)它点击了触发器。我编写了以下函数(因为将值传递给 HDInterval::hdi 并没有开箱即用):
hdi_custWidth <- function(...) {
dots <- list(...)
quantiles <- dots[[2]]
hdi_width <- quantiles[[length(quantiles)]] # uses the last entry if its a vector which should be the biggest one; better pass a single double < 1.0
if (is.na(hdi_width)) hdi_width <- .89 # happens is quantiles = 1L
message(paste0('HDI credible interval width = ', hdi_width))
HDInterval::hdi(dots[[1]], credMass = hdi_width)
}
你可以用它来改变上面 post 的 repex:
library(tidyverse)
library(HDInterval)
library(ggridges)
#>
#> Attaching package: 'ggridges'
#> The following object is masked from 'package:ggplot2':
#>
#> scale_discrete_manual
## create data vector
set.seed(789)
dat <- rnorm(1000)
df <- tibble(dat)
## plot density curve with qplot and mark 95% hdi
ggplot(df, aes(x = dat, y = 0, fill = stat(quantile))) +
geom_density_ridges_gradient(quantile_lines = TRUE, quantile_fun = hdi_custWidth, quantiles = .90, vline_linetype = 2) +
scale_fill_manual(values = c("transparent", "lightblue", "transparent"), guide = "none")
#> Picking joint bandwidth of 0.227
当然,您可以在分位数参数中选择 0 到 1 之间的任何值(不仅仅是 .90)并获得相应的 hdi 可信质量。