Home > OS >  Develop a modified version of stat_contour
Develop a modified version of stat_contour

Time:05-27

I'm ultimately trying to plot contour plots, or "raster plots", of irregular datasets - a rather common question of course. Many solutions propose to interpolate the data first, and then plot it, for instance here : enter image description here

I would now trying to achieve the same thing with contours. Naively I tried

StatInterpContour <- ggproto("StatInterpContour", Stat,
                            compute_group = function(data, scales) {
                              
                              ii<-akima::interp(x = data$x,
                                                y = data$y,
                                                z = data$z)
                              
                              data.out <- tibble(x = rep(ii$x, nrow(ii$z)),
                                                 y = rep(ii$y, each = ncol(ii$z)),
                                                 z = as.numeric(ii$z) )
                              
                              #StatContour(data.out)
                              return(data.out)
                            },
                            
                            required_aes = c("x", "y", "z")
)

stat_interp_contour<- function(mapping = NULL, data = NULL, geom = "contour",
                              position = "identity", na.rm = FALSE, show.legend = NA,
                              inherit.aes = TRUE, ...) {
  layer(
    stat = StatInterpContour, data = data, mapping = mapping, geom = geom,
    position = position, show.legend = show.legend, inherit.aes = inherit.aes,
    params = list(na.rm = na.rm, ...)
  )
}

which is essentially the same as above. However it does not produce the expected result :

 ee %>% ggplot()   geom_contour(aes(x=x,y=y,z=z),stat=StatInterpContour)

enter image description here

In retrospect, this is not surprising. My stat is generating a regular data array, with neatly ordered values in x and y, but nowhere am I generating the actual lines. The contour lines are more complicated, seem to be generated by xyz_to_isolines in stat_contour (cf. enter image description here

  • Related