Introduction

Color can be a very effective way to distinguish between different groups within a data visualization. Color is a “preattentive” visual feature, meaning that groups are identified rapidly and without conscious effort (Ware 2012). For example, it is trivial to identify the two groups of points in the scatterplot in Figure @ref(fig:colorcatcont).

Employing color to represent values on a continuous numeric scale will be less successful (Cleveland and McGill 1984), but color can still be useful to convey additional variables when more effective visual features, such as location, have already been used. For example, color might be used to fill in different regions on a map, as demonstrated in the right hand plot of Figure @ref(fig:colorcatcont).

Typical usage of color for coding qualitative/categorical information (left) and quantitative/continuous information (right). Left: Scatter plot of weekly gas consumption by outside temperature before and after installing house insulation. Right: Choropleth map of median income in the 16 regions of New Zealand in 2018.

Typical usage of color for coding qualitative/categorical information (left) and quantitative/continuous information (right). Left: Scatter plot of weekly gas consumption by outside temperature before and after installing house insulation. Right: Choropleth map of median income in the 16 regions of New Zealand in 2018.

R provides several ways to specify a color: by name (e.g., "red"); by hexadecimal RGB code (e.g., "#FF0000"); or by integer (e.g., 2). When we specify an integer, that provides an index into a default set of colors; the color 2 means the second color in the default set of colors.

However, a more important task than specifying one particular color is the task of specifying a set of colors to use in combination with each other. For example, in the left panel of Figure @ref(fig:colorcatcont), we need two colors that are very easily perceived as different from each other. In the right panel of Figure @ref(fig:colorcatcont), we require a set of colors that appear to change monotonically, e.g., from darker to lighter.

We call this the problem of selecting a good palette of colors. What we need to generate is a vector of R colors, e.g., c("red", "blue"), c("#FF0000", "#0000FF"), or c(2, 4).

A brief history of R palettes

Early versions of R provided very few functions for choosing colors from readily available palettes. The palettes that were provided, although standard at the time they were implemented, have meanwhile been widely recognized as being rather poor.

Old base R palettes.  At top left is the old default palette (prior to version 4.0.0), consisting largely of highly saturated primary colors or combinations thereof.  Below that is the rainbow palette of different highly saturated hues.  The middle column shows the old sequential palettes, with heat colors again being highly saturated.  The last column shows an old diverging palette plus two palettes motivated by shadings of geographic maps.

Old base R palettes. At top left is the old default palette (prior to version 4.0.0), consisting largely of highly saturated primary colors or combinations thereof. Below that is the rainbow palette of different highly saturated hues. The middle column shows the old sequential palettes, with heat colors again being highly saturated. The last column shows an old diverging palette plus two palettes motivated by shadings of geographic maps.

The palette() function generates a vector of eight colors. These provide the default set of colors that an integer color specification selects from and can be used for coding categorical information. The output below shows what R produced prior to version 4.0.0, along with a swatch of color circles.

palette()
## [1] "black"   "red"     "green3"  "blue"    "cyan"    "magenta" "yellow" 
## [8] "gray"

Figure @ref(fig:oldPalettes) depicts this old default palette() (top-left) along with other old base R palettes using swatches of circles or rectangles that are filled with the corresponding colors. The other palette functions all take an argument n to generate that number of colors (possibly along with further arguments that allow for certain customizations):

All of these palettes – except gray.colors() – have poor perceptual properties. The colors are highly saturated, which can be distracting and overly stimulating, and the colors are unbalanced with respect to chroma and luminance, which means that they have unequal visual impact (Lonsdale and Lonsdale 2019; Bartram, Patra, and Stone 2017; Etchebehere and Fedorovskaya 2017). In addition, the palettes do not perform well for viewers with some form of colorblindness (about 10% of the male population, Ware 2012). Most of the palettes also use sequences of hues obtained in the RGB (red-green-blue) space or simple derivations thereof like HSV (hue-saturation-value) or HLS (hue-lightness-saturation), which leads to clustering of colors at the red, green, and blue primaries.

Although these limitations have been well known for some time, no changes were made to these palettes provided by the core R graphics system for a number of years. There were various reasons for this including the following:

A new set of R palettes

On the road to R version 4.0.0 an attempt was made to address the limited and deficient set of palettes in base R and to add a range of modern color palettes. In particular, palette() has a new improved default color palette, palette.colors() provides further well-established qualitative palettes (Zeileis et al. 2019), and hcl.colors() provides a wide range of qualitative, sequential, and diverging palettes obtained by a standardized approach in the so-called HCL (hue-chroma-luminance) space (Wikipedia 2023); see Zeileis and Murrell (2019) and Zeileis et al. (2020).

A new default color palette()

The default color palette in R – the default set of colors that can be specified by integer index – has been replaced. The new palette follows the same basic hues as the old default palette, but the palette is less saturated overall and reduces the size of changes in chroma and luminance across the palette. This produces a calmer and less distracting palette with a more even visual impact. An attempt has also been made to improve the discriminability of the colors in the default palette for colorblind viewers. The output (and swatches) below show what R produces from version 4.0.0 onwards.

palette()
## [1] "black"   "#DF536B" "#61D04F" "#2297E6" "#28E2E5" "#CD0BBC" "#F5C710"
## [8] "gray62"

The palette.colors() function

The palette.colors() function, new in R 4.0.0, provides a way to access several other predefined palettes (see also Figure @ref(fig:newPalettes)). All of these are qualitative palettes so they are appropriate for encoding qualitative (categorical) variables. In other words, these palettes are appropriate for differentiating between groups. By default palette.colors() returns the "Okabe-Ito" (Okabe and Ito 2008) palette. This palette was designed to be very robust under color vision deficiencies, so the different colors in this palette should be easily distinguishable for all viewers.

palette.colors()
## [1] "#000000" "#E69F00" "#56B4E9" "#009E73" "#F0E442" "#0072B2" "#D55E00"
## [8] "#CC79A7" "#999999"

The first argument to palette.colors() is a number of colors. Each palette has a fixed number of colors, but we can ask for fewer or, with recycle = TRUE, we can get more colors by recycling. For example, the following code just requests the first four colors from the "Okabe-Ito" palette.

palette.colors(4)
## [1] "#000000" "#E69F00" "#56B4E9" "#009E73"

Note that up to R version 4.2.x some palette.colors(), including "Okabe-Ito", provide named output but starting from 4.3.0 all output is unnamed by default.

The following code requests ten colors from the "Okabe-Ito" palette. That palette only contains nine colors, but because recycle = TRUE, a tenth color is provided by recycling the first color (black) from the palette.

palette.colors(10, recycle = TRUE)
##  [1] "#000000" "#E69F00" "#56B4E9" "#009E73" "#F0E442" "#0072B2" "#D55E00"
##  [8] "#CC79A7" "#999999" "#000000"

The second argument to palette.colors() is the palette to select colors from. For example, the following code requests the first four colors from the "R4" palette (the new default in palette()).

palette.colors(4, palette = "R4")
## [1] "#000000" "#DF536B" "#61D04F" "#2297E6"

The hcl.colors() function

The hcl.colors() function was added in R 3.6.0, with the range of supported palettes slowly expanded over time. This function provides access to another range of palettes, including sequential and diverging palettes for representing continuous variables. As with palette.colors(), the first argument is a number of colors to generate and the second specifies a palette to generate colors from. The hcl.pals() function provides a full list of the available palette names that we can choose from.

hcl.colors(8, palette = "Blues 3")
## [1] "#00366C" "#005893" "#007BC0" "#5E9BD8" "#91BAEB" "#BAD5FA" "#DDECFF"
## [8] "#F9F9F9"

One difference with hcl.colors() is that the palette we are selecting colors from is not a fixed set of colors. Instead, the palettes in hcl.colors() are a path within HCL colorspace. For each dimension – hue, chroma, and luminance – a palette can have a constant value, a monotonic trajectory, or a triangular trajectory. For example, the trajectories for the "Blues 3" palette are shown in Figure @ref(fig:blues3hcl). The palette is (almost) constant in the hue dimension yielding different shades of (almost) the same blue. The palette is monotonically increasing in the luminance dimension, so the blues vary from very dark to very light. Finally, the palette has a triangular trajectory in the chroma dimension, so the blues are more colorful towards the middle of the palette. The trajectories do not involve exactly straight lines because in some cases a power curve is employed and in other cases the palette has to be adjusted to remain within the range of representable colours – see Zeileis, Hornik, and Murrell (2009) and Ihaka et al. (2023) for more details.

<img src=“/Users/vincent/Downloads/rjournal_quarto/articles/RJ-2023-071/RJ-2023-071_files/figure-html/blues3hcl-1.png” alt=“Hue, chroma, and luminance paths for the "Blues 3" palette. This plot is created by the colorspace::specplot() function. We can see that hue is held constant in this palette, while luminance increases monotonically and chroma peaks towards the middle of the palette.” width=“49%” />

Hue, chroma, and luminance paths for the "Blues 3" palette. This plot is created by the colorspace::specplot() function. We can see that hue is held constant in this palette, while luminance increases monotonically and chroma peaks towards the middle of the palette.

Because the palettes from hcl.colors() are based on a continuous path in HCL space, we can select as many colors as we like. For example, the following code generates five colors from the multi-hue sequential palette "YlGnBu" (see also Figure @ref(fig:ylgnbu-viridis)) and nine colors from the diverging palette "Purple-Green" (see also Figure @ref(fig:purplegreen-fall)).

hcl.colors(5, palette = "YlGnBu")
## [1] "#26185F" "#007EB3" "#18BDB0" "#BCE9C5" "#FCFFDD"

hcl.colors(9, palette = "Purple-Green")
## [1] "#492050" "#90529C" "#C490CF" "#E4CAE9" "#F1F1F1" "#BCDABC" "#72B173"
## [8] "#2C792D" "#023903"

Illustrations

To illustrate the benefits of the new color palettes, Figure @ref(fig:tsplot) shows several versions of a time series plot, depicting four different European stock indexes during most of the 1990s (EuStockMarkets data). The plots compare the old "R3" default palette with the new "R4" default and the new qualitative palette "Okabe-Ito". These can all be selected using palette.colors(). The first row shows the "R3" default using a typical color legend in the top left corner; the second column shows an emulation of a kind of red-green color blindness known as deuteranopia using the package (based on Machado, Oliveira, and Fernandes 2009). The second row uses the "R4" palette and the third row uses "Okabe-Ito"; both with direct labels for the different time series instead of a color legend.

<img src=“/Users/vincent/Downloads/rjournal_quarto/articles/RJ-2023-071/RJ-2023-071_files/figure-html/tsplot-1.png” alt=“Time series line plot of EuStockMarkets. Rows: Old "R3" default palette (top), new "R4" default palette (middle), "OkabeIto" palette (bottom), designed to be robust under color vision deficiencies. Columns: Normal vision (left) and emulated deuteranope vision (right). A color legend is used in the first row and direct labels in the other rows.” width=“100%” />

Time series line plot of EuStockMarkets. Rows: Old "R3" default palette (top), new "R4" default palette (middle), "OkabeIto" palette (bottom), designed to be robust under color vision deficiencies. Columns: Normal vision (left) and emulated deuteranope vision (right). A color legend is used in the first row and direct labels in the other rows.

We can see that the "R3" colors are highly saturated and they vary in luminance. For example, the yellow line is noticeably lighter than the others. Futhermore, for deuteranope viewers, the DAX and the SMI lines are difficult to distinguish from each other (exacerbated by the use of a color legend that makes matching the lines to labels almost impossible). Moreover, the FTSE line is more difficult to distinguish from the white background, compared to the other lines.

The "R4" palette is an improvement: the luminance is more even and the colors are less saturated, plus the colors are more distinguishable for deuteranope viewers (aided by the use of direct color labels instead of a legend). The "Okabe-Ito" palette works even better, particularly for deuteranope viewers.

<img src=“/Users/vincent/Downloads/rjournal_quarto/articles/RJ-2023-071/RJ-2023-071_files/figure-html/dorian-1.png” alt=“Probability of wind speeds \(&gt;\) 39 mph (63 km h\(^{-1}\)) during hurricane Dorian in 2019. On the left is the the original image (top row) and two reproductions using the "Reds" (middle) and "YlGnBu" (bottom) sequential palettes. On the right are emulations of how the images on the left might appear to a colorblind viewer.” width=“100%” /><img src=“/Users/vincent/Downloads/rjournal_quarto/articles/RJ-2023-071/RJ-2023-071_files/figure-html/dorian-2.png” alt=“Probability of wind speeds \(&gt;\) 39 mph (63 km h\(^{-1}\)) during hurricane Dorian in 2019. On the left is the the original image (top row) and two reproductions using the "Reds" (middle) and "YlGnBu" (bottom) sequential palettes. On the right are emulations of how the images on the left might appear to a colorblind viewer.” width=“100%” /><img src=“/Users/vincent/Downloads/rjournal_quarto/articles/RJ-2023-071/RJ-2023-071_files/figure-html/dorian-3.png” alt=“Probability of wind speeds \(&gt;\) 39 mph (63 km h\(^{-1}\)) during hurricane Dorian in 2019. On the left is the the original image (top row) and two reproductions using the "Reds" (middle) and "YlGnBu" (bottom) sequential palettes. On the right are emulations of how the images on the left might appear to a colorblind viewer.” width=“100%” />

Probability of wind speeds \(>\) 39 mph (63 km h\(^{-1}\)) during hurricane Dorian in 2019. On the left is the the original image (top row) and two reproductions using the "Reds" (middle) and "YlGnBu" (bottom) sequential palettes. On the right are emulations of how the images on the left might appear to a colorblind viewer.

To illustrate an application of the new sequential color palettes for use with continuous data, Figure @ref(fig:dorian) shows several versions of a weather map that was produced by the National Oceanic and Atmospheric Administration (and infamously misinterpreted by a former President of The United States, see Zeileis and Stauffer 2019). The top row shows the original image along with an emulation of deuteranopia in the second column. The middle row uses the sequential palette "Reds" that can be selected using hcl.colors() and the bottom row uses the sequential palette "YlGnBu", which is also available via hcl.colors().

The weather map is intended to convey the probability of wind speeds \(>\) 39 mph during hurricane Dorian, 2019-08-30–2019-09-04. The probabilities are highest in the central magenta region and lowest in the outer green regions. The original image does not convey the information very well because there is a non-monotonic change in luminance (from dark to light and back to dark); the high saturation across all of the colors is also distracting. These issues persist for deuteranope viewers, plus any benefit of a red (danger!) to green (safe) change in hue is lost.

The "Reds" version of the image conveys the information more clearly by relating the monotonic changes in probability to monotonic changes in luminance. Hue is fairly constant in this palette and the saturation peaks towards the middle, which is similar to the "Blues 3" palette shown in Figure @ref(fig:blues3hcl), just with a different narrow range of hues. The deuteranope version retains this advantage.

The "YlGnBu" version of the image is also more effective than the original. This palette employs a much broader range of hues and varies chroma along with luminances so that the dark colors have higher chroma and the light colors lower chroma (see Figure @ref(fig:ylgnbu-viridis)). This still clearly conveys the order from light to dark but additionally yields more distinguishable colors, making it easier to associate contour bands with the legend. Note that the "YlGnBu" palette is similar to the very popular "Viridis" palette (also shown in Figure @ref(fig:ylgnbu-viridis) on the right), with almost the same hue and luminance trajectories. However, an important advantage of the "YlGnBu" palette in this visualization is that the light colors have low chroma and thus signal low risk better than the light colors in the "Viridis" palette which have very high chroma. Finally, we remark that the "YlGnBu" version does lose the benefit of red (danger!) at high probabilities; an alternative would be to use the "Purple-Yellow" multi-hue palette instead, a variation of which was used by Zeileis and Stauffer (2019).

<img src=“/Users/vincent/Downloads/rjournal_quarto/articles/RJ-2023-071/RJ-2023-071_files/figure-html/ylgnbu-viridis-1.png” alt=“Hue, chroma, and luminance paths for the "YlGnBu" (left) and "Viridis" (right) palettes. These plots are created by the colorspace::specplot() function. For "YlGnBu" we can see that hue changes from blue to yellow, luminance increases monotonically, and chroma has a small peak in the blue range and then decreases with luminance. "Viridis", on the other hand, has almost the same trajectory for both hue and luminance, but chroma increases for the light colors.” width=“49%” /><img src=“/Users/vincent/Downloads/rjournal_quarto/articles/RJ-2023-071/RJ-2023-071_files/figure-html/ylgnbu-viridis-2.png” alt=“Hue, chroma, and luminance paths for the "YlGnBu" (left) and "Viridis" (right) palettes. These plots are created by the colorspace::specplot() function. For "YlGnBu" we can see that hue changes from blue to yellow, luminance increases monotonically, and chroma has a small peak in the blue range and then decreases with luminance. "Viridis", on the other hand, has almost the same trajectory for both hue and luminance, but chroma increases for the light colors.” width=“49%” />

Hue, chroma, and luminance paths for the "YlGnBu" (left) and "Viridis" (right) palettes. These plots are created by the colorspace::specplot() function. For "YlGnBu" we can see that hue changes from blue to yellow, luminance increases monotonically, and chroma has a small peak in the blue range and then decreases with luminance. "Viridis", on the other hand, has almost the same trajectory for both hue and luminance, but chroma increases for the light colors.

The following sections describe the full range of new color palettes in more detail. A much more condensed overview of the new functions and palettes that are available and some suggestions for robust default palettes are given in Section 6.

New defaults in graphical functions

The new default color palette will be most visible in the output from functions in the and packages. Several functions from these packages now have slightly different default output, namely when they are using integer color specifications such as 2 or 3. The resulting colors will still be similar to the old output, e.g., still a red or a green, but just a different shade.

Moreover, a couple of functions explicitly have new defaults: image() and filled.contour(), now use the sequential "YlOrRd" palette (from ColorBrewer) which uses similar hues as the old heat.colors(). See the left panel in Figure @ref(fig:graphics).

Finally, the hist() and boxplot() functions (and therefore formula-based calls of the form plot(num ~ factor, ...), also have a new default color: light gray which makes it easier to compare the shaded areas (see the middle and right panels in Figure @ref(fig:graphics)).

image(volcano)
boxplot(weight ~ feed, data = chickwts)
hist(chickwts$weight)
Examples of the new default color palettes that are used in the base graphics functions `image()`, `boxplot()`, and `hist()`.

Examples of the new default color palettes that are used in the base graphics functions image(), boxplot(), and hist().

Package authors may also benefit from the new palettes available in R; the new functions palette.colors() and hcl.colors() allow good default palettes to be set without requiring additional package dependencies. For example, the package has already changed its default colors to use the "Okabe-Ito" and "YlGnBu" palettes (for categorical and numerical data, respectively).

Summary

The default color palette in R has been improved since R version 4.0.0. The functions palette.colors() and hcl.colors(), from the package, also provide a wide range of predefined palettes based on a number of widely used graphics systems. There are qualitative palettes for use with categorical data and sequential and diverging palettes for use with ordinal or continuous data. Table @ref(tab:overview) below summarizes the main types of palettes and provides suggestions for good default palettes for each type. We encourage package authors to make use of these palettes when providing default colors for functions that produce plots.

(#tab:overview) An overview of the new palette functionality: For each main type of palette, the Purpose row describes what sort of data the type of palette is appropriate for, the Generate row gives the functions that can be used to generate palettes of that type, the List row names the functions that can be used to list available palettes, and the Robust row identifies two or three good default palettes of that type.
Qualitative Sequential Diverging
Purpose Categorical data Ordered or numeric data (high\(~\rightarrow~\)low) Ordered or numeric data with a central value (high\(~\leftarrow~\)neutral\(~\rightarrow~\)low)
Generate palette.colors(), hcl.colors() hcl.colors() hcl.colors()
List palette.pals(), hcl.pals("qualitative") hcl.pals("sequential") hcl.pals("diverging"), hcl.pals("divergingx")
Robust "Okabe-Ito", "R4" "Blues 3", "YlGnBu", "Viridis" "Purple-Green", "Blue-Red 3"
Bartram, Lyn, Abhisekh Patra, and Maureen Stone. 2017. “Affective Color in Visualization.” In Proceedings of the 2017 CHI Conference on Human Factors in Computing Systems, 1364–74. New York: Association for Computing Machinery. https://doi.org/10.1145/3025453.3026041.
CARTO. 2023. “CARTOColors: Data-Driven Color Schemes.” https://carto.com/carto-colors/.
Cleveland, William S., and Robert McGill. 1984. “Graphical Perception: Theory, Experimentation, and Application to the Development of Graphical Methods.” Journal of the American Statistical Association 79 (387): 531–54. https://doi.org/10.1080/01621459.1984.10478080.
Coombes, Kevin R., Guy Brock, Zachary B. Abrams, and Lynne V. Abruzzo. 2019. Polychrome: Creating and Assessing Qualitative Palettes with Many Colors.” Journal of Statistical Software, Code Snippets 90 (1): 1–23. https://doi.org/10.18637/jss.v090.c01.
Crameri, Fabio, Grace E. Shephard, and Philip J. Heron. 2020. “The Misuse of Colour in Science Communication.” Nature Communications 11 (1): 5444. https://doi.org/10.1038/s41467-020-19160-7.
Etchebehere, Sergio, and Elena Fedorovskaya. 2017. “On the Role of Color in Visual Saliency.” Electronic Imaging 2017 (14): 58–63. https://doi.org/10.2352/ISSN.2470-1173.2017.14.HVEI-119.
Garnier, Simon. 2023. viridis: Default Color Maps from matplotlib. https://CRAN.R-project.org/package=viridis.
Harrower, Mark A., and Cynthia A. Brewer. 2003. ColorBrewer.org: An Online Tool for Selecting Color Schemes for Maps.” The Cartographic Journal 40: 27–37. https://ColorBrewer.org/.
Ihaka, Ross. 2003. “Colour for Presentation Graphics.” In Proceedings of the 3rd International Workshop on Distributed Statistical Computing, Vienna, Austria, edited by Kurt Hornik, Friedrich Leisch, and Achim Zeileis. https://www.R-project.org/conferences/DSC-2003/Proceedings/.
Ihaka, Ross, Paul Murrell, Kurt Hornik, Jason C. Fisher, Reto Stauffer, Claus O. Wilke, Claire D. McWhite, and Achim Zeileis. 2023. colorspace: A Toolbox for Manipulating and Assessing Colors and Palettes. https://CRAN.R-project.org/package=colorspace.
Lonsdale, Maria Dos Santos, and David Lonsdale. 2019. Design2Inform: Information Visualisation.” Report. The Office of the Chief Scientific Advisor, Gov UK. https://eprints.whiterose.ac.uk/141931/.
Machado, Gustavo M., Manuel M. Oliveira, and Leandro A. F. Fernandes. 2009. “A Physiologically-Based Model for Simulation of Color Vision Deficiency.” IEEE Transactions on Visualization and Computer Graphics 15 (6): 1291–98. https://doi.org/10.1109/TVCG.2009.113.
Neuwirth, Erich. 2022. RColorBrewer: ColorBrewer Palettes. https://CRAN.R-project.org/package=RColorBrewer.
Nowosad, Jakub. 2023a. colorblindcheck: Check Color Palettes for Problems with Color Vision Deficiency. https://CRAN.R-project.org/package=colorblindcheck.
———. 2023b. rcartocolor: CARTOColors Palettes. https://CRAN.R-project.org/package=rcartocolor.
Nuñez, Jamie R., Christopher R. Anderton, and Ryan S. Renslow. 2018. “Optimizing Colormaps with Consideration for Color Cision Deficiency to Enable Accurate Interpretation of Scientific Data.” PLOS ONE 13 (7): 1–14. https://doi.org/10.1371/journal.pone.0199239.
Okabe, Masataka, and Kei Ito. 2008. “Color Universal Design (CUD): How to Make Figures and Presentations That Are Friendly to Colorblind People.” https://jfly.uni-koeln.de/color/.
Pedersen, Thomas Lin, and Fabio Crameri. 2023. scico: Colour Palettes Based on the Scientific Colour-Maps. https://CRAN.R-project.org/package=scico.
Ram, Karthik, and Hadley Wickham. 2023. wesanderson: A Wes Anderson Palette Generator. https://CRAN.R-project.org/package=wesanderson.
Sarkar, Deepayan. 2008. lattice: Multivariate Data Visualization with R. New York: Springer-Verlag. https://lmdvr.R-Forge.R-project.org/.
Smith, Nathaniel, and Stéfan Van der Walt. 2015. “A Better Default Colormap for matplotlib.” In SciPy 2015 – Scientific Computing with Python. Austin. https://www.youtube.com/watch?v=xAoljeRJ3lU.
Stone, Maureen. 2016. “How We Designed the New Color Palettes in Tableau 10.” https://www.tableau.com/about/blog/2016/7/colors-upgrade-tableau-10-56782.
Tableau Software, LLC. 2021. Tableau: Business Intelligence and Analytics Software.” https://www.tableau.com/.
Tennekes, Martijn. 2023. cols4all: Colors for All. https://CRAN.R-project.org/package=cols4all.
Ware, Colin. 2012. Information Visualization: Perception for Design. 3rd ed. Morgan Kaufmann. https://doi.org/10.1016/C2009-0-62432-6.
Wickham, Hadley. 2016. ggplot2: Elegant Graphics for Data Analysis. 2nd ed. Springer-Verlag. https://ggplot2.tidyverse.org/.
Wikipedia. 2023. HCL Color SpaceWikipedia, the Free Encyclopedia.” URL https://en.wikipedia.org/wiki/HCL_color_space, accessed 2023-11-20.
Zeileis, Achim, Jason C. Fisher, Kurt Hornik, Ross Ihaka, Claire D. McWhite, Paul Murrell, Reto Stauffer, and Claus O. Wilke. 2020. colorspace: A Toolbox for Manipulating and Assessing Colors and Palettes.” Journal of Statistical Software 96 (1): 1–49. https://doi.org/10.18637/jss.v096.i01.
Zeileis, Achim, Kurt Hornik, and Paul Murrell. 2009. “Escaping RGBland: Selecting Colors for Statistical Graphics.” Computational Statistics & Data Analysis 53: 3259–70. https://doi.org/10.1016/j.csda.2008.11.033.
Zeileis, Achim, and Paul Murrell. 2019. HCL-Based Color Palettes in grDevices.” https://blog.R-project.org/2019/04/01/hcl-based-color-palettes-in-grdevices/.
Zeileis, Achim, Paul Murrell, Martin Maechler, and Deepayan Sarkar. 2019. “A New palette() for R.” https://blog.R-project.org/2019/11/21/a-new-palette-for-r/.
Zeileis, Achim, and Reto Stauffer. 2019. “Was Trump Confused by Rainbow Color Map?” https://www.zeileis.org/news/dorian_rainbow/.