R: Подгоните пользовательский полином n-й степени к каждому фасету в facet_wrap'd ggplot - PullRequest
0 голосов
/ 27 октября 2018

Я пытаюсь подобрать уникальный полином 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 голосов
/ 28 октября 2018

Вы можете разделить данные, чтобы получить отдельное сглаживание для каждого фасета.

# 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 вектор)

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

Эти аргументы затем передаются в mapply через аргумент dots, который запускает функцию над каждым набором параметров, чтобы создать именованный список сглаживаний, которые автоматически добавляются к фасетам.

...