在不与任何其他曲线重叠的曲线下填充区域

时间:2015-04-10 02:00:35

标签: r plot polygon fill

这个问题在某种程度上与a question I previously posted有关。但是,我已经缩小了我想要做的事情,我觉得这个问题与我之前的问题不同,需要一个新的帖子。

我将多条(> 50条)曲线添加到R中的图中。每条曲线都有相应的概率(0-1)。我已经按概率对曲线进行了排序,并希望使用概率加权透明度alpha对每条曲线下的区域进行着色。

我按概率按降序添加图。我想在每条曲线下方 部分当前图表上任何曲线未覆盖的部分。

我已经在曲线之间或曲线下阅读了许多关于阴影区域的帖子,但我无法弄清楚如何遮蔽只是图表上任何其他图表未覆盖的区域。我希望这不会被视为重复。

  1. Shaded area under two curves using R
  2. Shading a kernel density plot between two points.
  3. How to make gradient color filled
    timeseries plot in R
  4. Shading between curves in R
  5. 这是一个示例图片(在MS绘画中标记)我希望最终的情节看起来像(除了没有多边形内的线条)。我在这个例子中使用了四条曲线,但是当我弄清楚这一点时,我会添加更多曲线。我首先添加了响应最高的曲线,然后添加了每条后续曲线,仅添加了尚未填充的部分。

    enter image description here

    在上面的示例中,我使用lines将曲线添加到图形中,然后在MS绘制中将它们着色。我理解填写每条曲线下面的区域我需要polygon使用border=NA。这是我如何计划根据响应值使用多边形进行着色的示例。我目前的方法是使用alpha调整颜色,但如果有更实用的方法使用灰度托盘或渐变,我愿意接受建议。

    polygon(x, y1,col=rgb(0,0,0,alpha=(1-wei.param[1,3])), border=NA )

    我尝试了几种不同的方法(基于上述超链接)来指定每个多边形的尺寸。我可以让它适用于多边形1-3,但之后它们开始叠加在一起。

    以下是重现图表的示例数据和代码。

    diameters<-c(rep(1.5,393),3,3,3,3,3.1,3.1,3.1,3.2,3.2,3.2,3.3,3.4,3.4,3.4,3.4,3.4,
                3.4,3.4,3.4,3.5,3.5,3.6,3.6,3.7,3.7,3.7,3.7,3.8,3.8,3.8,3.8,3.8,3.8,
                3.9,3.9,4,4,4,4.1,4.2,4.2,4.2,4.2,4.3,4.3,4.4,4.49,4.5,4.5,4.6,4.7,
                4.7,4.7,4.8,4.9,4.9,4.9,5,5,5,5,5.1,5.1,5.2,5.3,5.4,5.4,5.6,5.7,5.7,
                5.7,5.8,6,6,6,6.3,6.4,6.6,6.9,6.9,6.9,7,7.1,7.2,7.4,7.4,7.7,7.8,7.9,
                7.9,8.2,8.5,8.5,8.9,9.2,10.2,10.47,10.5,10.7,11.7,13.2,13.5,14.4,14.5,
                14.5,15.1,18.4)
    
    wei.param<-matrix(data=NA,nrow=5,ncol=3,dimnames = list(c(),c("shape", "scale", "prob")))
    wei.param[,1]<-c(1.834682,2.720390,3.073429,1.9,1.9)
    wei.param[,2]<-c(2.78,2.78,2.78,1.6,2.8710692)
    wei.param[,3]<-c(0.49, 0.46, 0.26, 0.26, 0.07)
    
    x=seq(0,20,1)
    y1<-dweibull(x,shape=wei.param[1,1],scale=wei.param[1,2])
    y2<-dweibull(x,shape=wei.param[2,1],scale=wei.param[2,2])
    y3<-dweibull(x,shape=wei.param[3,1],scale=wei.param[3,2])
    y4<-dweibull(x,shape=wei.param[4,1],scale=wei.param[4,2])
    
    #Plot
    hist(diameters,freq=F,main='',ylim=c(0,.5))
    
    polygon(x, y1,col=rgb(0,0,0,alpha=(1-wei.param[1,3])), border=NA )
    
    lines(x, y1)
    lines(x, y2)
    lines(x, y3)
    lines(x, y4)
    

1 个答案:

答案 0 :(得分:2)

我认为这就是你想要的:

enter image description here

我不知道如何使用基本的R图片执行此操作,但这里是ggplot2的代码,我知道的更好。请注意,ggplot2要求将数据输入为data.frame。此外,我创建了第二个概率列,以便group ggplot2多边形df <- data.frame(x = rep(x, 4), y = c(y1, y2, y3, y4), Prob = c( rep(wei.param[1,3], length(y1)), rep(wei.param[2,3], length(y2)), rep(wei.param[2,3], length(y2)), rep(wei.param[4,3], length(y4)))) df$Prob2 = as.factor(df$Prob) library(scales) # needed for alpha function with ggplot2 library(ggplot2) example <- ggplot() + geom_histogram(aes(x = diameters, y = ..density..), prob = TRUE, fill = alpha('white', 0), color = 'black') + geom_polygon(data = df, aes( x = x, y = y), color = 'white', fill = 'white') + geom_polygon(data = df, aes( x = x, y = y, alpha = Prob, group = Prob2)) + geom_polygon() + theme_bw() ggsave('example.jpg', example, width = 6, height = 4)

base

您应该可以使用R ggplot2执行类似的操作。您需要做的就是在您的直方图上绘制白色多边形,但在阴影多边形下。如果您决定使用我的?geom_histogram代码,则可能需要调整bin宽度(有关如何执行此操作的详细信息,请参阅{{1}})。