Возвращайтесь к фрейму данных подмножества при использовании stat_function или geom_function

#r #ggplot2 #dplyr

Вопрос:

Я пытаюсь построить кривые, используя фрейм данных, который включает только коэффициенты модели. Мне бы хотелось, чтобы для каждого представителя в группе была одна кривая, но я не могу понять, как stat_function найти соответствующие коэффициенты. Вот репрекс с (неудачным) методом, который я пробовал.

 df <- data.frame(cohort = c("la", "la", "la", "li", "li", "li", "lo", "lo", "lo"), 
             rep = c(1, 2, 3, 1, 2, 3, 1, 2, 3), 
             coef_a = c(0.000000308, -0.000000179, -0.000000219, -0.000000195,
                        -0.000000179, -0.000000219, -0.000000195,-0.000000308, -0.000000179),
             coef_b = c(-0.0168, 0.0112, 0.0126, 0.0119, 0.0112, 0.0126, 0.0119, -0.0168, 
                         0.0112), 
             coef_c = c(437, 9.90, 1.56, 44.5, 9.90, 1.56, 44.5,437, 9.90)) 


curve <- function(x, a, b, c){a * x^2   b * x   c}


df %>%
  filter(cohort == "la") %>%
  ggplot(aes(color = rep))  
  xlim(20000, 50000)  
  stat_function(fun = curve, args = list(a = .a, b = .b, c = .c))
 

В моих реальных данных у меня также есть a facet_grid в конце, потому что есть еще две группы. Надеюсь, если мы разберемся в этом, все дойдет до граней?

Ответ №1:

Прежде всего. ggplot2 использует вместо трубы %>% .

Одним из подходов для достижения желаемого результата было бы перебирать строки вашего фрейма данных, используя, например purrr::pmap , список stat_function слоев, которые затем можно добавить в ваш ggplot, например:

 df <- data.frame(cohort = c("la", "la", "la", "li", "li", "li", "lo", "lo", "lo"), 
                 rep = c(1, 2, 3, 1, 2, 3, 1, 2, 3), 
                 coef_a = c(0.000000308, -0.000000179, -0.000000219, -0.000000195,
                            -0.000000179, -0.000000219, -0.000000195,-0.000000308, -0.000000179),
                 coef_b = c(-0.0168, 0.0112, 0.0126, 0.0119, 0.0112, 0.0126, 0.0119, -0.0168, 
                            0.0112), 
                 coef_c = c(437, 9.90, 1.56, 44.5, 9.90, 1.56, 44.5,437, 9.90)) 


curve <- function(x, a, b, c){a * x^2   b * x   c}

library(purrr)
library(ggplot2)
library(dplyr)

layer_fun <- df %>%
  filter(cohort == "la") %>%
  pmap(function(...) {
  args <- list(...)
  stat_function(fun = curve, args = list(a = args$coef_a, b = args$coef_b, c = args$coef_c))
})

  ggplot(df, aes(color = rep))  
  xlim(20000, 50000)  
  layer_fun
 

кривые из группы la

Создано 2021-06-03 пакетом reprex (v2.0.0)

Комментарии:

1. Фильтр и эстетика здесь не прошли, но я внес несколько правок, чтобы фильтр работал. Спасибо!