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)))