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

标签 r plot polygon fill

这个问题与a question I previously posted有些关系。 。然而,我已经缩小了我想要做的事情的范围,并且我觉得这个问题与我之前的问题有足够的不同,值得发表一个新帖子。

我正在向 R 中的绘图添加多条 (>50) 曲线。每条曲线都有相应的概率 (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

这是一个示例图片(用 MS Paint 标记),显示我希望最终的绘图是什么样子(除了多边形内没有线条)。我在这个例子中使用了四条曲线,但当我弄清楚这一点时,我将添加更多曲线。我首先添加了响应最高的曲线,然后添加了每个后续曲线,仅对尚未填充的部分添加了阴影。

enter image description here

在上面的示例中,我使用lines将曲线添加到图表中,然后在 MS Paint 中对它们进行着色。我知道要填充每条曲线下的区域,我需要将 polygonborder=NA 一起使用。这是我计划如何使用多边形来基于阴影的示例关于响应值。我当前的方法是使用 alpha 调整颜色,但如果有更实用的使用灰度调色板或渐变的方法,我愿意接受建议。

多边形(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)

最佳答案

我认为这就是你想要的:

enter image description here

我不知道如何使用基本 R 图形来执行此操作,但这是我更了解的 ggplot2 代码。请注意,ggplot2 要求将数据作为 data.frame 输入。另外,我创建了第二个概率列,以便我可以使用 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)。

关于r - 填充曲线下不与任何其他曲线重叠的区域,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29552111/

相关文章:

将数组 reshape 为距离矩阵(在 R 中)

r - 要在 map 上绘制的条形图

c++ - boost::geometry::covered_by 错误的结果

r - 箱线图 R 计算异常值

r - 按条件交换多列中的值

r - 删除R中不同数据集中的多列

math - 看起来像一个简单的图形问题

用于按值绘制线图颜色的 matlab colorbar

polygon - 在openscad中将圆形变形为椭圆形

c# - 如何判断两个多边形是否相交?