Search code examples
rggplot2ggridges

How shade area under ggridges curve?


I would like to highlight in red all temperatures above 20 degrees in multiple plots created by ggridges

library(tidyverse)
library(ggridges)

ggplot(t2, aes(x = t, y = year)) +
  stat_density_ridges(geom = "density_ridges_gradient", quantile_lines = TRUE, quantiles = 2) +
  theme_ridges()

enter image description here

Output of dput(t2)

structure(list(Date = c("1853-01", "1853-02", "1853-03", "1853-04", 
"1853-05", "1853-06", "1853-07", "1853-08", "1853-09", "1853-10", 
"1853-11", "1853-12", "1854-01", "1854-02", "1854-03", "1854-04", 
"1854-05", "1854-06", "1854-07", "1854-08", "1854-09", "1854-10", 
"1854-11", "1854-12"), t = c(-5.6, -5.3, -1.5, 4.9, 9.8, 17.9, 
18.5, 19.9, 14.8, 6.2, 3.1, -4.3, -5.9, -7, -1.3, 4.1, 10, 16.8, 
22, 20, 16.1, 10.1, 1.8, -5.6), year = c("1853", "1853", "1853", 
"1853", "1853", "1853", "1853", "1853", "1853", "1853", "1853", 
"1853", "1854", "1854", "1854", "1854", "1854", "1854", "1854", 
"1854", "1854", "1854", "1854", "1854")), row.names = c(NA, -24L
), class = c("tbl_df", "tbl", "data.frame"), .Names = c("Date", 
"t", "year"))

Solution

  • We can do the following:

    gg <- ggplot(t2, aes(x = t, y = year)) +
        stat_density_ridges(
            geom = "density_ridges_gradient",
            quantile_lines = TRUE,
            quantiles = 2) +
        theme_ridges()
    
    # Build ggplot and extract data
    d <- ggplot_build(gg)$data[[1]]
    
    # Add geom_ribbon for shaded area
    gg +
        geom_ribbon(
            data = transform(subset(d, x >= 20), year = group),
            aes(x, ymin = ymin, ymax = ymax, group = group),
            fill = "red",
            alpha = 0.2);
    

    enter image description here

    The idea is to pull out the plot data from the ggplot build; we then subset the data for x >= 20, and add a geom_ribbon to shade the regions >=20 in all density ridges.

    Without transform(..., year = group)), there will be an error object 'year' not found; I'm not sure why this is, but adding transform(..., year = group) works.