Вы можете разделить данные, чтобы получить отдельное сглаживание для каждого фасета.
# 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
вектор)
split(df, df$cut)
1:length(unique(df$cut))
Эти аргументы затем передаются в mapply
через аргумент dots, который запускает функцию над каждым набором параметров, чтобы создать именованный список сглаживаний, которые автоматически добавляются к фасетам.