Max
Max

Reputation: 13

How can I customize a loess fit inside a levelplot in R

I have created a levelplot in R that displays my data overlayed on a smoother contour plot using this code:

levelplot(chla_avg ~ lat * depth, trunc_level_test, ylim = c(275, 5), region = TRUE, col.regions = hcl.colors(110, palette = "spectral",rev=F), contour = FALSE, cuts = 100, panel = panel.levelplot.points) +
  layer_(panel.2dsmoother(..., n = 400, method = 'loess'))

This produces this image: levelplot

I love this graph. It displays exactly what I want except I don't love the fit of the loess model. Normal I could customize loess() but I can't figure out how to get panel.2dsmoother() to take my arguments. Ideally I would like to change the span and degree arguments of loess() to make the fit a little less smooth.

I've tried:

levelplot(chla_avg ~ lat * depth, trunc_level_test, ylim = c(275, 5), region = TRUE, col.regions = hcl.colors(110, palette = "spectral",rev=F), contour = FALSE, cuts = 100, panel = panel.levelplot.points) +
  layer_(panel.2dsmoother(..., n = 400, method = 'loess(span=0.1)'))

Which produces this error:

Error using packet 1
could not find function "loess(span=0.1)"

Clearly panel.2dsmoother is reinterpreting the function in a way I do not understand.

In the panel.2dsmoother documentation it says: "the smoothing model is constructed (approximately) as method(form, data = list(x=x, y=y, z=z), {args})." (panel.2dsmoother documentation) I cannot figure out how to pass my arguments to the loess function.

Is there anyway to customize loess inside panel.2dsmoother?

Upvotes: 1

Views: 148

Answers (1)

Allan Cameron
Allan Cameron

Reputation: 174616

You can pass extra arguments to the loess method using the args parameter of panel.2dsmoother. Just put the arguments inside a list.

Obviously, we don't have your data, but we can show the concept using the built in data set iris. First, we'll show the plot with the default arguments:

library(lattice)
library(latticeExtra)

levelplot(Sepal.Width ~ Petal.Width * Petal.Length, 
          iris,
          region = TRUE, 
          col.regions = hcl.colors(110, palette = "spectral", rev = F), 
          contour = FALSE) +
  layer_(panel.2dsmoother(..., n = 400, method = 'loess'))

enter image description here

Now let's use a smaller span value for our loess smoothing:

levelplot(Sepal.Width ~ Petal.Width * Petal.Length, 
          iris,
          region = TRUE, 
          col.regions = hcl.colors(110, palette = "spectral", rev = F), 
          contour = FALSE) +
  layer_(panel.2dsmoother(..., n = 400, method = 'loess', 
                         args = list(span = 0.2)))

enter image description here

Upvotes: 0

Related Questions