25

我一直在尝试使用 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 执行此操作?

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

感谢您的任何建议。

4

2 回答 2

21

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

#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))

在此处输入图像描述

于 2012-09-14T17:50:00.747 回答
2

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

创建数据。这里是具有指定均值和 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") 
于 2020-06-18T13:00:13.173 回答