В вашем коде для stat_movingwindow
строка для соответствующего geom: geom = "smooth"
:
stat_movingwindow <- function(mapping = NULL, data = NULL,
fun = function(d) quantile(d, probs = c(0.05, 0.50, 0.95), na.rm = TRUE),
wStep = 0.1, wSize = 1,
geom = "smooth", # <- look here
position = "identity", show.legend = NA, inherit.aes = TRUE,
...
){
layer(
stat = StatMovingWindow, data = data, mapping = mapping, geom = geom,
position = position, show.legend = show.legend, inherit.aes = inherit.aes,
params = list(wStep = wStep, wSize = wSize, fun = fun, ...)
)
}
Проверяя код для geom_smooth
, мы видим, что он включает параметр se = TRUE
,и использует GeomSmooth
в качестве своего geom:
> geom_smooth
function (mapping = NULL, data = NULL, stat = "smooth", position = "identity",
..., method = "auto", formula = y ~ x, se = TRUE, # <- look here
na.rm = FALSE,
show.legend = NA, inherit.aes = TRUE)
{
params <- list(na.rm = na.rm, se = se, ...)
if (identical(stat, "smooth")) {
params$method <- method
params$formula <- formula
}
layer(data = data, mapping = mapping, stat = stat, geom = GeomSmooth, # <- and here
position = position, show.legend = show.legend, inherit.aes = inherit.aes,
params = params)
}
Копая глубже в GeomSmooth, мы видим, что его функция draw_group
(которая отвечает за построение сглаженной линии) имеет se = FALSE
в качестве параметра по умолчанию.
Из кода, если se == FALSE
, has_ribbon
также будет FALSE
, хотя в ваших данных есть и ymax
, и ymin
, благодаря функции StatMovingWindow$compute_group
.А это в свою очередь означает, что единственный результат GeomLine$draw_panel(path, panel_params, coord)
будет возвращен один, без GeomRibbon$draw_group(ribbon, panel_params, coord)
.
> GeomSmooth$draw_group
<ggproto method>
<Wrapper function>
function (...)
f(...)
<Inner function (f)>
function (data, panel_params, coord, se = FALSE) # <- look here
{
ribbon <- transform(data, colour = NA)
path <- transform(data, alpha = NA)
has_ribbon <- se && !is.null(data$ymax) && !is.null(data$ymin) # <- and here
gList(if (has_ribbon) GeomRibbon$draw_group(ribbon, panel_params, coord),
GeomLine$draw_panel(path, panel_params, coord))
}
Короче говоря, параметр geom_smooth
по умолчанию se = TRUE
переопределяет поведение по умолчаниюв GeomSmooth$draw_group
, (то же самое относится и к stat_smooth
), и мы должны сделать то же самое в stat_movingwindow
, если мы хотим достичь того же результата.
Если вы ожидаете, что обычно вам понадобится лентадля построения графика вы можете включить se = TRUE
в качестве параметра в ваше определение для stat_movingwindow
.Если это будет происходить на разовой основе, вы можете вместо этого включить его в свой код вместо этого.