【问题标题】:How to shade a region under a curve using ggplot2如何使用ggplot2对曲线下的区域进行着色
【发布时间】:2012-09-07 21:40:06
【问题描述】:

我一直在尝试使用 ggplot2 生成类似于此 R 图形的绘图:

xv<-seq(0,4,0.01)
yv<-dnorm(xv,2,0.5) 
plot(xv,yv,type="l") 
polygon(c(xv[xv<=1.5],1.5),c(yv[xv<=1.5],yv[xv==0]),col="grey") 

这是我对 ggplot2 的了解:

x<-seq(0.0,0.1699,0.0001)   
ytop<-dnorm(0.12,0.08,0.02)
MyDF<-data.frame(x=x,y=dnorm(x,0.08,0.02))
p<-qplot(x=MyDF$x,y=MyDF$y,geom="line") 
p+geom_segment(aes(x=0.12,y=0,xend=0.12,yend=ytop))

我想对超出 x=0.12 的尾部区域进行着色。我将如何使用 ggplot 或 qplot 来做到这一点?

从广义上讲,如何对曲线下的任何子集进行着色,无论是尾部,还是将区域划分为不同区域的两条任意线之间?

感谢您的建议。

【问题讨论】:

    标签: r graphics statistics ggplot2


    【解决方案1】:

    用你想要着色的区域创建一个多边形

    #First subst the data and add the coordinates to make it shade to y = 0
    shade <- rbind(c(0.12,0), subset(MyDF, x > 0.12), c(MyDF[nrow(MyDF), "X"], 0))
    
    #Then use this new data.frame with geom_polygon
     p + geom_segment(aes(x=0.12,y=0,xend=0.12,yend=ytop)) +
         geom_polygon(data = shade, aes(x, y))
    

    【讨论】:

    • 答案也有另一种帮助。我没有考虑 ggplot2 的模式并创建一个明确的数据子集。我试图从纯图形对象的角度来完成这项工作。
    • 我想你的意思是(注意最后一个右括号的位置)... shade 0.12), c(MyDF[ nrow(MyDF), "X"], 0))
    【解决方案2】:

    这本质上是 Luciano 的答案的副本,我发现它很有用,但它可能会为其他想要使用这种方法的人节省一些时间。

    创建数据。这里是具有指定均值和 sd 的正态分布的第 0.1 个百分位到第 99.9 个百分位的 0.001 个间隔的密度。

    mean_ = 10
    sd_ = 4
    
    x = seq(qnorm(c(0.001), mean_, sd_),qnorm(c(0.999), mean_, sd_),0.001) 
    
    distdata = data.frame(x=x,y=dnorm(x,mean_,sd_))
    

    用于根据特定值对左尾或右尾进行着色的函数。

    shade_under_curve = function(p, d, left=NULL, right=NULL, distrib, fill, ...){
    
      if(!is.null(left)){
    
        shade = rbind(c(d[1, "x"], 0), d[d$x<left,], c(left,0))
    
      } else if(!is.null(right)){
    
        shade = rbind(c(right,0), d[d$x>right,], c(d[nrow(d), "x"], 0))
    
      }
    
      value = c(left, right)
    
      ytop<-distrib(value,...)
    
      p + geom_segment(aes(x=value,y=0,xend=value,yend=ytop)) +
        geom_polygon(data = shade, aes(x, y), alpha=0.2, fill=fill) 
    
    
    }
    

    例子:

    p = qplot(x=distdata$x,y=distdata$y,geom="line") 
    
    shade_under_curve(p, distdata, left=3, distrib=dnorm, mean=mean_, sd=sd_, fill = "red") 
    
    shade_under_curve(p, distdata, right=15, distrib=dnorm, mean=mean_, sd=sd_, fill = "blue")
    
    p2 = shade_under_curve(p, distdata, left=qnorm(0.025, mean_, sd_), distrib=dnorm, mean=mean_, sd=sd_, fill = "green") 
    shade_under_curve(p2, distdata, right=qnorm(0.975, mean_, sd_), distrib=dnorm, mean=mean_, sd=sd_, fill = "green") 
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-04-20
      • 2015-10-03
      • 1970-01-01
      • 1970-01-01
      • 2021-04-08
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多