R:将自定义n次多项式拟合到facet_wrap ggplot

时间:2018-10-27 17:31:09

标签: r ggplot2 linear-regression curve-fitting

我正在尝试将独特的n次多项式拟合拟合到多面包裹的ggplot中的每个小面上,但似乎无法完全解决这个问题。

一个人可以对以下所有面使用统一的1级线性拟合:

library(ggplot2)

df <- diamonds

polys <- c(2, 2, 2, 2, 2)

custom.smooth <- function(formula, data,...) {
  smooth.call <- match.call()
  smooth.call[[1]] <- lm
  eval.parent(smooth.call)
}

ggplot(df, aes(x=carat, y=price)) +
  geom_point(alpha=0.1) +
  facet_wrap(~cut, scales='free') +
  stat_smooth(method='custom.smooth')

我不知道如何使用ith中的polys整数作为图中ith构面的多项式度。

有人知道如何实现此行为吗?别人能提供的任何帮助将不胜感激!

1 个答案:

答案 0 :(得分:1)

您可以拆分数据以为每个构面生成单独的平滑度。

# set up
library(ggplot2)

df <- diamonds
custom.smooth <- function(formula, data,...) {
  smooth.call <- match.call()
  smooth.call[[1]] <- lm
  eval.parent(smooth.call)
}

运行功能

ggplot(df, aes(x=carat, y=price)) +
  geom_point(alpha=0.1) +
  facet_wrap(~cut, scales='free') +
  mapply(function(dat, i) 
         stat_smooth(data=dat, method='custom.smooth', formula=y~poly(x, i)),
         dat=split(df, df$cut), i=1:length(unique(df$cut)))

生产

enter image description here


mapply使用一个函数来应用于多个参数。首先定义一个带有两个参数的函数:1)数据,2)多项式。这与定义任何其他功能没什么不同

function(dat, i) stat_smooth(data=dat, 
                             method='custom.smooth', 
                             formula=y~poly(x, i))  

然后,将参数定义为数据:将原始数据划分为每个方面中使用的数据,并定义一个度数为1到5的向量(这可以是您的polys向量)< / p>

split(df, df$cut)
1:length(unique(df$cut))

然后,这些参数通过点参数传递到mapply,点参数在每个参数集上运行该函数,以生成一个已命名的平滑列表,这些列表会自动添加到构面上。