Guide

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.

Sciicons · Published · Last updated

Cover image for “Best Colour-Blind-Safe Palettes for Scientific Figures” showing Sciicons scientific illustrations

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

PaletteTypeColoursWhere to get it
Okabe–ItoQualitative8Okabe & Ito (2008); built into R (palette.colors())
Paul Tol Bright / Vibrant / MutedQualitative7 / 7 / 9Paul Tol's technical note
viridisSequentialContinuousMatplotlib default; R viridis
cividisSequentialContinuousMatplotlib; optimised for CVD (Nuñez et al., 2018)
ColorBrewer (e.g. RdBu, PuOr)Sequential / diverging3–11colorbrewer2.org ("colorblind safe" filter)
Tol / ColorBrewer greysNeutral—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)

#E69F00#56B4E9#009E73#F0E442#0072B2#D55E00#CC79A7#000000
#NameHex
1Orange#E69F00
2Sky blue#56B4E9
3Bluish green#009E73
4Yellow#F0E442
5Blue#0072B2
6Vermillion#D55E00
7Reddish purple#CC79A7
8Black#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)

#4477AA#EE6677#228833#CCBB44#66CCEE#AA3377#BBBBBB
#NameHex
1Blue#4477AA
2Red#EE6677
3Green#228833
4Yellow#CCBB44
5Cyan#66CCEE
6Purple#AA3377
7Grey#BBBBBB

Default qualitative scheme; distinct for colour-blind readers. Source: Paul Tol, SRON technical note.

Paul Tol Vibrant (qualitative)

#EE7733#0077BB#33BBEE#EE3377#CC3311#009988#BBBBBB
#NameHex
1Orange#EE7733
2Blue#0077BB
3Cyan#33BBEE
4Magenta#EE3377
5Red#CC3311
6Teal#009988
7Grey#BBBBBB

Higher-saturation alternative to Bright, good for slides. Source: Paul Tol, SRON technical note.

Paul Tol Muted (qualitative)

#CC6677#332288#DDCC77#117733#88CCEE#882255#44AA99#999933#AA4499
#NameHex
1Rose#CC6677
2Indigo#332288
3Sand#DDCC77
4Green#117733
5Cyan#88CCEE
6Wine#882255
7Teal#44AA99
8Olive#999933
9Purple#AA4499

9 softer colours for many categories; pale grey #DDDDDD for missing data. Source: Paul Tol, SRON technical note.

Paul Tol High-contrast (qualitative)

#004488#DDAA33#BB5566
#NameHex
1Blue#004488
2Yellow#DDAA33
3Red#BB5566

Three colours that also separate in greyscale print. Source: Paul Tol, SRON technical note.

viridis (sequential)

#440154#443983#31688E#21918C#35B779#90D743#FDE725
#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)

#000004#2C115F#721F81#B73779#F1605D#FEB078#FCFDBF
#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)

#00224E#2A3F6D#575D6D#7D7C78#A59C74#D2C060#FEE838
#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)

#B2182B#EF8A62#FDDBC7#F7F7F7#D1E5F0#67A9CF#2166AC
#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)

#B35806#F1A340#FEE0B6#F7F7F7#D8DAEB#998EC3#542788
#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)

#1B9E77#D95F02#7570B3#E7298A#66A61E#E6AB02#A6761D#666666
#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)

#66C2A5#FC8D62#8DA0CB#E78AC3#A6D854#FFD92F#E5C494#B3B3B3
#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?

NameHex
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?

  1. Decide the data type (categories, ordered values or diverging values) and choose the palette type.
  2. Limit the number of colours. Beyond 6–8 categories, group or facet instead of adding hues.
  3. Assign colours by meaning. Keep the same colour for the same condition across every panel and figure.
  4. Use neutral grey for controls or context and save saturated colours for what matters.
  5. Add redundant cues: direct labels, line styles or marker shapes.
  6. Test with a simulator such as Color Oracle or Coblis, and in greyscale.
  7. 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 data scale_fill_viridis_c().
  • Python (Matplotlib): cmap="viridis" or cmap="cividis"; for categories pass the Okabe–Ito hex list to color= or set plt.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.

Sources

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