Эти вопросы несколько относятся к a question I previously posted. Тем не менее, я сузил точно то, что я пытаюсь сделать, и я чувствую, что этот вопрос отличается от моего предыдущего вопроса, чтобы заслужить новую должность.Заполните область под кривой, которая не перекрывает никаких других кривых
Я добавляю несколько (> 50) кривых к графику в R. Каждая кривая имеет соответствующую вероятность (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
, но если есть более практичный подход с использованием поддона или градиента серой шкалы, я открыт для предложений.
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)
Если вы просто удалите прозрачность, разве это не то, что вы хотите? – rawr
@GNG Трюк состоит в том, чтобы добавить белый полигон за ваши цветные полигоны. Кроме того, в качестве долгосрочной цели программирования я бы предложил изучить «ggplot». –
Также, @GNG, хорошая работа с воспроизводимым вопросом! –