Automatic Generation of Qualitative Color Palettes

Automatic generation of distinct qualitative color palettes, optionally adapted to color deficiency. It takes a subspace of the HSL color space as input and projects it to the DIN99d color space where it selects and return colors that are maximally distinct.

Travis-CI BuildStatus AppVeyor BuildStatus CoverageStatus CRAN_Status_Badge

qualpalr generates distinct qualitative color palettes, primarily for use in R graphics. Given n (the number of colors to generate), along with a subset in the hsl color space (a cylindrical representation of the RGB color space) qualpalr attempts to find the n colors in the provided color subspace that maximize the smallest pairwise color difference. This is done by projecting the color subset from the HSL color space to the DIN99d space. DIN99d is (approximately) perceptually uniform, that is, the euclidean distance between two colors in the space is proportional to their perceived difference.

qualpalr was inspired by i want hue.


Let’s create a palette of 4 colors of hues from 0 to 360, saturation between 0.1 and 0.5, and lightness from 0.6 to 0.85.

pal <- qualpal(n = 4, list(h = c(0, 360), s = c(0.1, 0.5), l = c(0.6, 0.85)))

We can retrieve the generated colors in hex format

#> [1] "#74C970" "#766AC9" "#C86D6A" "#DCCFE0"

Altneratively, we can create a palette using one of the predefined color subspaces and, optionally, adapt it to color deficiency (here deuteranomaly).

pal2 <- qualpal(n = 4, colorspace = "pretty", cvd = "deutan",
                cvd_severity = 0.5)

We can look at a distance matrix of the pairwise color differences from the palette we have generated.

#>          #D4C76F  #616FC8  #D0E0E8
#> #616FC8 29.14409                  
#> #D0E0E8 18.78602 21.76547         
#> #A08587 18.59491 18.38472 18.34490

The palette may also be plotted with in a multidimensional scaling plot generated from the distance matrix of the colors in the palette.


Or it might be plotted in one of the provided color spaces as a scatterplot matrix.

pairs(pal2, colorspace = "HSL")


The current CRAN release can be installed by running


The development version can be installed by running



Versioning is based on semantic versioning.

Code of conduct

Please note that this project is released with a Contributor Code of Conduct. By participating in this project you agree to abide by its terms.


qualpalr is open source software, licensed under GPL-3.


qualpalr 0.4.3

Minor changes

  • qualpal() gains an argument, n_threads, for specifying the number of threads to use when computing the distance matrix between colors.
  • C++ functions call namespaces explicitly using ::.
  • Documentation for hue and saturation in qualpal() has been fixed. (Closes #2, thanks @jflycn).

qualpalr 0.4.2

Major changes

  • Palettes are no longer generated randomly. qualpalr previuosly started with a random sample of colors before running the optimization scheme but now instead picks a starting set of linearly spaced colors.

Minor changes

  • C++ functions are registered via Rcpp.

Bug fixes

  • autopal() erroneously required colorspace to be a string.

qualpalr 0.4.1

Bug fixes

  • Fixed autopal() which was broken since the minimum color difference returned was always 0 due to a bug in qualpal().

Minor changes

  • Now registers compiled functions.

qualpalr 0.4.0

Major changes

  • autopal() is a new function that tweaks the amount of color vision deficiency adapation to match a target color difference.
  • qualpal() argument colorspace now also accepts a matrix or data.frame of RGB colors.

Minor changes

  • qualpal() sorts palettes in order of increasing color distinctness.
  • qualpal() argument colorblind has been made defunct.
  • Documentation for qualpal() has been improved.
  • Colors are now generated with randtoolbox::torus() instead of randtoolbox::sobol().

qualpalr 0.3.1

Bug fixes

  • Dropped a C++ header that caused the package build to fail on some platforms.
  • Fixed issues with unitialized variables in the internal farthest points optimizer.

qualpalr 0.3.0

New features

  • Improved algorithm for finding distinct colors. (For details see this.)
  • Revamped the color deficiency handling to include almost all cases of color deficiency using the methods described in Machado 2010, now including tritanopia as well as anomalous trichromacies (deuteranomaly, tritanomaly, and protanomaly). This is controlled via the cvd_severity argument to qualpal() that allows the user to set the severity of color deficiency to adapt to -- 0 for normal vision and 1 for dichromatic vision (protanopia, deuteranopia, or tritanopia).

Minor improvements

  • Distance and color picking algorithms have been rewritten in C++ using Rcpp, RcppParallel, and RcppArmadillo.
  • Phased out the ... argument to qualpal.
  • Lightness range of the predefined rainbow palette increased to [0, 1].
  • Changed argument name of colorblind to cvd (for color vision deficiency) since the function now adapts to less severe versions of color deficiency. Using colorblind is deprecated and will throw a warning.

Bug fixes

  • Fixed typos and invalid links in the Introduction to qualpalr vignette.

qualpalr 0.2.1

New features

  • Dropped daltonization since it effectively transposed the color subspace given by the user. qualpalr now instead only transforms the given color subspace to simulate protanopia or deuteranopia and then picks colors. This has the side-effect of decreasing the distinctness of color palettes when colorblind is used, but is more consistent with user input.

Bug fixes and minor improvements

  • Simulations for tritanopia were dropped since there is no reliable source to explain how sRGB ranges should be converted (as there is for deuteranopia and protanopia in Vienot et al 1999).
  • Added tests using data from Vienot et al 1999 to check that color blind simulations work properly.
  • Fixed a sampling bug wherein the square root of saturation was taken after scaling to the provided range, which generated different ranges than intended.
  • Switched to the sobol quasi-random sequence instead of torus.

qualpalr 0.2.0

New features

  • Redesigned the method by which qualpal picks colors. Now initializes a point cloud of colors, projects it to DIN99d space, and picks points greedily.
  • Introduced real methods of adapting colors to color blindness by daltonizing color subspaces before picking colors from them.
  • The introduction to qualpalr vignette has been expanded with a thorough description of how qualpalr picks colors.

Bug fixes and minor improvements

  • Moved from using grDevices::convertColor to formulas from Bruce Lindbloom for color conversions, since the former function inaccurately converts colors.
  • Deprecated ... in qualpal since the function no longer uses an optimizer.

Reference manual

It appears you don't have a PDF plugin for this browser. You can click here to download the reference manual.


0.4.3 by Johan Larsson, 3 years ago

Report a bug at

Browse source code at

Authors: Johan Larsson [aut, cre]

Documentation:   PDF Manual  

GPL-3 license

Imports randtoolbox, graphics, stats, grDevices, utils, assertthat, Rcpp, RcppParallel

Suggests testthat, knitr, maps, rmarkdown, rgl, spelling

Linking to Rcpp, RcppParallel, RcppArmadillo

System requirements: GNU make

See at CRAN