Search code examples
rggplot2plotgeom-area

geom_area with fill colour based on value


I'd like to make a geom_area plot with the fill colour based on the y (or any other) value, similar to the geom_density_ridges_gradient function of the ggridges package. I could achieve this with multiple geom_cols but I want to have the nice smooth geom_area style. Do you have any idea?

This code illustrates what I want to do:

data <- data.frame(x = 1:100,
                   y = rnorm(100, 20,3))


#I'd like to have an area plot with the fill colour based on the y values
ggplot(data = data, aes(x = x, y = y))+
  geom_area(aes(fill = y))

#As in a bar plot, but with a smooth area, not a composite of rectangles
ggplot(data = data, aes(x = x, y = y))+
  geom_col(aes(fill = y))

Thanks a lot!


Solution

  • You can use approx to get a huge number of interpolated values and plot them as very thin vertical geom_segments

    data2 <- as.data.frame(approx(data$x, data$y, seq(1, 100, len = 5000)))
    
    ggplot(data = data2, aes(x = x, y = y))+
      geom_segment(aes(xend = x, yend = 0, colour = y), linewidth = 0.1) +
      geom_area(fill = NA, color = "black") +
      scale_color_viridis_c() +
      theme_minimal(base_size = 20)
    

    enter image description here