[R] ggplot stat smooth and poly

Deepayan Sarkar deep@y@n@@@rk@r @end|ng |rom gm@||@com
Sun Apr 5 13:46:11 CEST 2020


On Thu, Apr 2, 2020 at 6:10 PM PIKAL Petr <petr.pikal using precheza.cz> wrote:

> Dear all
>
> I am not sure, but I believe that in past it was possible to add smoothing
> lines in ggplot even if some group did not have enough points to perform
> calculation (although I did not find any version which could deliver it).
>
> Here is the code and data
>
> library(ggplot2)
> p <- ggplot(test, aes(x=one, y=two, colour=three))
> p+geom_point(size=5)+stat_smooth(method="lm")
> ***line added to each group
>
> p+geom_point(size=5)+stat_smooth(method="lm", formula=y~poly(x,2))
> Warning message:
> Computation failed in `stat_smooth()`:
> 'degree' must be less than number of unique points
> ***no line added to any group
>
> test <- structure(list(one = 1:20, two = c(1L, 4L, 9L, 16L, 25L, 36L,
> 49L, 64L, 81L, 100L, 121L, 144L, 169L, 196L, 225L, 256L, 289L,
> 324L, 361L, 400L), three = c("a", "a", "a", "a", "b", "b", "b",
> "b", "c", "c", "c", "c", "c", "d", "d", "e", "e", "e", "e", "e"
> )), class = "data.frame", row.names = c(NA, -20L))
>
> My question:
> Is it possible to add smoothing line just to the groups where it can be
> added? I know that I could exclude "d" level from my data but I would
> prefer
> to keep them and add only smoothing lines where they could be computed.
>

Looks like there's a tryCatch around each panel, but not for each group
within panel. So this would work:

p + geom_point(size=2) + facet_wrap(~three) +
    stat_smooth(method="lm", formula=y~poly(x,2))

but one problematic group is enough to make a whole panel fail.

Other than rewriting StatSmooth$compute_panel to protect each per-group
call, a workaround could be to replace method="lm" by a safe wrapper, e.g.,:

plm <- function(formula, data, ...)
{
    ocall <- match.call(expand.dots = TRUE)
    ocall[[1]] <- quote(lm)
    fm <- try(eval(ocall, parent.frame()), silent = TRUE)
    if (inherits(fm, "try-error"))
    {
        ocall[[2]] <- y ~ x
        fm <- eval(ocall, parent.frame())
    }
    fm
}

p + geom_point(size=2) + stat_smooth(method=plm, formula=y~poly(x,2))

-Deepayan

Best regards
> Petr
> ______________________________________________
> R-help using r-project.org mailing list -- To UNSUBSCRIBE and more, see
> https://stat.ethz.ch/mailman/listinfo/r-help
> PLEASE do read the posting guide
> http://www.R-project.org/posting-guide.html
> and provide commented, minimal, self-contained, reproducible code.
>

	[[alternative HTML version deleted]]



More information about the R-help mailing list