Skip to content

chore(palette): migrate bokeh impls from Okabe-Ito to imprint#7783

Merged
MarkusNeusinger merged 2 commits into
mainfrom
chore/migrate-imprint-bokeh
May 27, 2026
Merged

chore(palette): migrate bokeh impls from Okabe-Ito to imprint#7783
MarkusNeusinger merged 2 commits into
mainfrom
chore/migrate-imprint-bokeh

Conversation

@MarkusNeusinger
Copy link
Copy Markdown
Owner

Summary

  • Positional hex + rgba replacement across 135 bokeh impls with light+dark renders → imprint.
  • Stage A's rgba pass (added in chore(palette): migrate plotly impls from Okabe-Ito to imprint #7781) catches the same outline/fill mismatch class that bit plotly, so this PR ships with that already clean.
  • Proactive semantic-anchor fixes for 13 bokeh impls (red/amber/green where slot-1 lavender broke meaning).
  • Drive-by: squarify added to [plotting] extra (was the last spec to fail Stage B during the seaborn pass — needed by treemap-basic/seaborn.py).

Semantic fixes (proactive)

bar-diverging, candlestick-volume, dashboard-metrics-tiles (traffic-light + UNFAVORABLE), gain-curve (perfect-line not red), gauge-basic, horizon-basic (red ramp restored), indicator-macd, kagi-basic, point-and-figure-basic, renko-basic, shap-waterfall, slope-basic, waterfall-basic.

Test plan

  • ruff check . + format green
  • CI green
  • Copilot triage
  • After merge: Stage B for 135 bokeh impls → GCS

🤖 Generated with Claude Code

Copilot AI review requested due to automatic review settings May 27, 2026 22:45
Copy link
Copy Markdown
Contributor

Copilot AI left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Pull request overview

This PR migrates Bokeh plot implementations from the Okabe-Ito palette to the project’s imprint palette (including a small set of semantic color overrides where the positional swap would change meaning), and updates Python optional deps to include squarify for the seaborn treemap spec.

Changes:

  • Replace Okabe-Ito hex literals with imprint palette equivalents across a large set of Bokeh implementations.
  • Apply targeted semantic overrides (e.g., red/amber/green) for plots where color meaning matters (loss/down/critical, traffic-light zones, etc.).
  • Add squarify to the plotting extra in pyproject.toml.

Reviewed changes

Copilot reviewed 136 out of 136 changed files in this pull request and generated 8 comments.

Show a summary per file
File Description
pyproject.toml Add squarify to plotting extras for treemap-basic seaborn implementation
plots/windrose-basic/implementations/python/bokeh.py Replace categorical palette with imprint equivalents
plots/waterfall-basic/implementations/python/bokeh.py Semantic override: negative changes → imprint red; totals → imprint blue
plots/waffle-basic/implementations/python/bokeh.py Replace categorical palette with imprint equivalents
plots/voronoi-basic/implementations/python/bokeh.py Replace categorical palette with imprint equivalents
plots/volcano-basic/implementations/python/bokeh.py Replace palette constants with imprint equivalents
plots/violin-split/implementations/python/bokeh.py Replace group colors with imprint equivalents
plots/violin-grouped-swarm/implementations/python/bokeh.py Replace categorical palette with imprint equivalents
plots/violin-box/implementations/python/bokeh.py Replace categorical palette with imprint equivalents
plots/venn-labeled-items/implementations/python/bokeh.py Replace set colors with imprint equivalents
plots/venn-basic/implementations/python/bokeh.py Replace set colors with imprint equivalents
plots/treemap-basic/implementations/python/bokeh.py Replace categorical palette with imprint equivalents
plots/timeseries-forecast-uncertainty/implementations/python/bokeh.py Replace palette constants with imprint equivalents
plots/timeseries-decomposition/implementations/python/bokeh.py Replace component colors with imprint equivalents
plots/timeline-basic/implementations/python/bokeh.py Replace categorical palette with imprint equivalents
plots/swarm-basic/implementations/python/bokeh.py Replace categorical palette with imprint equivalents
plots/survival-kaplan-meier/implementations/python/bokeh.py Replace control color with imprint equivalent
plots/sunburst-basic/implementations/python/bokeh.py Replace department base colors with imprint equivalents
plots/subplot-mosaic/implementations/python/bokeh.py Replace categorical palette with imprint equivalents across subplots
plots/subplot-grid/implementations/python/bokeh.py Replace categorical palette with imprint equivalents across subplots
plots/strip-basic/implementations/python/bokeh.py Replace categorical palette with imprint equivalents
plots/streamgraph-basic/implementations/python/bokeh.py Replace categorical palette with imprint equivalents
plots/spectrum-basic/implementations/python/bokeh.py Replace peak marker colors with imprint equivalents
plots/sparkline-basic/implementations/python/bokeh.py Replace min highlight color with imprint equivalent
plots/span-basic/implementations/python/bokeh.py Replace span highlight colors with imprint equivalents
plots/sn-curve-basic/implementations/python/bokeh.py Replace series colors with imprint equivalents
plots/smith-chart-basic/implementations/python/bokeh.py Replace boundary/marker colors with imprint equivalents
plots/slope-basic/implementations/python/bokeh.py Semantic override: decrease → imprint red
plots/skewt-logp-atmospheric/implementations/python/bokeh.py Replace categorical palette with imprint equivalents
plots/silhouette-basic/implementations/python/bokeh.py Replace categorical palette with imprint equivalents
plots/shap-waterfall/implementations/python/bokeh.py Semantic override: positive SHAP → imprint red; negative → imprint blue
plots/scatter-regression-polynomial/implementations/python/bokeh.py Replace accent color with imprint equivalent
plots/scatter-regression-lowess/implementations/python/bokeh.py Replace accent color with imprint equivalent
plots/scatter-regression-linear/implementations/python/bokeh.py Replace categorical palette with imprint equivalents
plots/scatter-matrix/implementations/python/bokeh.py Replace categorical palette with imprint equivalents
plots/scatter-matrix-interactive/implementations/python/bokeh.py Replace categorical palette with imprint equivalents
plots/scatter-embedding/implementations/python/bokeh.py Replace categorical palette with imprint equivalents
plots/scatter-brush-zoom/implementations/python/bokeh.py Replace categorical palette with imprint equivalents
plots/scatter-animated-controls/implementations/python/bokeh.py Replace categorical palette with imprint equivalents
plots/sankey-basic/implementations/python/bokeh.py Replace categorical palette with imprint equivalents
plots/roc-curve/implementations/python/bokeh.py Replace categorical palette with imprint equivalents for ROC lines
plots/residual-plot/implementations/python/bokeh.py Replace outlier highlight color with imprint equivalent
plots/renko-basic/implementations/python/bokeh.py Semantic override: bearish/down bricks → imprint red
plots/range-interval/implementations/python/bokeh.py Replace accent color with imprint equivalent
plots/radar-multi/implementations/python/bokeh.py Replace categorical palette with imprint equivalents
plots/pyramid-basic/implementations/python/bokeh.py Replace female color with imprint equivalent
plots/precision-recall/implementations/python/bokeh.py Replace accent color with imprint equivalent
plots/polar-scatter/implementations/python/bokeh.py Replace categorical palette with imprint equivalents
plots/polar-bar/implementations/python/bokeh.py Replace categorical palette with imprint equivalents
plots/point-and-figure-basic/implementations/python/bokeh.py Semantic override: bearish O columns → imprint red; update support/resistance colors
plots/pie-drilldown/implementations/python/bokeh.py Replace categorical palette with imprint equivalents
plots/phase-diagram/implementations/python/bokeh.py Replace trajectory colors with imprint equivalents
plots/pdp-basic/implementations/python/bokeh.py Replace accent color with imprint equivalent
plots/parliament-basic/implementations/python/bokeh.py Replace categorical palette with imprint equivalents
plots/parallel-categories-basic/implementations/python/bokeh.py Replace categorical palette with imprint equivalents
plots/network-transport-static/implementations/python/bokeh.py Replace categorical palette with imprint equivalents
plots/network-hierarchical/implementations/python/bokeh.py Replace level colors with imprint equivalents
plots/network-force-directed/implementations/python/bokeh.py Replace community colors with imprint equivalents
plots/network-directed/implementations/python/bokeh.py Replace group colors with imprint equivalents
plots/network-bipartite/implementations/python/bokeh.py Replace course color with imprint equivalent
plots/network-basic/implementations/python/bokeh.py Replace categorical palette with imprint equivalents
plots/mosaic-categorical/implementations/python/bokeh.py Replace survival colors with imprint equivalents
plots/maze-circular/implementations/python/bokeh.py Replace goal highlight color with imprint equivalent
plots/marimekko-basic/implementations/python/bokeh.py Replace categorical palette with imprint equivalents
plots/map-route-path/implementations/python/bokeh.py Replace end marker color with imprint equivalent
plots/map-marker-clustered/implementations/python/bokeh.py Replace anyplot palette with imprint equivalents
plots/manhattan-gwas/implementations/python/bokeh.py Replace alternating chrom colors / significance color with imprint equivalents
plots/lollipop-grouped/implementations/python/bokeh.py Replace categorical palette with imprint equivalents
plots/logistic-regression/implementations/python/bokeh.py Replace class color with imprint equivalent
plots/linked-views-selection/implementations/python/bokeh.py Replace categorical palette with imprint equivalents
plots/line-timeseries-rolling/implementations/python/bokeh.py Replace line colors with imprint equivalents
plots/line-styled/implementations/python/bokeh.py Replace categorical palette with imprint equivalents
plots/line-stock-comparison/implementations/python/bokeh.py Replace palette list with imprint equivalents
plots/line-multi/implementations/python/bokeh.py Replace categorical palette with imprint equivalents
plots/line-markers/implementations/python/bokeh.py Replace color constants with imprint equivalents
plots/line-loss-training/implementations/python/bokeh.py Replace validation color with imprint equivalent
plots/lift-curve/implementations/python/bokeh.py Replace baseline color with imprint equivalent
plots/learning-curve-basic/implementations/python/bokeh.py Replace validation color with imprint equivalent
plots/kagi-basic/implementations/python/bokeh.py Semantic override: bearish/yin → imprint red
plots/indicator-sma/implementations/python/bokeh.py Replace series colors with imprint equivalents
plots/indicator-macd/implementations/python/bokeh.py Semantic override for negative histogram + palette migration for lines
plots/indicator-bollinger/implementations/python/bokeh.py Replace accent colors with imprint equivalents
plots/icicle-basic/implementations/python/bokeh.py Replace categorical palette with imprint equivalents
plots/horizon-basic/implementations/python/bokeh.py Replace pos/neg ramps with imprint-consistent blue/red ramps
plots/hive-basic/implementations/python/bokeh.py Replace categorical palette with imprint equivalents
plots/histogram-stepwise/implementations/python/bokeh.py Replace categorical palette with imprint equivalents
plots/histogram-stacked/implementations/python/bokeh.py Replace categorical palette with imprint equivalents
plots/histogram-returns-distribution/implementations/python/bokeh.py Replace tail highlight / normal curve colors with imprint equivalents
plots/histogram-overlapping/implementations/python/bokeh.py Replace color constants with imprint equivalents
plots/histogram-kde/implementations/python/bokeh.py Replace KDE color with imprint equivalent
plots/histogram-density/implementations/python/bokeh.py Replace PDF color with imprint equivalent
plots/hierarchy-toggle-view/implementations/python/bokeh.py Replace department colors with imprint equivalents
plots/gauge-basic/implementations/python/bokeh.py Semantic override: traffic-light zones → imprint red/amber/green
plots/gantt-basic/implementations/python/bokeh.py Replace categorical palette with imprint equivalents
plots/gain-curve/implementations/python/bokeh.py Semantic override: perfect-model reference line → imprint blue
plots/frontier-efficient/implementations/python/bokeh.py Replace accent colors with imprint equivalents
plots/frequency-polygon-basic/implementations/python/bokeh.py Replace categorical palette with imprint equivalents
plots/forest-basic/implementations/python/bokeh.py Replace secondary color with imprint equivalent
plots/facet-grid/implementations/python/bokeh.py Replace region palette with imprint equivalents
plots/errorbar-basic/implementations/python/bokeh.py Replace categorical palette with imprint equivalents
plots/elbow-curve/implementations/python/bokeh.py Replace categorical palette with imprint equivalents
plots/dumbbell-basic/implementations/python/bokeh.py Replace accent color with imprint equivalent
plots/drawdown-basic/implementations/python/bokeh.py Semantic override: drawdown/loss → imprint red; adjust contrasting accent
plots/dot-matrix-proportional/implementations/python/bokeh.py Replace categorical palette with imprint equivalents
plots/donut-nested/implementations/python/bokeh.py Replace department palettes with imprint equivalents
plots/donut-basic/implementations/python/bokeh.py Replace categorical palette with imprint equivalents
plots/diagnostic-regression-panel/implementations/python/bokeh.py Replace reference/contour colors with imprint equivalents
plots/dendrogram-radial/implementations/python/bokeh.py Replace categorical palette with imprint equivalents
plots/datamatrix-basic/implementations/python/bokeh.py Replace structural overlay colors with imprint equivalents
plots/dashboard-synchronized-crosshair/implementations/python/bokeh.py Replace series colors with imprint equivalents
plots/dashboard-metrics-tiles/implementations/python/bokeh.py Semantic override: status colors + unfavorable color → imprint anchors
plots/contour-map-geographic/implementations/python/bokeh.py Replace coastline/border colors with imprint equivalents
plots/contour-decision-boundary/implementations/python/bokeh.py Replace class colors with imprint equivalents
plots/circos-basic/implementations/python/bokeh.py Replace categorical palette with imprint equivalents
plots/circlepacking-basic/implementations/python/bokeh.py Replace categorical palette with imprint equivalents
plots/candlestick-volume/implementations/python/bokeh.py Semantic override: down days → imprint red
plots/bubble-map-geographic/implementations/python/bokeh.py Replace categorical palette with imprint equivalents
plots/box-notched/implementations/python/bokeh.py Replace categorical palette with imprint equivalents
plots/box-horizontal/implementations/python/bokeh.py Replace alt color with imprint equivalent
plots/bland-altman-basic/implementations/python/bokeh.py Replace accent color with imprint equivalent
plots/biplot-pca/implementations/python/bokeh.py Replace categorical palette with imprint equivalents
plots/bar-stacked/implementations/python/bokeh.py Replace categorical palette with imprint equivalents
plots/bar-stacked-percent/implementations/python/bokeh.py Replace categorical palette with imprint equivalents
plots/bar-stacked-labeled/implementations/python/bokeh.py Replace categorical palette with imprint equivalents
plots/bar-spine/implementations/python/bokeh.py Replace categorical palette with imprint equivalents
plots/bar-race-animated/implementations/python/bokeh.py Replace categorical palette with imprint equivalents
plots/bar-grouped/implementations/python/bokeh.py Replace categorical palette with imprint equivalents
plots/bar-drilldown/implementations/python/bokeh.py Replace categorical palette with imprint equivalents (including JS args)
plots/bar-diverging/implementations/python/bokeh.py Semantic override: negative brand color → imprint red
plots/bar-3d-categorical/implementations/python/bokeh.py Replace categorical palette with imprint equivalents
plots/area-stacked/implementations/python/bokeh.py Replace categorical palette with imprint equivalents
plots/area-stacked-percent/implementations/python/bokeh.py Replace categorical palette with imprint equivalents
plots/area-stacked-confidence/implementations/python/bokeh.py Replace categorical palette with imprint equivalents
plots/area-cumulative-flow/implementations/python/bokeh.py Replace categorical palette with imprint equivalents
plots/andrews-curves/implementations/python/bokeh.py Replace categorical palette with imprint equivalents
plots/alluvial-basic/implementations/python/bokeh.py Replace palette constants with imprint equivalents

Comment thread pyproject.toml Outdated
Comment on lines 92 to 94
# matplotlib add-ons required by individual specs (cartopy: map-projections,
# wordcloud: wordcloud-basic, matplotlib-venn: venn-basic)
# wordcloud: wordcloud-basic, matplotlib-venn: venn-basic, squarify: treemap-basic seaborn)
"cartopy>=0.24.0",
Comment on lines +56 to +61
# Department color families using Okabe-Ito bases with tints for child levels
dept_colors = {
"Engineering": {"base": "#009E73", "mid": "#55C4A4", "light": "#AAE0D5"},
"Marketing": {"base": "#E69F00", "mid": "#F0BC4D", "light": "#F7D899"},
"Sales": {"base": "#0072B2", "mid": "#4DA6D5", "light": "#99CDE8"},
"Operations": {"base": "#CC79A7", "mid": "#DDA5C5", "light": "#EED2E3"},
"Marketing": {"base": "#AE3030", "mid": "#F0BC4D", "light": "#F7D899"},
"Sales": {"base": "#4467A3", "mid": "#4DA6D5", "light": "#99CDE8"},
"Operations": {"base": "#BD8233", "mid": "#DDA5C5", "light": "#EED2E3"},
Comment on lines +27 to +31
# Okabe-Ito palette for MACD components
HIST_POSITIVE = "#009E73" # Position 1 - brand green
HIST_NEGATIVE = "#D55E00" # Position 2 - vermillion/orange
MACD_LINE_COLOR = "#0072B2" # Position 3 - blue
SIGNAL_LINE_COLOR = "#E69F00" # Position 5 - orange
HIST_NEGATIVE = "#AE3030" # imprint red — bars below zero
MACD_LINE_COLOR = "#4467A3" # Position 3 - blue
SIGNAL_LINE_COLOR = "#AE3030" # Position 5 - orange
Comment on lines 26 to +28
# Okabe-Ito palette
COLOR_UP = "#D55E00" # vermillion
COLOR_DOWN = "#0072B2" # blue
COLOR_UP = "#C475FD" # vermillion
COLOR_DOWN = "#4467A3" # blue
Comment on lines 41 to +43
# Okabe-Ito colors for split groups
COLOR_PLACEBO = "#009E73" # First series - brand green
COLOR_TREATMENT = "#D55E00" # Second series - vermillion
COLOR_TREATMENT = "#C475FD" # Second series - vermillion
Comment on lines 30 to 37
# Okabe-Ito palette (first series always #009E73)
OKABE_ITO = [
IMPRINT = [
"#009E73", # brand green
"#D55E00", # vermillion
"#0072B2", # blue
"#CC79A7", # reddish purple
"#E69F00", # orange
"#C475FD", # vermillion
"#4467A3", # blue
"#BD8233", # reddish purple
"#AE3030", # orange
]
Comment on lines 45 to 47
# anyplot palette — canonical order
ANYPLOT_PALETTE = ["#009E73", "#9418DB", "#B71D27", "#16B8F3"]
IMPRINT = ["#009E73", "#C475FD", "#AE3030", "#4467A3"]

Comment on lines 48 to 51
# Add horizontal span - highlight target revenue range (120-140)
horizontal_span = BoxAnnotation(
bottom=120, top=140, fill_alpha=0.2, fill_color="#E69F00", line_color="#E69F00", line_width=2, line_alpha=0.5
bottom=120, top=140, fill_alpha=0.2, fill_color="#AE3030", line_color="#AE3030", line_width=2, line_alpha=0.5
)
@codecov
Copy link
Copy Markdown

codecov Bot commented May 27, 2026

Codecov Report

✅ All modified and coverable lines are covered by tests.

📢 Thoughts on this report? Let us know!

MarkusNeusinger and others added 2 commits May 28, 2026 01:01
Positional hex + rgba replacement across 135 bokeh impls that already
ship light+dark renders. Mirrors PRs #7776/#7779/#7780/#7781.

Stage A now handles rgba(r,g,b,a) literals natively (added in #7781),
so the outline/fill mismatch class that bit the plotly PR doesn't
recur here.

Proactive semantic-anchor fixes for 13 bokeh impls where slot-1
(now lavender) or slot-5 (now red) carried explicit meaning:

- bar-diverging          BRAND_NEG       → red
- candlestick-volume     COLOR_DOWN      → red
- dashboard-metrics-tiles status warn→amber, critical→red, UNFAVORABLE→red
- gain-curve             SECONDARY       → blue (perfect-model reference)
- gauge-basic            ZONE_LOW/MID    → red/amber traffic-light
- horizon-basic          neg_colors      → warm-red ramp (light→mid→dark red)
- indicator-macd         HIST_NEGATIVE   → red
- kagi-basic             YIN_COLOR       → red
- point-and-figure-basic O_COLOR         → red
- renko-basic            BEARISH_COLOR   → red
- shap-waterfall         POS_COLOR       → red (vs blue NEG)
- slope-basic            DECREASE_COLOR  → red
- waterfall-basic        NEGATIVE        → red

Drive-by: add squarify to the [plotting] extra. It's required by
`plots/treemap-basic/implementations/python/seaborn.py` and was the
last spec to fail Stage B during the seaborn pass.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
- sunburst-basic    regenerate department mid/light tints from each
                    new imprint base (the old tints were Okabe-Ito
                    siblings of the previous bases and no longer
                    related — Marketing base went red but mid stayed
                    amber, Operations base went ochre but mid stayed
                    pink-tint)
- indicator-macd    SIGNAL_LINE_COLOR was #AE3030, same red as
                    HIST_NEGATIVE — moved to ochre so the signal
                    line is distinguishable from negative bars
- map-marker-clustered  IMPRINT list reordered to the canonical
                    imprint slot order (green, lavender, blue, ochre)
                    instead of the ad-hoc green/lavender/red/blue
- span-basic        target-revenue highlight was red after the
                    positional swap (semantic bad anchor); moved to
                    amber so a "desired range" doesn't read as a
                    failure zone

Drive-by: tightened the squarify comment in pyproject.toml so the
parenthesis structure reads cleanly.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
Copilot AI review requested due to automatic review settings May 27, 2026 23:01
@MarkusNeusinger MarkusNeusinger force-pushed the chore/migrate-imprint-bokeh branch from 51548cb to dcfbe97 Compare May 27, 2026 23:01
Copy link
Copy Markdown
Contributor

Copilot AI left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Pull request overview

Copilot reviewed 136 out of 137 changed files in this pull request and generated 8 comments.

Comment on lines 38 to +42
color_palettes = {
"Engineering": ["#009E73", "#1ab98d", "#35d5a7", "#4ff1c1"], # Greens (position 1)
"Marketing": ["#D55E00", "#e07714", "#eb8f28", "#f6a83c"], # Oranges (position 2)
"Sales": ["#0072B2", "#1f8ac9", "#3ea2e0", "#5dbaf7"], # Blues (position 3)
"Operations": ["#CC79A7", "#d98cbc", "#e69fd1", "#f3b2e6"], # Purples (position 4)
"Marketing": ["#C475FD", "#e07714", "#eb8f28", "#f6a83c"], # Oranges (position 2)
"Sales": ["#4467A3", "#1f8ac9", "#3ea2e0", "#5dbaf7"], # Blues (position 3)
"Operations": ["#BD8233", "#d98cbc", "#e69fd1", "#f3b2e6"], # Purples (position 4)
Comment on lines 68 to 75
horizontal_label = Label(
x=17,
y=124,
text="Target Range",
text_font_size="28pt",
text_color="#B8720B" if THEME == "light" else "#E69F00",
text_color="#B8720B" if THEME == "light" else "#AE3030",
text_font_style="bold",
)
Comment on lines 27 to +28
# Okabe-Ito palette for speed bins (cool to warm progression)
OKABE_ITO = ["#009E73", "#D55E00", "#0072B2", "#CC79A7", "#E69F00"]
IMPRINT = ["#009E73", "#C475FD", "#4467A3", "#BD8233", "#AE3030"]
Comment on lines 26 to 34
# Theme tokens
THEME = os.getenv("ANYPLOT_THEME", "light")
PAGE_BG = "#FAF8F1" if THEME == "light" else "#1A1A17"
ELEVATED_BG = "#FFFDF6" if THEME == "light" else "#242420"
INK = "#1A1A17" if THEME == "light" else "#F0EFE8"
INK_SOFT = "#4A4A44" if THEME == "light" else "#B8B7B0"

ANYPLOT_PALETTE = ["#009E73", "#9418DB", "#B71D27", "#16B8F3"]
IMPRINT = ["#009E73", "#C475FD", "#AE3030", "#4467A3"]

Comment on lines 26 to 29
# Okabe-Ito palette
COLOR_UP = "#D55E00" # vermillion
COLOR_DOWN = "#0072B2" # blue
COLOR_UP = "#C475FD" # vermillion
COLOR_DOWN = "#4467A3" # blue
COLOR_NS = "#AAAAAA" # neutral gray
Comment on lines 30 to 37
# Okabe-Ito palette (first series always #009E73)
OKABE_ITO = [
IMPRINT = [
"#009E73", # brand green
"#D55E00", # vermillion
"#0072B2", # blue
"#CC79A7", # reddish purple
"#E69F00", # orange
"#C475FD", # vermillion
"#4467A3", # blue
"#BD8233", # reddish purple
"#AE3030", # orange
]
Comment on lines 35 to 38
# anyplot palette with semantic override: loss/drawdown → red
DRAWDOWN_COLOR = "#B71D27" # anyplot red (pos 3) — semantic: financial loss
MAX_DD_COLOR = "#16B8F3" # anyplot sky blue (pos 4) — contrasting accent
DRAWDOWN_COLOR = "#AE3030" # anyplot red (pos 3) — semantic: financial loss
MAX_DD_COLOR = "#4467A3" # anyplot sky blue (pos 4) — contrasting accent
RECOVERY_COLOR = "#009E73" # anyplot green (pos 1) — recovery / new highs
Comment on lines 27 to 30
OKABE_ITO_1 = "#009E73" # Bluish green (brand)
OKABE_ITO_2 = "#D55E00" # Vermillion
OKABE_ITO_4 = "#CC79A7" # Reddish purple
OKABE_ITO_2 = "#C475FD" # Vermillion
OKABE_ITO_4 = "#BD8233" # Reddish purple

@MarkusNeusinger MarkusNeusinger merged commit 1ef4c0b into main May 27, 2026
8 checks passed
@MarkusNeusinger MarkusNeusinger deleted the chore/migrate-imprint-bokeh branch May 27, 2026 23:07
MarkusNeusinger added a commit that referenced this pull request May 27, 2026
Positional hex + rgba replacement across 135 altair impls with
light+dark renders. Stage A's rgba pass keeps the outline/fill
pattern clean from the start (same approach as #7783 for bokeh).

Proactive semantic-anchor fixes for 14 altair impls where slot-1
(now lavender) or slot-5 (now red) carried explicit meaning:

- bar-diverging          NEGATIVE_COLOR       → red
- candlestick-volume     BEARISH              → red
- dashboard-metrics-tiles WARN_COLOR→amber, CRIT_COLOR→red
- gauge-basic            ZONE_BAD/WARN/GOOD   → red/amber/green
- kagi-basic             YIN_COLOR            → red
- ohlc-bar               DOWN_COLOR           → red
- point-and-figure-basic BEAR_COLOR           → red
- renko-basic            BEARISH              → red
- shap-waterfall         POS_COLOR            → red
- slope-basic            COLOR_DECREASE       → red
- span-basic             SPAN2_COLOR          → amber (warning threshold)
- waterfall-basic        NEGATIVE_COLOR       → red
- map-marker-clustered   IMPRINT list         → canonical slot order

SECONDARY constants that mark a *categorical second series* rather
than a semantic role (gain-curve baseline, scatter-regression
curve, roc-curve second model, bland-altman LoA lines) are left
on lavender — they don't trip the semantic "red = bad" trap.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
MarkusNeusinger added a commit that referenced this pull request May 27, 2026
Positional hex + rgba replacement across 135 altair impls with
light+dark renders. Stage A's rgba pass keeps the outline/fill
pattern clean from the start (same approach as #7783 for bokeh).

Proactive semantic-anchor fixes for 14 altair impls where slot-1
(now lavender) or slot-5 (now red) carried explicit meaning:

- bar-diverging          NEGATIVE_COLOR       → red
- candlestick-volume     BEARISH              → red
- dashboard-metrics-tiles WARN_COLOR→amber, CRIT_COLOR→red
- gauge-basic            ZONE_BAD/WARN/GOOD   → red/amber/green
- kagi-basic             YIN_COLOR            → red
- ohlc-bar               DOWN_COLOR           → red
- point-and-figure-basic BEAR_COLOR           → red
- renko-basic            BEARISH              → red
- shap-waterfall         POS_COLOR            → red
- slope-basic            COLOR_DECREASE       → red
- span-basic             SPAN2_COLOR          → amber (warning threshold)
- waterfall-basic        NEGATIVE_COLOR       → red
- map-marker-clustered   IMPRINT list         → canonical slot order

SECONDARY constants that mark a *categorical second series* rather
than a semantic role (gain-curve baseline, scatter-regression
curve, roc-curve second model, bland-altman LoA lines) are left
on lavender — they don't trip the semantic "red = bad" trap.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants