用分位数填充密度曲线下的区域

12

假设我想通过十分位数来阴影标准正态分布的密度曲线下面的区域。我想让最左边10%的区域与下一个10%的区域有不同的阴影。

这是对问题“在两个点之间阴影核密度图”和“ggplot2按组阴影密度曲线下面的区域”的一种变体,但我想要对每个分位数进行阴影处理(在我的例子中,每个组都是十分位数,但该过程应该容易推广到其他分位数)。

我不介意解决方案使用ggplot2base 绘图,并且无论是直接从公式进行操作(这将非常简洁),还是基于先创建数据框架进行操作。如果采用后者,您可能需要:

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)

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

2个回答

17

实际上,美学可以因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()

在开始时设置quantiles <- 20会得到这个结果:


8

有用且具有普适性的东西:

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)

我不认为这特别令人满意,因为(1)我需要为每个十分位数添加一个条带,(2)如果我在R中使用for循环,通常意味着我做错了什么。
但它给出的图表是合理的: 正态分布曲线,有阴影的十分位数

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接