【问题标题】:How can I calculate an entire family of smooths using geom_smooth() and display each one using facet_wrap()?如何使用 geom_smooth() 计算整个平滑系列并使用 facet_wrap() 显示每个平滑?
【发布时间】:2021-07-16 01:03:38
【问题描述】:

geom_smooth() 的文档中,有一个示例显示如何使用@ 的参数设置将B 样条平滑拟合到tidyverse mpg datasethwydispl 列987654323@df=3的函数:

我想重复同样的例子,但不是只计算一个单一的平滑设置为df 参数,我想使用df 值的范围(例如,3 , 5, 7, 9) 来计算一系列平滑,然后使用facet_wrap() 在单独的面板中显示每个平滑(此外,我还想在平滑曲线周围显示灰色阴影置信区间)。但是,我不太清楚应该使用什么语法,或者 ggplot2 是否甚至可以灵活地直接在 geom_smooth() 内部支持这样的计算。

我在下面发布了一个 MWE:

library(tidyverse)
library(splines)

# ---- Preface with optional additional problem context ----

# This fits 4 different B-splines to the "hwy" vs. "displ" columns of the 
# tidyverse "mpg" tibble, with the bs() df parameter set to c(3, 5, 7, 9).
# This is essentially representative of the kind of result I want, except
# that instead of computing it externally and saving the result to a list
# as I've done here, I want to do it automatically inside of geom_smooth().
fitobj <- list()
for(ii in seq(3,9,2)) {
  fitobj[[as.character(ii)]] <- lm(formula = hwy ~ bs(displ, df=ii), data=mpg)
}

# ---- MWE really starts here ----

# Make 4 identical copies of the "mpg" tibble, with an extra column tacked
# onto the right containing values 3, 5, 7, 9
mpg_rep <- NULL
for(ii in seq(3,9,2)) {
    tbl <- mpg
    tbl$splinedf <- ii
    mpg_rep <- bind_rows(mpg_rep, tbl)  
}

# Make a baseline plot; smooths will be appended afterward
plt <- ggplot(mpg_rep, aes(x=displ, y=hwy, group=splinedf)) +
       geom_point() +
       facet_wrap(~splinedf)

# This does _almost_ what I want, except that instead of plotting a different
# smooth in each panel, it plots the same smooth four times redundantly
print(plt + geom_smooth(method = lm, formula = y ~ bs(x, df=3)))

# This looks like it has sort of the right syntax to do what I want, however
# it returns an error message; I guess perhaps because I'm not allowed to
# reference an aesthetic like this inside a formula?
print(plt + geom_smooth(method = lm, formula = y ~ bs(x, df=splinedf)))

这是一个示例输出,看起来几乎与我想要的一样,除了我想要 4 次不同的平滑而不是相同的平滑 4 次:

如何修改 MWE 以使其完全符合我的要求?

【问题讨论】:

  • 我不知道如何做你想做的事——我不认为geom_smooth() 有那么灵活。如果您有兴趣,我可以给出一个答案,使用 tidyverse 工具相当有效地构建曲线数据并生成绘图。但是,如果您确定对在 geom_smooth() 内部工作的解决方案感兴趣,我不会打扰...
  • @BenBolker:如果您的解决方案还包括如何构建置信区间并在主蓝线周围以灰色阴影显示它们的说明(类似于geom_smooth() 在计算平滑时所做的方式)内部)然后是的,我会对此感兴趣,作为一种解决方案。但如果它只是使用额外的数据框或小标题单独叠加拟合的蓝色曲线(没有置信区间),那么我会说也许不要打扰。

标签: r ggplot2 lm smoothing facet-wrap


【解决方案1】:

您可以lapply() 平滑图层以添加到绘图中,同时提供新的构面变量。

library(ggplot2)

ggplot(mpg, aes(displ, hwy)) +
  geom_point() +
  lapply(c(3,5,7,9), function(i) {
    geom_smooth(
      data = ~ cbind(., facet = i),
      method = lm,
      formula = y ~ splines::bs(x, i)
    )
  }) +
  facet_wrap(vars(facet))

reprex package (v1.0.0) 于 2021-04-21 创建

【讨论】:

  • 哇;非常有趣的技术。在此之前,我从未遇到过嵌套有 lapply() 表达式的 ggplot 表达式,我什至不知道有人可以做到这一点。我今天刚学了一些高级R;感谢您抽出宝贵时间回复。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-06-16
  • 1970-01-01
  • 2010-09-17
  • 2020-07-12
  • 2013-12-24
  • 1970-01-01
相关资源
最近更新 更多