这个问题与a question I previously posted有些关系。 。然而,我已经缩小了我想要做的事情的范围,并且我觉得这个问题与我之前的问题有足够的不同,值得发表一个新帖子。
我正在向 R 中的绘图添加多条 (>50) 曲线。每条曲线都有相应的概率 (0-1)。我已按概率对曲线进行排序,并希望使用按概率加权的透明度 alpha
对每条曲线下方的区域进行着色。
我按概率按降序添加图。我想仅对每条曲线下方未被图表上当前任何曲线覆盖的部分进行着色。
我读过很多关于曲线之间或曲线下的阴影区域的文章,但我不知道如何仅对图表上任何其他图未覆盖的区域进行阴影处理。我希望这不会被视为重复。
- Shaded area under two curves using R
- Shading a kernel density plot between two points.
- How to make gradient color filled
timeseries plot in R - Shading between curves in R
这是一个示例图片(用 MS Paint 标记),显示我希望最终的绘图是什么样子(除了多边形内没有线条)。我在这个例子中使用了四条曲线,但当我弄清楚这一点时,我将添加更多曲线。我首先添加了响应最高的曲线,然后添加了每个后续曲线,仅对尚未填充的部分添加了阴影。
在上面的示例中,我使用lines
将曲线添加到图表中,然后在 MS Paint 中对它们进行着色。我知道要填充每条曲线下的区域,我需要将 polygon
与 border=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)
最佳答案
我认为这就是你想要的:
我不知道如何使用基本 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/