2015-04-10 2 views
1

Эти вопросы несколько относятся к 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

Вот пример картина (размечена в MS Paint), что я хотел бы конечный участок, чтобы выглядеть (кроме без линий внутри полигонов). В этом примере я использовал четыре кривые, но я добавлю еще много, когда узнаю об этом. Сначала я добавил кривую с наивысшим ответом, затем каждую последующую кривую, затеняя только часть, которая еще не заполнена.

enter image description here

В приведенном выше примере я использовал 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) 
+1

Если вы просто удалите прозрачность, разве это не то, что вы хотите? – rawr

+0

@GNG Трюк состоит в том, чтобы добавить белый полигон за ваши цветные полигоны. Кроме того, в качестве долгосрочной цели программирования я бы предложил изучить «ggplot». –

+0

Также, @GNG, хорошая работа с воспроизводимым вопросом! –

ответ

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) 

Вы должны быть в состоянии сделать подобный трюк с baseR. Все, что вам нужно сделать, это нарисовать белые полигоны над вашей гистограммой, но под вашими затененными полигонами. Если вы решите использовать мой код ggplot2, вы, вероятно, захотите изменить ширину бина (см. ?geom_histogram для получения более подробной информации о том, как это сделать).

Смежные вопросы