通过分位数在密度曲线下的阴影(填充或颜色)区域

Sil*_*ish 12 r ggplot2

假设例如我想通过十分位数对标准正态分布的密度曲线下面积进行阴影处理.我希望最左边10%的区域对下一个10%有不同的阴影,依此类推.

这是关于" 在两点之间着色核密度图 "和" 按组密度曲线下的ggplot2阴影区域 " 的问题的变体,但我想要对每个分位数进行着色(在我的示例中,每个组都是十分位但是过程应该容易推广到其他分位数).

我不介意解决方案是使用ggplot2还是base图形,以及这是直接从公式(这将是非常整洁)或基于首先创建数据框.如果是后者,您可能需要:

delta <- 0.0001 
z.df <- data.frame(x = seq(from=-3, to=3, by=delta))
z.df$pdf <- dnorm(z.df$x)
z.df$decile <- floor(10*pnorm(z.df$x) + 1)
Run Code Online (Sandbox Code Playgroud)

请注意,天真的解决方案ggplot(z.df, aes(x = x, fill = quantile)) + geom_ribbon(aes(ymin = 0, ymax = pdf))会失败,因为Aesthetics can not vary with a ribbon.

jlh*_*ard 16

实际上,只要你设定美学,美学就会随着geom_ribbon(...)(或者geom_area(...),基本上是同一件事)而变化group.

delta     <- 0.001 
quantiles <- 10
z.df     <- data.frame(x = seq(from=-3, to=3, by=delta))
z.df$pdf <- dnorm(z.df$x)
z.df$qt  <- cut(pnorm(z.df$x),breaks=quantiles,labels=F)

library(ggplot2)
ggplot(z.df,aes(x=x,y=pdf))+
  geom_area(aes(x=x,y=pdf,group=qt,fill=qt),color="black")+
  scale_fill_gradient2(midpoint=median(unique(z.df$qt)), guide="none") +
  theme_bw()
Run Code Online (Sandbox Code Playgroud)

quantiles <- 20在开头设置会产生以下结果:


Sil*_*ish 7

可行且可以概括的东西:

require(ggplot2)
g <- ggplot(z.df, aes(x=x, y=pdf, fill=decile)) +
    scale_fill_gradient2(midpoint=5.5, guide="none") +
    theme_bw()
for(n in 1:10) {
    g <- g + geom_ribbon(data=z.df[z.df$decile == n,], aes(ymin=0, ymax=pdf), colour = "black")
}
print(g)
Run Code Online (Sandbox Code Playgroud)

我觉得这不是特别令人满意,因为(1)我必须为每个十分位添加一个功能区,(2)如果我for在R中使用循环,我通常会做错事。

但是它给出的图是合理的:

带阴影的正态分布曲线