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

Fill area under a curve that does not overlap any other curves

这个问题和a question I previously posted有点关系。但是,我已经缩小了我想做的事情的范围,我觉得这个问题与我之前的问题有很大的不同,需要一个新的 post.

我正在向 R 中的绘图添加多条 (>50) 条曲线。每条曲线都有对应的概率 (0-1)。我已按概率对曲线进行排序,并希望使用按概率加权的透明度 alpha 对每条曲线下方的区域进行阴影处理。

我按概率降序添加地块。我想遮蔽 只是 每条曲线下未被图表上当前任何曲线覆盖的部分。

我已经阅读了很多关于曲线之间或曲线下阴影区域的 post 文章,但我不知道如何阴影 只是 没有被任何覆盖的区域图上的其他图。我希望这不会被视为重复。

  1. Shaded area under two curves using R
  2. 着色内核密度 两点之间的情节。
  3. 如何让渐变色填充
    R
  4. 中的时间序列图
  5. Shading between curves in R

这是我希望最终绘图看起来像的示例图片(在 MS 绘图中标记)(多边形内没有线条除外)。我在这个例子中使用了 4 条曲线,但当我弄清楚时我会添加更多。我首先添加具有最高响应的曲线,然后添加每个后续曲线,仅对尚未填充的部分进行着色。

在上面的示例中,我使用 lines 将曲线添加到图形中,然后在 MS 画图中对它们进行着色。我知道要填写每条曲线下的区域,我需要使用 polygonborder=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)

我想这就是你想要的:

我不知道如何使用基础 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 代码,您可能需要调整 bin 宽度(有关如何执行此操作的详细信息,请参阅 ?geom_histogram)。