How to make gradient color filled timeseries plot in R

前端 未结 4 1161
轻奢々
轻奢々 2020-11-30 00:48

How to fill area under and above (sp)line with gradient color?

This example has been drawn in Inkscape - BUT I NEED vertica

4条回答
  •  自闭症患者
    2020-11-30 01:27

    This is a terrible way to trick ggplot into doing what you want. Essentially, I make a giant grid of points that are under the curve. Since there is no way of setting a gradient within a single polygon, you have to make separate polygons, hence the grid. It will be slow if you set the pixels too low.

    gen.bar <- function(x, ymax, ypixel) {
      if (ymax < 0) ypixel <- -abs(ypixel)
      else ypixel <-  abs(ypixel)
      expand.grid(x=x, y=seq(0,ymax, by = ypixel))
    }
    
    # data must be in x order.
    find.height <- function (x, data.x, data.y) {
      base <- findInterval(x, data.x)
      run <- data.x[base+1] - data.x[base]
      rise <- data.y[base+1] - data.y[base]
      data.y[base] + ((rise/run) * (x - data.x[base]))
    }
    
    make.grid.under.curve <- function(data.x, data.y, xpixel, ypixel) {
      desired.points <- sort(unique(c(seq(min(data.x), max(data.x), xpixel), data.x)))
      desired.points <- desired.points[-length(desired.points)]
    
      heights <- find.height(desired.points, data.x, data.y)
      do.call(rbind, 
              mapply(gen.bar, desired.points, heights, 
                     MoreArgs = list(ypixel), SIMPLIFY=FALSE))
    }
    
    xpixel = 0.01
    ypixel = 0.01
    library(scales)
    grid <- make.grid.under.curve(data$time, data$value, xpixel, ypixel)
    ggplot(grid, aes(xmin = x, ymin = y, xmax = x+xpixel, ymax = y+ypixel, 
                     fill=abs(y))) + geom_rect() 
    

    The colours aren't what you wanted, but it is probably too slow for serious use anyway.

    enter image description here

提交回复
热议问题