Заштрихованный субрегион под кривой Вейбулла в R - PullRequest
0 голосов
/ 27 февраля 2019

Я хочу сделать что-то вроде рисунка с распределением Вейбулла.enter image description here

Но почему-то я не могу заставить его работать, используя stat_function.Я получаю argument missing ошибок.Добавление args=list(..) не работает.

limitRange <- function(fun, min, max) {
  function(x) {
    y <- fun(x)
    y[x < min  |  x > max] <- NA
    return(y)
  }
}      

ggplot(data.frame(x=c(0,3)), aes(x)) +
  stat_function(fun = dweibull, 
                args = list(shape = 2, scale = 1.12), alpha = .8, size = 1.1) + # works
  stat_function(fun = limitRange(dweibull(shape = 2, scale = 1.12), 0.0297, 0.1189),
                args = list(shape = 2, scale = 1.12), #doesn't work
                geom = "area", fill = "blue", alpha = 0.2) 

Любая помощь приветствуется.

1 Ответ

0 голосов
/ 27 февраля 2019

Ваша проблема в том, как вы звоните limitRange.Его первый аргумент должен быть функцией, но вы даете ему dweibull(shape = 2, scale = 1.12), который не является функцией.Фактически, это вызывает ошибку:

dweibull(shape = 2, scale = 1.12)
# Error in dweibull(shape = 2, scale = 1.12) : 
#  argument "x" is missing, with no default

Превращение этого в функцию работает:

ggplot(data.frame(x = c(0, 2)), aes(x)) +
  stat_function(fun = dweibull,
                args = list(shape = 2, scale = 1.12)) +
  stat_function(
    fun = limitRange(function(z) dweibull(z, shape = 2, scale = 1.12), 0.0297, 0.1189),
    geom = "area",
    fill = "blue",
    alpha = 0.2
  ) 

В целом более чистый способ будет дать limitRange a ... аргумент для fun:

limitRange <- function(fun, ..., min, max) {
  return(function(x) {
    y <- fun(x, ...)
    y[x < min  |  x > max] <- NA
    return(y)
  })
}

ggplot(data.frame(x = c(0, 2)), aes(x)) +
  stat_function(fun = dweibull,
                args = list(shape = 2, scale = 1.12)) +
  stat_function(
    fun = limitRange(dweibull, shape = 2, scale = 1.12, min = 0.0297,  max = 0.1189)
    geom = "area",
    fill = "blue",
    alpha = 0.2
  ) 

Вам необходимо будет указать аргументы min и max таким образом (и это может привести к ошибкам, если fun принимает min и maxаргументы ... больше уникальных имен может быть лучше).

...