首页 > 解决方案 > 使用 stat_function 或 geom_function 时参考子集数据框

问题描述

我正在尝试使用仅包含模型系数的数据框绘制曲线。我想为一组中的每个代表创建一条曲线,但我不知道如何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))

在我的真实数据中,我facet_grid最后也有一个,因为还有两个分组。希望如果我们弄清楚这一点,一切都会体现在各个方面?

标签: rggplot2dplyr

解决方案


首先。ggplot2使用 a+而不是 pipe %>%

实现所需结果的一种方法是循环使用数据框的行,例如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组的曲线

reprex 包于 2021-06-03 创建 (v2.0.0 )


推荐阅读