knitr::opts_chunk$set( collapse = TRUE, comment = "#>", out.width = "100%" )
library(khroma)
Tol (2021) offers carefully chosen schemes, ready for each type of data, with colors that are:
All the scales presented in Paul Tol's technical note (issue 3.2, 2021-08-18) are implemented here, for use with base R graphics, ggplot2 or ggraph.
According to Paul Tol's technical note, the bright, contrast, vibrant and muted color schemes are color-blind safe.
The light color scheme is reasonably distinct for both normal or color-blind vision and is intended to fill labelled cells.
The pale and dark schemes are not very distinct in either normal or color-blind vision and should be used as a text background or to highlight a cell in a table.
The qualitative color schemes must be used as given (no interpolation): colors are picked up to the maximum number of supported values. Refer to the original document for details about the recommended uses (see references).
| Scheme | Max. colors |
|:------------------|-------------:|
| bright
| 7 |
| high contrast
| 3 |
| vibrant
| 7 |
| muted
| 9 |
| medium contrast
| 3 |
| pale
| 6 |
| dark
| 6 |
| light
| 9 |
bright <- color("bright") plot_scheme(bright(7), colours = TRUE, names = TRUE, size = 0.9)
highcontrast <- color("high contrast") plot_scheme(highcontrast(3), colours = TRUE, names = TRUE, size = 0.9)
vibrant <- color("vibrant") plot_scheme(vibrant(7), colours = TRUE, names = TRUE, size = 0.9)
muted <- color("muted") plot_scheme(muted(9), colours = TRUE, names = TRUE, size = 0.9)
mediumcontrast <- color("medium contrast") plot_scheme(mediumcontrast(6), colours = TRUE, names = TRUE, size = 0.9)
pale <- color("pale") plot_scheme(pale(6), colours = TRUE, names = TRUE, size = 0.9) dark <- color("dark") plot_scheme(dark(6), colours = TRUE, names = TRUE, size = 0.9)
light <- color("light") plot_scheme(light(9), colours = TRUE, names = TRUE, size = 0.9)
If more colors than defined are needed from a given scheme, the color coordinates are linearly interpolated to provide a continuous version of the scheme.
| Scheme | Num. of colors | Bad data |
|:------------|----------------:|---------:|
| sunset
| 11 | #FFFFFF |
| nightfall
| 17 | #FFFFFF |
| BuRd
| 9 | #FFEE99 |
| PRGn
| 9 | #FFEE99 |
sunset <- color("sunset") plot_scheme(sunset(11), colours = TRUE, size = 0.9)
nightfall <- color("nightfall") plot_scheme(nightfall(17), colours = TRUE, size = 0.9)
BuRd <- color("BuRd") plot_scheme(BuRd(9), colours = TRUE, size = 0.9)
PRGn <- color("PRGn") plot_scheme(PRGn(9), colours = TRUE, size = 0.9)
If more colors than defined are needed from a given scheme, the color coordinates are linearly interpolated to provide a continuous version of the scheme, with the exception of the discrete rainbow scheme (see below).
| Scheme | Num. of colors | Bad data |
|:-------------------|----------------:|---------:|
| YlOrBr
| 9 | #888888 |
| iridescent
| 23 | #999999 |
| incandescent
| 11 | #888888 |
| discrete rainbow
| 23 | #777777 |
| smooth rainbow
| 34 | #666666 |
YlOrBr <- color("YlOrBr") plot_scheme(YlOrBr(9), colours = TRUE, size = 0.9)
iridescent <- color("iridescent") plot_scheme(iridescent(23), colours = TRUE, size = 0.5)
incandescent <- color("incandescent") plot_scheme(incandescent(11), colours = TRUE, size = 0.5)
As a general rule, ordered data should not be represented using a rainbow scheme. There are three main arguments against such use (Tol 2021):
If such use cannot be avoided, Paul Tol's technical note provides two color schemes that are reasonably clear in color-blind vision. To remain color-blind safe, these two schemes must comply with the following conditions:
discrete rainbow : This scheme must not be interpolated.
smooth rainbow : This scheme does not have to be used over the full range. Tol (2021) suggests starting at purple.
discrete_rainbow <- color("discrete rainbow") plot_scheme(discrete_rainbow(14), colours = TRUE, size = 0.7)
When using the smooth rainbow scheme:
smooth_rainbow <- color("smooth rainbow") ## Start at purple instead of off-white plot(smooth_rainbow(256, range = c(0.25, 1))) ## End at red instead of brown plot(smooth_rainbow(256, range = c(0, 0.9)))
set.seed(12345) plot_map(bright(7)) plot_map(vibrant(7)) plot_map(muted(9)) plot_map(light(9))
set.seed(12345) plot_map(sunset(11)) plot_map(nightfall(17)) plot_map(BuRd(9)) plot_map(PRGn(9))
plot_tiles(color("sunset")(128), n = 256) plot_tiles(color("nightfall")(128), n = 256) plot_tiles(color("BuRd")(128), n = 256) plot_tiles(color("PRGn")(128), n = 256)
set.seed(12345) plot_map(YlOrBr(9)) plot_map(iridescent(23)) plot_map(incandescent(11)) plot_map(discrete_rainbow(14)) plot_map(smooth_rainbow(23))
plot_tiles(color("YlOrBr")(128), n = 256) plot_tiles(color("iridescent")(128), n = 256) plot_tiles(color("incandescent")(128), n = 256) plot_tiles(color("smooth rainbow")(128), n = 256)
Tol, P. 2021. "Colour Schemes." Technical note SRON/EPS/TN/09-002 3.2. SRON. URL: https://personal.sron.nl/~pault/data/colourschemes.pdf.
Any scripts or data that you put into this service are public.
Add the following code to your website.
For more information on customizing the embed code, read Embedding Snippets.