R Нарисуйте несколько функций с разными параметрами на одном графике

Это продолжение сообщения о Draw min, max function in R

Я хотел бы нарисовать несколько функций с разными параметрами на одном графике. Но групповой аргумент ggplot, похоже, не работает.

Данные:

# data preparation/ load
feTargetPv <- structure(list(ModelYear = 2012:2016,
ComplianceCategory = c("pv","pv", "pv", "pv", "pv"),
fetargetfix = c(30.7, 31.4, 32.1, 33.3, 34.7),
a = c("35.95", "36.8", "37.75", "39.24", "41.09"),
b = c("27.95", "28.46", "29.03", "29.9", "30.96"),
c = c("0.0005308", "0.0005308", "0.0005308", "0.0005308", "0.0005308"),
d = c("0.006057", "0.00541", "0.004725", "0.003719", "0.002573")),
.Names = c("ModelYear", "ComplianceCategory", "fetargetfix", "a", "b", "c", "d"),
row.names = c(47L, 49L, 51L, 53L, 55L), class = "data.frame")

Функция:

my <- c(2012,2013, 2014)
eqs = function(x,my){
  1/(pmin(pmax(as.numeric(feTargetPv[which(feTargetPv$ModelYear == my),"c"]) * x +
                 as.numeric(feTargetPv[which(feTargetPv$ModelYear == my),"d"]),
               1/as.numeric(feTargetPv[which(feTargetPv$ModelYear == my),"a"])),
          1/as.numeric(feTargetPv[which(feTargetPv$ModelYear == my),"b"])))
}

График:

ggplot(data.frame(x=seq(from = 30, to = 75, by = 1)), aes(x), group = my, col = my) +
  stat_function(fun=eqs, args=my) + xlab("x") + ylab("y")

Сообщение об ошибке

Warning message:
Computation failed in `stat_function()`:
unused arguments (2013, 2014)

Как мне передать мои параметры в stat_function()?


person Bert Maier    schedule 17.08.2016    source источник
comment
Похоже, stat_function не любит рисовать несколько функций за вызов. Вероятно, лучшим решением было бы добавить несколько вызовов stat_function внутри цикла. См.: stackoverflow. ком/вопросы/24949065/   -  person jdobres    schedule 17.08.2016


Ответы (1)


Вместо использования stat_function вы можете рассчитать значения за год с помощью вашей функции вне ggplot, а затем использовать geom_line.

Вы можете начать с создания набора данных ваших значений x за каждый год, используя my в качестве переменной ModelYear.

dat = expand.grid(x=seq(from = 30, to = 75, by = 1), ModelYear = my)

Затем объедините ваши значения x с набором данных, который содержит значения параметров функции. По умолчанию сохраняется только информация для первого набора данных, dat.

dat2 = merge(dat, feTargetPv, by = "ModelYear")

Теперь ваша функция может принимать либо векторы x, a, b, c, d, либо набор данных и переменную x.

eqs = function(data, x){
    1/(pmin(pmax(as.numeric(data[,"c"]) * x +
                as.numeric(data[,"d"]),
               1/as.numeric(data[,"a"])),
           1/as.numeric(data[,"b"])))
}

Добавьте значения из функции в виде столбца в набор данных. Я называю эту новую переменную y.

dat2$y = eqs(dat2, dat2$x)

Теперь график прост, используя значения y для отображения положения y вместе с geom_line.

ggplot(dat2, aes(x, y, color = factor(ModelYear))) +
    geom_line()

введите здесь описание изображения

person aosmith    schedule 17.08.2016