我正在尝试将独特的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
构面的多项式度。
有人知道如何实现此行为吗?别人能提供的任何帮助将不胜感激!
答案 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)))
生产
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
,点参数在每个参数集上运行该函数,以生成一个已命名的平滑列表,这些列表会自动添加到构面上。