Best Colour-Blind-Safe Palettes for Scientific Figures
Colour-blind-safe palettes for scientific figures with hex codes: Okabe-Ito, Paul Tol, viridis, cividis and ColorBrewer, plus how to test them.
Last updated: October 11, 2026 (added the interactive palette explorer, colour-blind simulator and more palettes). Hex codes and statistics are taken from the sources listed at the end.
Quick answer: The best colour-blind-safe palettes for scientific figures are Okabe–Ito (8 colours) or Paul Tol's Bright scheme for categories, viridis or cividis for continuous data, and ColorBrewer's diverging schemes (such as RdBu) for data around a midpoint. Pair colour with labels or shapes and test in a colour-blindness simulator.
Why do colour-blind-safe palettes matter?
Colour vision deficiency (CVD) is common: the US National Eye Institute estimates that about 1 in 12 men and 1 in 200 women have red-green colour blindness. In a lecture of 100 researchers, several people may not be able to tell your red and green lines apart. Journals have responded: Nature's research figure guide asks authors to use an accessible palette and cites Bang Wong's Nature Methods column on colour blindness.
What are the three types of palettes?
- Qualitative (categorical): distinct hues for unordered groups, e.g. treatments or cell types.
- Sequential: light-to-dark ramps for ordered values, e.g. expression level.
- Diverging: two hues meeting at a neutral midpoint, e.g. fold change around zero or correlations.
Choosing the wrong type is a more common mistake than choosing the wrong colours.
Which colour-blind-safe palettes should you use? Comparison table
| Palette | Type | Colours | Where to get it |
|---|---|---|---|
| Okabe–Ito | Qualitative | 8 | Okabe & Ito (2008); built into R (palette.colors()) |
| Paul Tol Bright / Vibrant / Muted | Qualitative | 7 / 7 / 9 | Paul Tol's technical note |
| viridis | Sequential | Continuous | Matplotlib default; R viridis |
| cividis | Sequential | Continuous | Matplotlib; optimised for CVD (Nuñez et al., 2018) |
| ColorBrewer (e.g. RdBu, PuOr) | Sequential / diverging | 3–11 | colorbrewer2.org ("colorblind safe" filter) |
| Tol / ColorBrewer greys | Neutral | — | For backgrounds and "control" groups |
Interactive palette explorer: how do these palettes look to colour-blind readers?
Use the explorer below to compare every palette in this guide. Pick a palette to see it applied to a sample bar chart, line chart and heatmap, and to a Sciicons illustration recoloured on the fly. Switch the simulator between protanopia, deuteranopia, tritanopia and greyscale to see what readers with colour vision deficiency, or a black-and-white printout, will see. Click any swatch to copy its hex code, or export the whole palette as a hex list, CSS variables, a matplotlib snippet or a ggplot2 snippet.
Okabe–Ito (qualitative)
| # | Name | Hex |
|---|---|---|
| 1 | Orange | #E69F00 |
| 2 | Sky blue | #56B4E9 |
| 3 | Bluish green | #009E73 |
| 4 | Yellow | #F0E442 |
| 5 | Blue | #0072B2 |
| 6 | Vermillion | #D55E00 |
| 7 | Reddish purple | #CC79A7 |
| 8 | Black | #000000 |
8 colours designed for all common colour-vision types; also R palette.colors("Okabe-Ito"). Source: Okabe & Ito, Color Universal Design.
Paul Tol Bright (qualitative)
| # | Name | Hex |
|---|---|---|
| 1 | Blue | #4477AA |
| 2 | Red | #EE6677 |
| 3 | Green | #228833 |
| 4 | Yellow | #CCBB44 |
| 5 | Cyan | #66CCEE |
| 6 | Purple | #AA3377 |
| 7 | Grey | #BBBBBB |
Default qualitative scheme; distinct for colour-blind readers. Source: Paul Tol, SRON technical note.
Paul Tol Vibrant (qualitative)
| # | Name | Hex |
|---|---|---|
| 1 | Orange | #EE7733 |
| 2 | Blue | #0077BB |
| 3 | Cyan | #33BBEE |
| 4 | Magenta | #EE3377 |
| 5 | Red | #CC3311 |
| 6 | Teal | #009988 |
| 7 | Grey | #BBBBBB |
Higher-saturation alternative to Bright, good for slides. Source: Paul Tol, SRON technical note.
Paul Tol Muted (qualitative)
| # | Name | Hex |
|---|---|---|
| 1 | Rose | #CC6677 |
| 2 | Indigo | #332288 |
| 3 | Sand | #DDCC77 |
| 4 | Green | #117733 |
| 5 | Cyan | #88CCEE |
| 6 | Wine | #882255 |
| 7 | Teal | #44AA99 |
| 8 | Olive | #999933 |
| 9 | Purple | #AA4499 |
9 softer colours for many categories; pale grey #DDDDDD for missing data. Source: Paul Tol, SRON technical note.
Paul Tol High-contrast (qualitative)
| # | Name | Hex |
|---|---|---|
| 1 | Blue | #004488 |
| 2 | Yellow | #DDAA33 |
| 3 | Red | #BB5566 |
Three colours that also separate in greyscale print. Source: Paul Tol, SRON technical note.
viridis (sequential)
| # | Hex |
|---|---|
| 1 | #440154 |
| 2 | #443983 |
| 3 | #31688E |
| 4 | #21918C |
| 5 | #35B779 |
| 6 | #90D743 |
| 7 | #FDE725 |
Perceptually uniform; Matplotlib default colormap since 2.0. 7 evenly spaced samples. Source: Matplotlib colormaps.
magma (sequential)
| # | Hex |
|---|---|
| 1 | #000004 |
| 2 | #2C115F |
| 3 | #721F81 |
| 4 | #B73779 |
| 5 | #F1605D |
| 6 | #FEB078 |
| 7 | #FCFDBF |
Perceptually uniform, black to pale yellow; good for dense images on dark backgrounds. Source: Matplotlib colormaps.
cividis (sequential)
| # | Hex |
|---|---|
| 1 | #00224E |
| 2 | #2A3F6D |
| 3 | #575D6D |
| 4 | #7D7C78 |
| 5 | #A59C74 |
| 6 | #D2C060 |
| 7 | #FEE838 |
Optimised so viewers with and without CVD see nearly the same map. Source: Nuñez et al., PLOS ONE 2018.
ColorBrewer RdBu (7) (diverging)
| # | Hex |
|---|---|
| 1 | #B2182B |
| 2 | #EF8A62 |
| 3 | #FDDBC7 |
| 4 | #F7F7F7 |
| 5 | #D1E5F0 |
| 6 | #67A9CF |
| 7 | #2166AC |
Red–blue diverging; marked colour-blind safe on ColorBrewer. Centre on zero. Source: ColorBrewer 2.0.
ColorBrewer PuOr (7) (diverging)
| # | Hex |
|---|---|
| 1 | #B35806 |
| 2 | #F1A340 |
| 3 | #FEE0B6 |
| 4 | #F7F7F7 |
| 5 | #D8DAEB |
| 6 | #998EC3 |
| 7 | #542788 |
Orange–purple diverging; avoids red/green entirely. Source: ColorBrewer 2.0.
ColorBrewer Dark2 (8) (qualitative)
| # | Hex |
|---|---|
| 1 | #1B9E77 |
| 2 | #D95F02 |
| 3 | #7570B3 |
| 4 | #E7298A |
| 5 | #66A61E |
| 6 | #E6AB02 |
| 7 | #A6761D |
| 8 | #666666 |
ColorBrewer rates it colour-blind safe only for the first 3 classes. Source: ColorBrewer 2.0.
ColorBrewer Set2 (8) (qualitative)
| # | Hex |
|---|---|
| 1 | #66C2A5 |
| 2 | #FC8D62 |
| 3 | #8DA0CB |
| 4 | #E78AC3 |
| 5 | #A6D854 |
| 6 | #FFD92F |
| 7 | #E5C494 |
| 8 | #B3B3B3 |
Pastel set; ColorBrewer rates it colour-blind safe only for the first 3 classes. Source: ColorBrewer 2.0.
The simulator uses the model of Machado, Oliveira and Fernandes (2009) at full severity, which is also used by tools such as Colorspace in R. Real colour vision varies between people, and anomalous trichromacy (a weaker form) is more common than complete dichromacy, so treat the simulation as a worst-case check rather than an exact picture.
What are the Okabe–Ito hex codes?
| Name | Hex |
|---|---|
| Black | #000000 |
| Orange | #E69F00 |
| Sky blue | #56B4E9 |
| Bluish green | #009E73 |
| Yellow | #F0E442 |
| Blue | #0072B2 |
| Vermillion | #D55E00 |
| Reddish purple | #CC79A7 |
| Grey (often added) | #999999 |
Yellow #F0E442 is pale on white backgrounds; use it for fills rather than thin lines or text.
What are Paul Tol's palettes?
Paul Tol (SRON Netherlands Institute for Space Research) publishes colour schemes designed to be distinct for colour-blind readers and in print. His Bright scheme is #4477AA, #EE6677, #228833, #CCBB44, #66CCEE, #AA3377 and #BBBBBB. His High-contrast scheme (#004488, #DDAA33, #BB5566) also works in greyscale, which makes it useful for three-group plots.
Which colormap should you use for heatmaps and images?
Use a perceptually uniform sequential colormap. Viridis (Matplotlib's default since version 2.0) increases evenly in lightness, prints well in greyscale and is readable with common forms of CVD. Cividis was designed specifically so that people with and without CVD see nearly the same colours. For values above and below a meaningful midpoint, use a diverging map such as ColorBrewer RdBu or Matplotlib's coolwarm, and centre it on zero.
Avoid jet/rainbow colormaps: their uneven brightness invents boundaries that are not in the data.
When should you use magma or inferno instead of viridis?
Magma and inferno are part of the same perceptually uniform family as viridis, created by Stéfan van der Walt and Nathaniel Smith for Matplotlib. They run from near-black to pale yellow, so they have a wider lightness range than viridis. That makes them useful for dense images such as microscopy intensity maps, astronomy images or spectrograms, especially on dark backgrounds. Viridis remains the safer default for heatmaps printed on white paper because its darkest colour is a dark purple rather than black, which keeps cell borders and labels readable.
Which colours work for fluorescence microscopy overlays?
The classic red/green merge is the single most common colour-blindness problem in biology figures, because yellow overlap is invisible to many protanopes and deuteranopes. Use magenta and green for two-channel merges (overlap appears white), or show each channel in greyscale side by side with a coloured merge. For three channels, magenta, green and blue (or cyan, magenta and yellow) remain distinguishable. Always add a channel legend in text, not just colour.
How many colours can a palette safely have?
Most people can reliably match about six to eight distinct hues across a chart and its legend. Okabe–Ito offers eight colours including black, and Paul Tol's Muted scheme offers nine, but ColorBrewer rates many of its qualitative sets as colour-blind safe only up to three classes. If you need more categories, combine colour with marker shape, line style or direct labels, group minor categories as "Other" in grey, or split the data into small multiples.
How does ColorBrewer mark colour-blind-safe schemes?
ColorBrewer 2.0, designed by Cynthia Brewer for maps, lets you filter schemes by "colorblind safe", "print friendly" and "photocopy safe". The rating depends on the number of classes you choose: diverging schemes such as RdBu, PuOr and BrBG stay colour-blind safe at most sizes, while qualitative sets such as Set2 and Dark2 are only rated safe for small numbers of classes. Check the flags on the site after choosing your number of classes.
How do you apply a palette to a figure step by step?
- Decide the data type (categories, ordered values or diverging values) and choose the palette type.
- Limit the number of colours. Beyond 6–8 categories, group or facet instead of adding hues.
- Assign colours by meaning. Keep the same colour for the same condition across every panel and figure.
- Use neutral grey for controls or context and save saturated colours for what matters.
- Add redundant cues: direct labels, line styles or marker shapes.
- Test with a simulator such as Color Oracle or Coblis, and in greyscale.
- Match illustrations. Recolour schematic icons to the same palette; Sciicons SVGs can be recoloured in the icon detail view or in any vector editor so diagrams match your plots.
How do you set the palette in R and Python?
- R (ggplot2):
scale_colour_manual(values = palette.colors(palette = "Okabe-Ito")); for continuous datascale_fill_viridis_c(). - Python (Matplotlib):
cmap="viridis"orcmap="cividis"; for categories pass the Okabe–Ito hex list tocolor=or setplt.rcParams["axes.prop_cycle"]. - Seaborn:
sns.color_palette("colorblind")gives a CVD-friendly categorical palette.
Common colour mistakes in scientific figures
- Red vs green as the only contrast in plots, gels or microscopy overlays (use magenta/green instead for fluorescence merges).
- Rainbow heatmaps.
- Different colours for the same condition in different panels.
- Too many saturated colours, leaving nothing to stand out.
- Coloured text that becomes unreadable when printed.
Related guides
- How to choose colours for scientific figures
- Journal figure requirements: DPI, formats and sizes
- How to make a scientific poster
Sources
- National Eye Institute, colour blindness: https://www.nei.nih.gov/eye-health-information/eye-conditions-and-diseases/color-blindness
- MedlinePlus Genetics, colour vision deficiency: https://medlineplus.gov/genetics/condition/color-vision-deficiency/
- Okabe & Ito, Color Universal Design: https://jfly.uni-koeln.de/color/
- Wong B., Points of view: Color blindness, Nature Methods 8, 441 (2011): https://www.nature.com/articles/nmeth.1618
- Nature research figure guide: https://research-figure-guide.nature.com/figures/preparing-figures-our-specifications/
- Paul Tol, colour schemes: https://personal.sron.nl/~pault/
- Matplotlib colormaps: https://matplotlib.org/stable/users/explain/colors/colormaps.html
- Nuñez, Anderton & Renslow, cividis, PLOS ONE 13, e0199239 (2018): https://doi.org/10.1371/journal.pone.0199239
- ColorBrewer: https://colorbrewer2.org/
- Machado, Oliveira & Fernandes, A physiologically-based model for simulation of color vision deficiency, IEEE TVCG 15(6), 1291–1298 (2009): https://doi.org/10.1109/TVCG.2009.113
- Smith & van der Walt, A better default colormap for Matplotlib (SciPy 2015): https://bids.github.io/colormap/
Frequently asked questions
- What is the best colour-blind-safe palette for scientific figures?
- For categories, the Okabe-Ito palette (8 colours) is the most widely recommended and is cited in Nature's figure guide. For continuous data, use a perceptually uniform colormap such as viridis or cividis.
- What are the Okabe-Ito hex codes?
- Black #000000, orange #E69F00, sky blue #56B4E9, bluish green #009E73, yellow #F0E442, blue #0072B2, vermillion #D55E00 and reddish purple #CC79A7. Grey #999999 is often added as a ninth neutral colour.
- Why should I avoid the rainbow (jet) colormap?
- Rainbow colormaps are not perceptually uniform: brightness jumps create false boundaries and hide real gradients, and red-green sections are hard for colour-blind readers. Viridis was designed as Matplotlib's default to fix these problems.
- How many people are colour blind?
- According to the US National Eye Institute, red-green colour vision deficiency affects about 1 in 12 men and 1 in 200 women, roughly 8% and 0.5%.
- How can I check whether my figure is colour-blind friendly?
- Preview it with a colour-vision-deficiency simulator such as Color Oracle (desktop) or Coblis (web), and convert it to greyscale. If the information survives both tests, the figure is accessible.
More guides on the Sciicons blog · Browse scientific illustrations · Free figure tools