rggplot2visualizationggalt

ggplot2 - Incorporating scale_fill_manual with ggalt to create custom colour palette for dumbbell plot


I am working on building a plot to map intervals of time for several items of interest.

To do this, I have built a dumbbell plot with ggalt. I am trying to unify my colour schemes across multiple graphs to ensure the same time periods are the same colours across graphs. In particular, I am creating other graphics where "Interval 1" is important and highlighted elsewhere; having uniform colour schemes will help interpretation.

Can geom_dumbbell recognize my custom palette as I would for other plots usually? I would like to have the custom palette to be modifiable globally rather than being defined at each graph.

The only similar question that I can find is this one which unfortunately just overlays a geom_point to produce a legend... This might work but seems quite clunky.

library(ggplot2)
library(ggalt)

df <- tibble(x = c(4,6,5,8,10), y = c(8,9,10,12,15), z = c(14,12,14,15,18), d = c("A","B","C","D","E"))

legend_colors<- c("Interval 1" = viridis(1, option = "C", begin = 0, end = 0.1), 
                  "Interval 2" = viridis(1, option = "C", begin = 0.1, end = 0.2),
                  "Interval 3" = viridis(1, option = "C", begin = 0.5, end = 0.7))

df %>%
  ggplot() +
  geom_dumbbell(aes(x = x, 
                xend = y, 
                y = d), 
                colour = "Interval 1",
                colour_xend = "Interval 2",
                size = 2) +
  geom_dumbbell(aes(x = y,
                    xend = z, 
                    y = d),
                colour = "Interval 2",
                colour_xend = "Interval 3",
                size = 2) +
                scale_colour_manual(values = legend_colors) +
                theme_clean()

I want to produce a graphic like this but with colours that are defineable outside of the graph code itself. Sample Graphic


Solution

  • One option to achieve your desired result would be to reshape your data to long and use a geom_point + geom_line:

    library(ggplot2)
    library(viridis)
    library(ggthemes)
    library(tidyr)
    
    names(legend_colors) <- c("x", "y", "z")
    
    df |>
      pivot_longer(-d) |>
      ggplot(aes(value, d)) +
      geom_line(aes(group = d, color = name), size = 1) +
      geom_point(aes(color = name), size = 2) +
      scale_color_manual(
        values = legend_colors
      ) +
      theme_clean()
    

    enter image description here