Может ли геометрическая функция ggplot2 быть разделена по значениям аргументов?

#r #ggplot2

#r #ggplot2

Вопрос:

Я хотел бы создать график ggplot2, ограняя geom_function, чтобы параметр функции менялся в зависимости от сетки. например, что-то вроде этого:

 my_function<-function(x, par)
{
 if(par==1)
 {
  return(sin(x))
 }
 else
 {
  return(cos(x))
 }
}

> head(data)
      x parameter
1 -1.00   1
2 -0.99   1
3 -0.98   1
4 -0.97   1
5 -0.96   1
6 -0.95   1

> tail(data)
       x parameter
397 0.95   2
398 0.96   2
399 0.97   2
400 0.98   2
401 0.99   2
402 1.00   2

> my_plot<-ggplot(data, aes(x))   geom_function(fun = my_function, args=list(par=parameter) facet_wrap(~parameter)
  

который не работает, потому что «параметр» не входит в область видимости для параметра args geom_function. Возможно ли это?

Ответ №1:

Я не думаю, что возможно сопоставить аргументы функции с аспектами, по крайней мере, не с geom_function() . Причина, по которой я думаю, заключается в том, что geom практически не видит ничего, что происходит с данными, а сама функция видит только последовательность вдоль оси x (и args аргумент). Тем не менее, я бы предложил следующий обходной путь, где вы делаете geom_function() для фасетов индивидуально, устанавливая столбец фасетирования для этого слоя. Пример ниже:

 library(ggplot2)

set.seed(0)
df <- data.frame(
  x = 1:10,
  y = 1:10 / 10,
  z = sample(LETTERS[1:2], 10, replace = TRUE)
)

ggplot(df)  
  geom_point(aes(x, y))  
  geom_function(data = transform(df, z = "A"),
                fun = dnorm, args = list(mean = 2.5, sd = 1))  
  geom_function(data = transform(df, z = "B"),
                fun = dnorm, args = list(mean = 7.5, sd = 2))  
  facet_wrap(~ z)
  

Создано 2020-09-17 пакетом reprex (версия 0.3.0)