【问题标题】:Shade (fill or color) area under density curve by quantile按分位数对密度曲线下的阴影(填充或颜色)区域进行着色
【发布时间】:2014-11-28 13:13:08
【问题描述】:

假设例如我想用 decile 对标准正态分布的密度曲线下的区域进行着色。我希望该区域最左边的 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

【问题讨论】:

    标签: r ggplot2


    【解决方案1】:

    其实审美可以随着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 &lt;- 20 会产生这样的结果:

    【讨论】:

      【解决方案2】:

      一些有效且可以概括的东西:

      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 循环,我通常会做错事。

      但它给出的情节是合理的:

      【讨论】:

        猜你喜欢
        • 2018-06-21
        • 2014-07-09
        • 2019-08-14
        • 2021-04-08
        • 1970-01-01
        • 2012-09-07
        • 2012-04-20
        • 1970-01-01
        相关资源
        最近更新 更多