Skip to content

Default Categorical Palette

Status: draft Scope: DFT chart-library default categorical palette Source: Chart Design Notes, M1 chart-library planning

This document records the current leading DFT default categorical palette and the reasoning behind its selection. It is intentionally practical: the goal is to preserve the working decisions, ordering logic, accessibility posture, and refinement workflow that emerged during M1 palette engineering.

Related palette documents:

Current Palette

The current leading ten-color default palette is:

  1. blue #2d74b3
  2. cyan #4cb6d3
  3. green #4e9c78
  4. brown #8a6744
  5. gold #bf9638
  6. purple #9c6fa7
  7. orange #cd6d40
  8. moss #6d8a47
  9. gray #87909d
  10. charcoal #56616f
blue#2d74b3
cyan#4cb6d3
green#4e9c78
brown#8a6744
gold#bf9638
purple#9c6fa7
orange#cd6d40
moss#6d8a47
gray#87909d
charcoal#56616f

Single-Series Default

The current leading single-series default color is:

  • blue-strong #296ca8

This is intentionally related to the default categorical palette's lead color without being identical to it.

  • categorical slot 1: blue #2d74b3
  • single-series default: blue-strong #296ca8

The design intent is:

  • preserve family resemblance with the lead categorical blue
  • make the single-series color slightly darker and more concentrated rather than brighter
  • keep the result calm and professional rather than electric or UI-like

OKLCH Reference

These values are logged as a perceptual reference for future refinement.

Order Name Hex L C h
1 blue #2d74b3 0.545 0.121 248.8
2 cyan #4cb6d3 0.726 0.105 219.0
3 green #4e9c78 0.633 0.096 161.9
4 brown #8a6744 0.541 0.067 65.6
5 gold #bf9638 0.694 0.120 84.7
6 purple #9c6fa7 0.608 0.097 319.6
7 orange #cd6d40 0.637 0.135 44.6
8 moss #6d8a47 0.595 0.099 128.3
9 gray #87909d 0.650 0.022 257.5
10 charcoal #56616f 0.488 0.026 254.5

OKLCH Observations

  • The first three colors form a cool leading scaffold: blue, cyan, and green are distinct enough to support small charts while still feeling like part of the same calm DFT family.
  • brown is intentionally darker and duller than the first three colors. It acts as the warm break that keeps the palette from becoming all cool hues.
  • gold is the lightest warm in the top five. Delaying it to slot 5 avoids a too-early yellow accent while still giving the core a bright expansion color.
  • orange carries the highest chroma in the palette. It works because it is delayed until slot 7 rather than used as an early headline color.
  • moss sits between green and earth territory. That makes it a useful late expansion color without collapsing into either green or gold.
  • gray and charcoal are both very low chroma, as intended. The distinction between them is primarily lightness, not hue identity.
  • The OKLCH view confirms the broader palette strategy: cool lead colors first, then a warm break, then quieter earths and support neutrals.

Why This Palette

The palette was chosen to satisfy several goals at once:

  • feel calm, professional, and deliberate rather than bright-for-its-own-sake
  • remain recognizably BI-native, especially through a blue-first lead color
  • provide a strong first five positions for the most common 2-5 category charts
  • keep later positions usable without forcing ten equally vivid hues
  • preserve obvious everyday-name differences between positions
  • stay as accessible as practical under common color-vision-deficiency checks, while acknowledging that late palette positions will never be perfect in all pairwise combinations

Ordering Logic

The order is intentional.

1-5: categorical core

These are the strongest and most likely to be used colors:

  • blue
  • cyan
  • green
  • brown
  • gold

This ordering supports the most common chart sizes:

  • 1-category chart: blue
  • 2-category chart: blue, cyan
  • 3-category chart: blue, cyan, green
  • 4-category chart: blue, cyan, green, brown
  • 5-category chart: blue, cyan, green, brown, gold

The key decision here is that cyan stays early rather than yielding to a warm second color. That preserves a useful two-blue opening for small charts while still letting brown and gold break the cool cluster by slot 4 and 5.

6-8: expressive expansion colors

These colors broaden the palette while remaining clearly distinct in everyday language:

  • purple
  • orange
  • moss

These are less universally robust than the core five, but they preserve a calm editorial tone better than forcing a brighter rainbow in the back half.

9-10: neutral support colors

The final two colors are intentionally quieter:

  • gray
  • charcoal

They are still legitimate category colors, but they are expected to appear less often and to benefit more from labeling and other redundant cues when used.

Selection Principles

The palette was shaped by the following principles:

  • Use hue for unordered identity rather than as a scale or progression.
  • Favor blue as the lead hue because it is both competitively familiar and perceptually reliable.
  • Keep the second color in the blue family rather than forcing a warm contrast too early.
  • Use a dark gold rather than a bright lemon yellow.
  • Avoid ordinary categorical red in the early slots.
  • Keep the first five colors noticeably different in everyday-name terms, not just in numeric hue angle.
  • Let later slots quiet down into earths, moss, and neutrals instead of forcing a long rainbow.
  • Keep the cool grays slightly cool, but not blue enough to be mistaken for another categorical blue.

Accessibility Posture

This palette was not selected by swatch aesthetics alone. It was iterated using Leonardo-style pairwise checks:

  1. simulate common vision conditions
  2. compare the simulated colors with CIEDE2000
  3. treat Delta E >= 11 as passing

DFT includes a local script for this workflow:

uv run python scripts/palette_deltae_checker.py \
  blue=#2d74b3 cyan=#4cb6d3 green=#4e9c78 brown=#8a6744 gold=#bf9638

and similarly for larger candidate palettes.

Important posture decisions:

  • optimize the first five positions most aggressively
  • treat later positions as useful but less perfect expansion colors
  • use direct labels, legends, symbols, dashes, or other redundant cues once charts move beyond a small number of categories
  • evaluate colors on actual DFT surfaces rather than isolated swatches

Known Tradeoffs

This palette is a strong working default, not a claim that all pairwise relationships are perfect under every simulated condition.

The main tradeoffs are:

  • some late earth and neutral colors compress in grayscale-like conditions
  • colors beyond the first five increasingly rely on chart context and labeling
  • the palette is intentionally more editorial and restrained than a generic “ten bright colors” product palette

These tradeoffs were accepted because they produce a better overall system than either:

  • forcing ten equally vivid hues that become fragile or garish
  • collapsing the whole palette into muted colors that lose category identity

Refinement Workflow

When refining this palette in the future:

  1. test the exact candidate sequence with the local pairwise checker
  2. identify the weakest real pairings rather than retuning everything
  3. prefer micro-tweaks in hue, value, and saturation over wholesale color swaps
  4. test on real chart types, not only as swatches
  5. prioritize likely 3-color and 4-color chart use over rare 9-10 color cases

You can also inspect how failures accumulate as colors are added in order:

uv run python scripts/palette_deltae_checker.py --prefix-waterfall \
  blue=#2d74b3 cyan=#4cb6d3 green=#4e9c78 brown=#8a6744 \
  gold=#bf9638 purple=#9c6fa7 orange=#cd6d40 moss=#6d8a47 \
  gray=#87909d charcoal=#56616f

Open Questions

  • whether some later default-palette colors should shift again after real-chart testing
  • whether DFT should eventually formalize chart-family-specific palette usage rules for pies, donuts, and other adjacency-sensitive charts