【问题标题】:Adding summary information to a density plot created with ggplot将摘要信息添加到使用 ggplot 创建的密度图
【发布时间】:2011-05-31 08:34:02
【问题描述】:

我有一个密度图,我想添加一些摘要信息,例如在中位数处放置一条线,并对 90% 的可信区间(第 5 和第 95 分位数)进行着色。有没有办法在ggplot中做到这一点?

这是我想总结的情节类型:

我可以弄清楚如何从 y=0 到 y= density(median(x)) 画一条线,但我不清楚我是否可以用 90% CI 对绘图进行着色。或者,我可以在密度图上方添加一个水平箱线图,但不清楚如何在不旋转密度图的情况下自行旋转箱线图。

x <- as.vector(rnorm(10000))
d <- as.data.frame(x=x)
library(ggplot2)
ggplot(data = d) + theme_bw() + 
  geom_density(aes(x=x, y = ..density..), color = 'black')

【问题讨论】:

    标签: r statistics visualization ggplot2


    【解决方案1】:

    您可以使用 geom_area() 函数。首先使用 density() 函数明确密度。

    x <- as.vector(rnorm(10000))
    d <- as.data.frame(x=x)
    library(ggplot2)
    p <- ggplot(data = d) + theme_bw() + 
      geom_density(aes(x=x, y = ..density..), color = 'black')
    # new code is below
    q5 <- quantile(x,.05)
    q95 <- quantile(x,.95)
    medx <- median(x)
    x.dens <- density(x)
    df.dens <- data.frame(x = x.dens$x, y = x.dens$y)
    p + geom_area(data = subset(df.dens, x >= q5 & x <= q95), 
                  aes(x=x,y=y), fill = 'blue') +
        geom_vline(xintercept = medx)
    

    【讨论】:

    • @pchalansani 谢谢你给我看这个。这正是我希望做的......现在我只需要在那里找到中线。我一直在尝试使用 geom_vline 但这似乎不起作用。
    • @David 我用中线更新了它,不知道为什么 geom_vline 不适合你
    • @pchalansani 感谢您帮助我继续前进。看起来不错。
    • @pchalansani 感谢更新,但我遇到了 geom_vline 将线放置在 x=0 而不是中位数的麻烦。如果你变换 x,x &lt;- x+10,你会看到密度移动但线没有...
    • @David 我查看了 geom_vline 帮助页面,看来您需要使用 xintercept... 那行得通,我修复了代码... had.co.nz/ggplot2/geom_vline.html
    【解决方案2】:

    我想为像我这样希望添加所有 3 个 Std 区域的人添加 @Prasad Chalasani 的答案。 1 Std 是最深的阴影,2 Std 是中间阴影,3 Std 是最浅的阴影。均值是黑线,中位数是白线。

    set.seed(501) # Make random sample reproducible
    x <- as.vector(rnorm(100))
    d <- as.data.frame(x=x)
    library(ggplot2)
    
    p <- ggplot(data=d) +
         theme_bw() + 
         geom_density(aes(x=x, y = ..density..), color = '#619CFF')
    
    # new code is below
    q15.9 <- quantile(x, .159) # 1 Std 68.2%
    q84.1 <- quantile(x, .841)
    q2.3  <- quantile(x, .023) # 2 Std 95.4%
    q97.7 <- quantile(x, .977)
    q0.01 <- quantile(x, .001) # 3 Std 99.8%
    q99.9 <- quantile(x, .999)
    meanx <- mean(x)
    medx  <- median(x)
    x.dens  <- density(x)
    df.dens <- data.frame(x=x.dens$x, y=x.dens$y)
    
    p + geom_area(data = subset(df.dens, x >= q15.9 & x <= q84.1), # 1 Std 68.2%
                  aes(x=x,y=y), fill='#619CFF', alpha=0.8) +
        geom_area(data = subset(df.dens, x >= q2.3 & x <= q97.7), # 2 Std 95.4%
                  aes(x=x,y=y), fill='#619CFF', alpha=0.6) +
        geom_area(data = subset(df.dens, x >= q0.01 & x <= q99.9), # 3 Std 99.8%
                  aes(x=x,y=y), fill='#619CFF', alpha=0.3) +
        geom_vline(xintercept=meanx) +
        geom_vline(xintercept=medx, color='#FFFFFF')
    

    【讨论】:

      【解决方案3】:

      这(也)在中间做垂直线:

      ggplot(data = d) + theme_bw() + 
         geom_density(aes(x=x, y = ..density..), color = 'black') + 
         geom_line(aes(x=median(x), y=c(0,.4) ) )
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2015-11-08
        • 2017-06-11
        • 1970-01-01
        • 1970-01-01
        • 2013-08-07
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多