Search code examples
rggplot2ggridges

Using R ggridges (R-joyplot) for bar charts


Is it possible to use the ggridges package to draw sets of bars instead of ridgelines, similar to geom_col()?

I have data such as:

dt = tibble(
    hr = c(1,2,3,4,1,2,3,4),
    fr = c(.1,.5,.9,.1,.4,.9,.9,.4),
    gr = c('Mon','Mon','Mon','Mon','Sun','Sun','Sun','Sun')
)

The plot below gives me:

ggplot(dt, aes(x=hr, y=gr, height=fr)) + 
  geom_ridgeline() + ylab(NULL)

enter image description here

As you can see it draws a line connecting the values. What I am looking for instead are individual columns, as in this plot:

ggplot(dt, aes(x=hr, y=fr)) + 
  geom_col() + ylab(NULL) +
  facet_wrap(~gr)

enter image description here


Solution

  • Here is a solution tracing out the individual bars.

    library(tidyverse)
    library(ggridges)
    
    dt = tibble(
      hr = c(1,2,3,4,1,2,3,4),
      fr = c(.1,.5,.9,.1,.4,.9,.9,.4),
      gr = c('Mon','Mon','Mon','Mon','Sun','Sun','Sun','Sun')
    )
    
    # function that turns an x, y pair into the shape of a bar of given width
    make_bar <- function(x, y, width = 0.9) {
      xoff <- width/2
      data.frame(x = c(x-xoff*(1+2e-8), x-xoff*(1+1e-8), x-xoff, x+xoff, x+xoff*(1+1e-8), x+xoff*(1+2e-8)),
                 height = c(NA, 0, y, y, 0, NA))
    }
    
    # convert data table using make_bar function
    dt %>%
      mutate(bars = map2(hr, fr, ~make_bar(.x, .y))) %>%
      unnest() -> dt_bars
    
    ggplot(dt_bars, aes(x=x, y=gr, height=height)) + 
      geom_ridgeline() + ylab(NULL)
    

    enter image description here