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:
blue#2d74b3cyan#4cb6d3green#4e9c78brown#8a6744gold#bf9638purple#9c6fa7orange#cd6d40moss#6d8a47gray#87909dcharcoal#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, andgreenare distinct enough to support small charts while still feeling like part of the same calm DFT family. brownis intentionally darker and duller than the first three colors. It acts as the warm break that keeps the palette from becoming all cool hues.goldis 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.orangecarries the highest chroma in the palette. It works because it is delayed until slot 7 rather than used as an early headline color.mosssits between green and earth territory. That makes it a useful late expansion color without collapsing into eithergreenorgold.grayandcharcoalare 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:
bluecyangreenbrowngold
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:
purpleorangemoss
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:
graycharcoal
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:
- simulate common vision conditions
- compare the simulated colors with CIEDE2000
- treat
Delta E >= 11as 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:
- test the exact candidate sequence with the local pairwise checker
- identify the weakest real pairings rather than retuning everything
- prefer micro-tweaks in hue, value, and saturation over wholesale color swaps
- test on real chart types, not only as swatches
- 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