#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
Создано 2021-06-03 пакетом reprex (v2.0.0)
Комментарии:
1. Фильтр и эстетика здесь не прошли, но я внес несколько правок, чтобы фильтр работал. Спасибо!