--- title: "Sequential palettes" output: rmarkdown::html_vignette vignette: > %\VignetteIndexEntry{Sequential palettes} %\VignetteEngine{knitr::rmarkdown} %\VignetteEncoding{UTF-8} --- ```{r setup, include = FALSE} knitr::opts_chunk$set( collapse = TRUE, comment = "#>", fig.width = 7, fig.height = 4, dpi = 150, out.width = "100%" ) palette_viewer <- function(pal_name) { pal <- circadia::circadia_palette(pal_name) nms <- if (is.null(names(pal))) paste0("stop ", seq_along(pal)) else names(pal) cols <- unname(pal) swatches <- mapply(function(col, nm) { r <- strtoi(substr(col, 2, 3), 16L) g <- strtoi(substr(col, 4, 5), 16L) b <- strtoi(substr(col, 6, 7), 16L) lum <- (0.299 * r + 0.587 * g + 0.114 * b) / 255 tc <- if (lum > 0.55) "#333333" else "#ffffff" sprintf( '
%s
', col, col, tc, col, col ) }, cols, nms, SIMPLIFY = TRUE) htmltools::HTML(sprintf( '
%s
', paste(swatches, collapse = "\n") )) } ``` ```{r, message = FALSE} library(circadia) library(ggplot2) library(patchwork) ``` Sequential palettes map a continuous range from low (light) to high (saturated). circadia provides two families: | Family | Palettes | Hue strategy | |---|---|---| | Complex | `blues`, `warm` | Multi-hue — higher perceptual contrast | | Simple | `seq_blue`, `seq_coral`, `seq_amber`, `seq_ochre` | Monochromatic shades — consistent hue identity | Use **complex** palettes when maximum contrast across the range matters. Use **simple** palettes when you want the colour to stay clearly associated with a particular brand colour throughout its range. ## Complex sequential ### `blues` Six stops from deep blue to pale teal — suited to density, intensity, or frequency data. ```{r blues-viewer, echo = FALSE, results = "asis"} palette_viewer("blues") ``` ```{r blues-density, fig.alt = "2D density heatmap using the blues palette"} ggplot(faithfuld, aes(waiting, eruptions, fill = density)) + geom_tile() + scale_fill_circadia_c("blues") + labs(title = "Old Faithful eruption density — blues", x = "Waiting time (min)", y = "Eruption duration (min)") + theme_circadia(grid = "none") ``` ### `warm` Five stops from coral to antique white — suited to warm-toned data such as body temperature, light exposure, or alertness ratings. ```{r warm-viewer, echo = FALSE, results = "asis"} palette_viewer("warm") ``` ```{r warm-density, fig.alt = "2D density heatmap using the warm palette"} ggplot(faithfuld, aes(waiting, eruptions, fill = density)) + geom_tile() + scale_fill_circadia_c("warm") + labs(title = "Old Faithful eruption density — warm", x = "Waiting time (min)", y = "Eruption duration (min)") + theme_circadia(grid = "none") ``` ## Simple sequential Each simple palette is a monochromatic ramp of one brand colour, running from a pale tint to the full saturated value. Use these when the hue itself carries meaning — e.g. `seq_blue` for sleep depth, `seq_ochre` for light exposure intensity. ```{r simple-viewers, echo = FALSE, results = "asis"} htmltools::tagList( htmltools::tags$p(htmltools::tags$strong("seq_blue")), palette_viewer("seq_blue"), htmltools::tags$p(htmltools::tags$strong("seq_coral")), palette_viewer("seq_coral"), htmltools::tags$p(htmltools::tags$strong("seq_amber")), palette_viewer("seq_amber"), htmltools::tags$p(htmltools::tags$strong("seq_ochre")), palette_viewer("seq_ochre") ) ``` ```{r simple-grid, fig.width = 8, fig.height = 6, fig.alt = "Four density heatmaps each using a different simple sequential palette"} make_tile <- function(pal) { ggplot(faithfuld, aes(waiting, eruptions, fill = density)) + geom_tile() + scale_fill_circadia_c(pal) + labs(title = pal, x = NULL, y = NULL) + theme_circadia(grid = "none") + theme( plot.title = element_text(size = 11), axis.text = element_blank(), axis.ticks = element_blank(), legend.position = "none" ) } (make_tile("seq_blue") + make_tile("seq_coral")) / (make_tile("seq_amber") + make_tile("seq_ochre")) ``` ## Combining with `theme_circadia()` All continuous scales compose naturally with `theme_circadia()`: ```{r combined, fig.alt = "Scatter plot with continuous colour scale and theme_circadia"} ggplot(mtcars, aes(wt, mpg, colour = hp)) + geom_point(size = 3) + scale_colour_circadia_c("blues") + labs( title = "Weight, efficiency and horsepower", colour = "HP", x = "Weight (1000 lbs)", y = "Miles per gallon" ) + theme_circadia() ``` ## Reversing Pass `reverse = TRUE` to any continuous scale to flip the direction — useful when lower values should map to the saturated end: ```{r reverse, fig.alt = "Density heatmap with reversed blues palette"} ggplot(faithfuld, aes(waiting, eruptions, fill = density)) + geom_tile() + scale_fill_circadia_c("blues", reverse = TRUE) + labs(title = "Reversed blues — high density = light", x = "Waiting time (min)", y = "Eruption duration (min)") + theme_circadia(grid = "none") ```