Skip to content

feat(highcharts): implement cat-box-strip - #11176

Merged
MarkusNeusinger merged 6 commits into
mainfrom
implementation/cat-box-strip/highcharts
Sep 2, 2026
Merged

feat(highcharts): implement cat-box-strip#11176
MarkusNeusinger merged 6 commits into
mainfrom
implementation/cat-box-strip/highcharts

Conversation

@github-actions

@github-actions github-actions Bot commented Sep 2, 2026

Copy link
Copy Markdown
Contributor

Implementation: cat-box-strip - javascript/highcharts

Implements the javascript/highcharts version of cat-box-strip.

File: plots/cat-box-strip/implementations/javascript/highcharts.js

Parent Issue: #2695


🤖 impl-generate workflow

@claude

claude Bot commented Sep 2, 2026

Copy link
Copy Markdown
Contributor

AI Review - Attempt 1/3

Image Description

Light render (plot-light.png): Background is warm off-white, consistent with #FAF8F1. Title "cat-box-strip · javascript · highcharts · anyplot.ai" is bold dark ink and clearly legible; axis titles "Transportation Mode" / "Commute Time (minutes)" and tick labels are dark-gray and legible. Four groups are shown — Car (green), Bus (lavender, with two outlier points near 91-95 above the whisker), Bike (blue), Walk (ochre) — each a box (median/Q1/Q3) with whiskers plus a jittered, semi-transparent strip of individual points. First categorical series is confirmed brand green. All text is readable against the light background.

Dark render (plot-dark.png): Background is warm near-black, consistent with #1A1A17. Title, axis titles, and tick labels switch to light/off-white ink and stay clearly legible — no dark-on-dark text found. Box/strip layout and data colors (green/lavender/blue/ochre, same Bus outliers) are identical to the light render, confirming only chrome flips between themes. All text is readable against the dark background.

Both paragraphs above describe both renders in full.

Score: 86/100

Category Score Max
Visual Quality 27 30
Design Excellence 12 20
Spec Compliance 15 15
Data Quality 15 15
Code Quality 9 10
Library Mastery 8 10
Total 86 100

Visual Quality (27/30)

  • VQ-01: Text Legibility (7/8)
  • VQ-02: No Overlap (6/6)
  • VQ-03: Element Visibility (4/6) - Markers have no edge stroke and clump in the densest groups
  • VQ-04: Color Accessibility (2/2)
  • VQ-05: Layout & Canvas (4/4)
  • VQ-06: Axis Labels & Title (2/2)
  • VQ-07: Palette Compliance (2/2)

Design Excellence (12/20)

  • DE-01: Aesthetic Sophistication (5/8) - Custom box/whisker construction plus strip overlay goes beyond generic defaults
  • DE-02: Visual Refinement (3/6) - Clean spines/grid/whitespace, but skips the recommended white marker edge for point definition
  • DE-03: Data Storytelling (4/6) - Box + strip combination clearly conveys distribution shape and highlights outliers

Spec Compliance (15/15)

  • SC-01: Plot Type (5/5)
  • SC-02: Required Features (4/4)
  • SC-03: Data Mapping (3/3)
  • SC-04: Title & Legend (3/3)

Data Quality (15/15)

  • DQ-01: Feature Coverage (6/6)
  • DQ-02: Realistic Context (5/5)
  • DQ-03: Appropriate Scale (4/4)

Code Quality (9/10)

  • CQ-01: KISS Structure (2/3) - Several helper functions, justified by the required statistics
  • CQ-02: Reproducibility (2/2)
  • CQ-03: Clean Imports (2/2)
  • CQ-04: Code Elegance (2/2)
  • CQ-05: Output & API (1/1)

Library Mastery (8/10)

  • LM-01: Idiomatic Usage (4/5) - Correctly works around the missing boxplot module using chart.renderer primitives anchored to real axis coordinates
  • LM-02: Distinctive Features (4/5) - Highcharts.color().setOpacity(), tickPositions, per-series default marker symbols

Score Caps Applied

  • None

Strengths

  • Correctly works around the missing highcharts-more/boxplot module: box, whiskers, and median are drawn from primitive SVG shapes (renderer.path/rect) anchored to real axis pixel coordinates via toPixels(), driven by actual computed quartile/IQR statistics — exactly the pattern the library prompt recommends.
  • Full spec feature coverage: median, Q1/Q3 box, IQR-fenced whiskers, jittered semi-transparent strip points, deliberately varying sample sizes across groups (80/65/50/35), and genuine outliers (bus delays at 91/95) rendered beyond the whisker.
  • Imprint palette applied in canonical order and kept identical between light/dark renders; all chrome is theme-adaptive via window.ANYPLOT_TOKENS.
  • Each series keeps Highcharts' default per-index marker symbol (circle/diamond/square/triangle), giving free redundant shape encoding across the four categories.

Weaknesses

  • Strip/scatter markers are drawn with lineWidth: 0 (no edge stroke). The style guide calls for a white/background-colored edge on scatter markers for definition, especially with overlapping points — add e.g. lineColor: t.pageBg, lineWidth: 1 to the marker config so points stay distinct from each other and from the box border in denser clusters (Car: 80 pts, Bus: 65 pts).
  • In the densest groups (Car, Bus) jittered points still clump visibly near the median line — widen the jitter spread slightly (e.g. ±0.32 instead of ±0.275 of category width) or trim marker radius to ~3.5-4px to reduce overplotting without hurting legibility.

Issues Found

  1. VQ-03 / DE-02 MEDIUM: Strip markers have no edge stroke, reducing point definition in the densest groups
    • Fix: Add lineColor: t.pageBg (or white) and lineWidth: 1 to the scatter marker config
  2. VQ-03 LOW: Points still overlap visually in the two densest groups (80 and 65 samples)
    • Fix: Slightly widen jitter spread or reduce marker radius for these groups

AI Feedback for Next Attempt

Solid, spec-complete implementation with a correct workaround for the unavailable boxplot module. To push into publication quality: give the strip markers a subtle white/background edge stroke (lineColor/lineWidth) for definition against overlapping points and the box border, and slightly reduce overplotting in the two densest groups (Car, Bus) via a touch more jitter spread or smaller marker radius.

Verdict: REJECTED

@github-actions github-actions Bot added quality:86 Quality score 86/100 ai-rejected Quality not OK, triggers update labels Sep 2, 2026
@github-actions github-actions Bot added ai-attempt-1 First repair attempt and removed ai-rejected Quality not OK, triggers update labels Sep 2, 2026
Attempt 1/4 - fixes based on AI review
@github-actions

github-actions Bot commented Sep 2, 2026

Copy link
Copy Markdown
Contributor Author

🔧 Repair Attempt 1/4

Applied fixes based on AI review feedback.

Status: Repair completed, re-triggering review...


🤖 impl-repair

@claude

claude Bot commented Sep 2, 2026

Copy link
Copy Markdown
Contributor

AI Review - Attempt 2/3

Image Description

Light render (plot-light.png): Background is warm off-white, consistent with #FAF8F1. Title "cat-box-strip · javascript · highcharts · anyplot.ai" is bold dark ink and clearly legible; x-axis title "Transportation Mode" and y-axis title "Commute Time (minutes)" are dark-gray and legible; tick labels are legible; horizontal gridlines are subtle and don't compete with data. Four groups are shown — Car (green box + jittered circles), Bus (lavender box + diamonds, with two outlier points near 91/95 above the whisker), Bike (blue box + squares), Walk (ochre box + triangles). First categorical series is confirmed brand green. Box shows median line, Q1/Q3 edges, whiskers extend to the IQR fence; strip points are semi-transparent, jittered, and now carry a subtle background-colored edge stroke that separates them from the box fill and each other. All text is readable against the light background.

Dark render (plot-dark.png): Background is warm near-black, consistent with #1A1A17. Title, axis titles, and tick labels switch to light/off-white ink and remain clearly legible — no dark-on-dark text found. Gridlines stay subtle. Box/strip layout and data colors (green/lavender/blue/ochre, same Bus outliers) are identical to the light render, confirming only chrome flips between themes. Marker edge strokes are visible in this theme too. All text is readable against the dark background.

Both paragraphs above describe both renders in full.

Score: 91/100

Category Score Max
Visual Quality 29 30
Design Excellence 15 20
Spec Compliance 15 15
Data Quality 15 15
Code Quality 9 10
Library Mastery 8 10
Total 91 100

Visual Quality (29/30)

  • VQ-01: Text Legibility (8/8)
  • VQ-02: No Overlap (6/6)
  • VQ-03: Element Visibility (5/6) - Markers now carry a background-colored edge stroke and jitter was widened, fixing attempt 1's flat/clumped markers; minor residual clumping remains in the two densest groups (Car, Bus)
  • VQ-04: Color Accessibility (2/2)
  • VQ-05: Layout & Canvas (4/4)
  • VQ-06: Axis Labels & Title (2/2)
  • VQ-07: Palette Compliance (2/2)

Design Excellence (15/20)

  • DE-01: Aesthetic Sophistication (6/8) - Custom SVG box/whisker construction, box fill opacity, and per-series shape variation go well beyond generic defaults
  • DE-02: Visual Refinement (4/6) - Clean spines/grid/whitespace; the marker edge stroke fix closes the gap flagged in attempt 1
  • DE-03: Data Storytelling (5/6) - Box + strip combination clearly conveys distribution shape and highlights outliers

Spec Compliance (15/15)

  • SC-01: Plot Type (5/5)
  • SC-02: Required Features (4/4)
  • SC-03: Data Mapping (3/3)
  • SC-04: Title & Legend (3/3)

Data Quality (15/15)

  • DQ-01: Feature Coverage (6/6)
  • DQ-02: Realistic Context (5/5)
  • DQ-03: Appropriate Scale (4/4)

Code Quality (9/10)

  • CQ-01: KISS Structure (2/3) - Several helper functions, justified by the required statistics
  • CQ-02: Reproducibility (2/2)
  • CQ-03: Clean Imports (2/2)
  • CQ-04: Code Elegance (2/2)
  • CQ-05: Output & API (1/1)

Library Mastery (8/10)

  • LM-01: Idiomatic Usage (4/5) - Correctly works around the missing boxplot module using chart.renderer primitives anchored to real axis coordinates
  • LM-02: Distinctive Features (4/5) - Highcharts.color().setOpacity(), tickPositions, per-series default marker symbols

Score Caps Applied

  • None

Strengths

  • Strip markers now carry a background-colored edge stroke (lineColor: t.pageBg, lineWidth: 1), fixing attempt 1's flat/edgeless markers and giving clear point definition against the box fill and neighboring points.
  • Jitter spread was widened from ±0.275 to ±0.32 of category width, visibly reducing overplotting in the two densest groups (Car: 80 pts, Bus: 65 pts).
  • Full spec feature coverage retained: median/Q1/Q3 box, IQR-fenced whiskers, jittered semi-transparent strip points, deliberately varying sample sizes (80/65/50/35), and genuine outliers (bus delays at 91/95) rendered beyond the whisker.
  • Box, whiskers, and median are drawn from primitive SVG shapes anchored to real axis pixel coordinates, correctly working around the unavailable highcharts-more boxplot module.
  • Imprint palette in canonical order, identical between light/dark; theme-adaptive chrome throughout.
  • Per-series default marker symbols (circle/diamond/square/triangle) give free redundant shape encoding.

Weaknesses

  • Residual clumping remains in the densest groups (Car, Bus) despite the widened jitter — a further nudge to ±0.36-0.38 or trimming marker radius to ~3.5px in those groups would separate points even more cleanly, though this is now a minor polish item rather than a legibility problem.
  • Box stroke width (2.5px) is visually heavier than the whisker/median lines (2-3px), a small weight imbalance that doesn't hurt readability but could be tightened for a more uniform line hierarchy.

Issues Found

  1. VQ-03 LOW: Minor residual point clumping in the two densest groups
    • Fix: Widen jitter slightly further or trim marker radius to ~3.5px in those groups

AI Feedback for Next Attempt

Attempt 1's weaknesses (edgeless markers, dense clumping) are both addressed — the marker edge stroke and wider jitter noticeably improve point definition. Only cosmetic polish remains: a touch more jitter or a smaller radius in the Car/Bus groups, and aligning the box stroke weight with the whisker/median line weight.

Verdict: APPROVED

@github-actions github-actions Bot added quality:91 Quality score 91/100 ai-approved Quality OK, ready for merge and removed quality:86 Quality score 86/100 labels Sep 2, 2026
@MarkusNeusinger
MarkusNeusinger merged commit 69716d8 into main Sep 2, 2026
@MarkusNeusinger
MarkusNeusinger deleted the implementation/cat-box-strip/highcharts branch September 2, 2026 15:12
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

ai-approved Quality OK, ready for merge ai-attempt-1 First repair attempt quality:91 Quality score 91/100

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant