1

I'm trying to emulate a Google Sheets smoothed line chart with ggplot2. It draws a smoothed line through all data points.

plot in Google Sheets: enter image description here The lines above and below is my hardcoded confidence intervals.

data:

library(tidyverse)
data <- tibble(
    date = seq.Date(as.Date("2018-12-01"), as.Date("2018-12-20"), by = "days"),
    var = c(0.329,0.348,0.349,0.355,0.382,0.363,0.340,0.359,0.336,0.358,0.398,0.389,0.389,0.390,0.383,0.343,0.352,0.415,0.397,0.430),
    lower = c(0.311,0.330,0.330,0.336,0.364,0.345,0.321,0.342,0.319,0.341,0.384,0.375,0.375,0.374,0.369,0.329,0.337,0.400,0.382,0.417),
    upper = c(0.347,0.366,0.368,0.374,0.400,0.381,0.358,0.377,0.354,0.375,0.413,0.404,0.403,0.405,0.397,0.357,0.368,0.430,0.412,0.444))

I almost get the same curve with loess. But it gives me a warning and a strange sharp-looked areas at some points.

code:

ggplot(data, aes(x = seq_along(date), y = var)) + 
    geom_point(size = 2, color = "blue", alpha = 0.2) +
    # geom_smooth(method = "lm", formula = y ~ splines::bs(x, 20), se = F) +
    # stat_smooth(method = "gam", formula = y ~ s(x, k = 19), se = F) +
    stat_smooth(method = "loess", span = 0.2, se = F) +
    theme_classic() + theme(axis.line = element_line(size = 0.5, colour = "grey80"))

warning:

Warning messages:
1: In simpleLoess(y, x, w, span, degree = degree, parametric = parametric,  :
    Chernobyl! trL>n 20
2: In simpleLoess(y, x, w, span, degree = degree, parametric = parametric,  :
    Chernobyl! trL>n 20
3: In sqrt(sum.squares/one.delta) : NaNs produced

R plot: enter image description here

1
  • Not quite a duplicate, but this should help: stackoverflow.com/q/35205795/5325862 Google Sheets might be doing LOESS behind the scenes, but instead some other way of calculating smooth curves between points Commented Dec 22, 2018 at 15:40

1 Answer 1

3

Just for the visualisation you can try awesome ggalt package by @hrbrmstr.

ggalt::geom_xspline draws x-spline.

library(ggalt)
library(tidyverse)

data <- tibble(
    date = seq.Date(as.Date("2018-12-01"), as.Date("2018-12-20"), by = "days"),
    var = c(0.329,0.348,0.349,0.355,0.382,0.363,0.340,0.359,0.336,0.358,0.398,0.389,0.389,0.390,0.383,0.343,0.352,0.415,0.397,0.430),
    lower = c(0.311,0.330,0.330,0.336,0.364,0.345,0.321,0.342,0.319,0.341,0.384,0.375,0.375,0.374,0.369,0.329,0.337,0.400,0.382,0.417),
    upper = c(0.347,0.366,0.368,0.374,0.400,0.381,0.358,0.377,0.354,0.375,0.413,0.404,0.403,0.405,0.397,0.357,0.368,0.430,0.412,0.444))

ggplot(data, aes(seq_along(date), var)) + 
    geom_point(size = 2, color = "blue", alpha = 0.2) +
    geom_xspline() +
    theme_classic() + 
    theme(axis.line = element_line(size = 0.5, colour = "grey80"))

enter image description here

Sign up to request clarification or add additional context in comments.

Comments

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.