假设例如我想将标准正态分布的密度曲线下方的面积着色为十分。我希望最左边 10% 的区域具有与接下来的 10% 不同的阴影,依此类推。
这是问题“Shading a kernel density plot between two points”和“ggplot2 shade area under density curve by group”的变体,但我想对每个分位数进行着色(在我的示例中,每个组都是十分位数,但过程应该很容易推广到其他分位数)。
我不介意解决方案是否使用 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)
请注意,简单的解决方案 ggplot(z.df, aes(x = x, fill = quantile)) + geom_ribbon(aes(ymin = 0, ymax = pdf))
会失败,因为 Aesthetics can not vary with a ribbon
.
最佳答案
实际上,美学可以随 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
一开始会产生这样的结果:
关于r - 密度曲线下的阴影(填充或颜色)面积(按分位数),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27189453/