You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
Light render (plot-light.png): Warm off-white background (#FAF8F1) — correct. Title "sankey-basic · altair · anyplot.ai" in bold dark text, subtitle "Energy Flow from Sources to Sectors" in dark-gray; both clearly readable. Four source nodes on the left (top→bottom: Renewable, Nuclear, Gas, Coal) with correct Okabe-Ito colors: Coal=#009E73 (green-teal), Gas=#D55E00 (orange), Nuclear=#0072B2 (blue), Renewable=#CC79A7 (pink-purple). Four target nodes on the right use custom colors (Residential=teal, Commercial=light-green, Industrial=warm-tan, Transport=light-purple). Flow bands colored by source with opacity=0.55 — significant X-crossing in the center due to full 4×4 mesh. Legend box (bottom-right) shows correct "Energy Source" color swatches. All node labels (20px bold, dark text) fully readable against the light background.
Dark render (plot-dark.png): Near-black background (#1A1A17) — correct. Title and subtitle render in light/white text — readable. All node labels render in light (#F0EFE8) text against the dark background — no dark-on-dark failures detected. Legend box uses dark elevated fill (#242420) with light text labels. Flow band hex values are theme-constant (same as light render); the bands appear visually darker/more saturated due to expected alpha-blending behavior against the dark surface — this is correct behavior, not a data color change. Data colors identical to light render. Both themes pass the legibility check.
Score: 85/100
Category
Score
Max
Visual Quality
27
30
Design Excellence
11
20
Spec Compliance
15
15
Data Quality
15
15
Code Quality
10
10
Library Mastery
7
10
Total
85
100
Visual Quality (27/30)
VQ-01: Text Legibility (8/8) — All font sizes explicitly set (title=28px, node labels=20px bold, legend=16-18px). Readable in both themes.
VQ-02: No Overlap (6/6) — No label collisions; source/target labels positioned cleanly outside the crossing zone.
VQ-03: Element Visibility (5/6) — Flows visible with appropriate opacity. Individual flow tracing is challenging due to the X-crossing pattern (inherent to full 4×4 mesh, not an implementation defect).
VQ-04: Color Accessibility (2/2) — Okabe-Ito source colors are CVD-safe. Elements distinguishable.
VQ-05: Layout & Canvas (3/4) — ~80% canvas utilization. Slight dead-space gap between subtitle and diagram start due to top_margin=100.
VQ-06: Axis Labels & Title (2/2) — Correct title format. Node names serve as axis labels. No traditional axes needed.
VQ-07: Palette Compliance (1/2) — Source flow colors correctly follow Okabe-Ito (Coal=#009E73, Gas=#D55E00, Nuclear=#0072B2, Renewable=#CC79A7). Target node colors are custom hexes (#7EC8C8, #A8D8A8, #E8C07A, #C8A8E8) not in the Okabe-Ito palette. Both backgrounds and chrome are theme-correct. Partial compliance.
Design Excellence (11/20)
DE-01: Aesthetic Sophistication (5/8) — Above generic default — manually building a Sankey with bezier curves in a library with no native Sankey support is sophisticated. Color choices for sources are intentional. Target node custom colors break palette coherence. Not publication-ready.
DE-02: Visual Refinement (4/6) — No grid, no spines, smooth bezier curves, appropriate opacity blending, INK_SOFT node borders. Good refinement above defaults; the top gap and non-Okabe-Ito target colors reduce overall polish.
DE-03: Data Storytelling (2/6) — Data displayed correctly but no visual hierarchy or emphasis. The dominant flow (Coal→Industrial, value=45 — the largest individual flow) receives no emphasis. Node sort order creates maximum crossing without guiding the viewer to any insight.
Spec Compliance (15/15)
SC-01: Plot Type (5/5) — Correct Sankey diagram with proportional flow band widths and smooth curves.
SC-02: Required Features (4/4) — Source nodes, target nodes, proportional values, distinct source colors, link opacity for crossing flows — all present.
SC-03: Data Mapping (3/3) — All 12 flows correctly mapped; band widths proportional to values; all nodes visible.
DQ-03: Appropriate Scale (4/4) — Values 10–45 units. Coal→Industrial (45) being the dominant industrial flow is realistic. Proportions plausible.
Code Quality (10/10)
CQ-01: KISS Structure (3/3) — Linear: imports → data → geometry → chart layers → save. No functions or classes.
CQ-02: Reproducibility (2/2) — Fully deterministic; all data hardcoded.
CQ-03: Clean Imports (2/2) — Only os, altair, pandas — all used.
CQ-04: Code Elegance (2/2) — ~100 lines of bezier geometry is appropriate complexity for a custom Sankey in a library without native Sankey support. No fake UI.
LM-01: Idiomatic Usage (4/5) — alt.layer() composition, detail:N encoding for polygon grouping, mark_line(filled=True) for area fills, mark_rect and mark_text layers — all idiomatic Altair patterns. Bypassing Altair's data model for geometry is necessary but slightly reduces idiomatic score.
LM-02: Distinctive Features (3/5) — detail:N for flow grouping, multi-layer composition, interactive node tooltips, dual PNG+HTML output — several Altair-distinctive features leveraged.
Score Caps Applied
None applied (DE-01=5 > 2, DE-02=4 > 2; all other cap conditions not triggered)
Strengths
Custom Sankey built from scratch in Altair (no native Sankey support): smooth smoothstep/bezier curves, proportional node sizing, polygon path data — technically impressive
Both renders are theme-correct: warm off-white (#FAF8F1) light, near-black (#1A1A17) dark — all chrome adapts correctly with no dark-on-dark failures
All font sizes explicitly set; title, node labels, and legend all clearly readable at 4800×2700px
Perfect spec compliance, data quality, and code quality
Weaknesses
VQ-07 (partial): Target node colors (#7EC8C8, #A8D8A8, #E8C07A, #C8A8E8) are arbitrary custom hexes — replace with Okabe-Ito positions 5–7 (#E69F00, #56B4E9, #F0E442) and the adaptive neutral for the 4th target
DE-03 (low): No visual emphasis or storytelling — Coal→Industrial (value=45) is the largest single flow but is visually indistinct; node order creates maximum crossing without guiding the viewer
VQ-05 (minor): Slight dead-space gap between subtitle and diagram top; reduce top_margin or recalibrate
Issues Found
VQ-07 PARTIAL: Target node colors are non-Okabe-Ito custom hexes
Fix: Replace target_colors with Okabe-Ito positions 5–7 and adaptive neutral: {"Residential": "#E69F00", "Commercial": "#56B4E9", "Industrial": "#F0E442", "Transport": adaptive_neutral} — or use a different visual treatment (e.g., desaturated Okabe-Ito, same hue but lighter) to distinguish target nodes from source nodes while staying on-palette
DE-03 LOW: No visual hierarchy or focal point
Fix: Sort nodes to minimize crossings (reducing the X-pattern helps readability); OR increase opacity/stroke weight on the dominant flows; OR add a subtle text annotation highlighting the largest flow (Coal→Industrial = 45 units, ~14% of total)
VQ-05 MINOR: Slight top gap
Fix: Reduce top_margin from 100 to 60–70 to tighten the subtitle-to-diagram spacing
AI Feedback for Next Attempt
Fix target node colors to use Okabe-Ito positions 5–7 (#E69F00, #56B4E9, #F0E442) and adaptive neutral instead of the custom hex palette. Then add visual storytelling: sort source and target nodes to reduce flow crossings (this alone greatly improves readability), and/or increase the opacity of the two largest flows (Coal→Industrial at 45 and Gas→Residential at 35) to create a visual focal point. Reduce top_margin to tighten the layout. These three changes should bring DE-03 from 2 to 4 and VQ-07 to 2/2.
Light render (plot-light.png): The plot renders on a warm off-white (#FAF8F1) background. The Sankey diagram shows four source nodes on the left — Coal (#009E73, green), Nuclear (#0072B2, blue), Gas (#D55E00, vermillion), and Renewable (#CC79A7, pink-purple) — colored using the Okabe-Ito palette in positions 1–4. Smooth bezier S-curves connect sources to four target nodes on the right: Industrial (yellow), Commercial (sky-blue), Residential (orange-gold), and Transport (partially visible). The title "sankey-basic · altair · anyplot.ai" and subtitle "Energy Flow from Sources to Sectors" are clearly readable. Node labels for Coal, Nuclear, Gas, Renewable (left side) and Industrial, Commercial, Residential (right side) are all legible in dark ink. Critical issue: The "Transport" target label and node are clipped at the bottom edge of the canvas — only the letter "T" is visible. A legend in the bottom-right corner labels Energy Source categories with colored line symbols. All text is readable against the light background.
Dark render (plot-dark.png): The same diagram renders on a near-black (#1A1A17) background. Title and subtitle flip to light-colored text, clearly readable against the dark surface. All source/target node labels are rendered in the INK token (#F0EFE8) and are legible. The data colors (flow bands and node rectangles) are identical to the light render — only the background, text, and legend chrome flip. No dark-on-dark failures observed for the visible node labels. The legend box uses the elevated dark fill (#242420) with a subtle border. The same Transport label clipping issue persists — only "T" is visible at the bottom-right corner. Both renders pass the dark-on-dark check for all visible text.
Score: 82/100
Category
Score
Max
Visual Quality
24
30
Design Excellence
12
20
Spec Compliance
15
15
Data Quality
14
15
Code Quality
10
10
Library Mastery
7
10
Total
82
100
Visual Quality (24/30)
VQ-01: Text Legibility (7/8) — Font sizes excellent (title 28, labels 20, legend 16). Transport label clipped reduces to partial mark.
VQ-02: No Overlap (5/6) — Labels well-spaced; Transport truncation counts as partial failure.
VQ-03: Element Visibility (5/6) — All flows clearly visible at opacity=0.55; Transport node very small (value=10) but present.
VQ-04: Color Accessibility (2/2) — Okabe-Ito for sources; labels provide text identification; no red-green sole signal.
VQ-05: Layout & Canvas (2/4) — Transport node partially clipped at bottom canvas edge; label shows only "T".
VQ-06: Axis Labels & Title (2/2) — Correct title format; descriptive subtitle; axes hidden appropriately.
VQ-07: Palette Compliance (1/2) — Source colors use Okabe-Ito positions 1–4 correctly. Target node colors (#7EC8C8, #A8D8A8, #E8C07A, #C8A8E8) are custom hex values not from the Okabe-Ito palette.
LM-02: Distinctive Features (3/5) — Interactive HTML export, node tooltips, layer composition of primitive marks to build a chart type Altair doesn't natively support.
Score Caps Applied
None
Strengths
Correct Okabe-Ito palette (positions 1–4) for source node and flow colors
Smooth smoothstep bezier S-curves create a professional Sankey appearance
Theme-adaptive chrome (background, text, legend) works correctly in both light and dark renders — no dark-on-dark failures
Complete spec compliance including correct title format and interactive HTML export
Clean, deterministic, readable code with no functions or classes
Tooltips on nodes provide interactive value information
Weaknesses
Transport label clipped: The "Transport" target node sits too close to the bottom canvas edge; the label is cut to just "T". Either reduce node heights by ~5%, increase bottom_margin to ~100, or reorder targets so Transport isn't last.
Target node colors are custom hex values not from Okabe-Ito (#7EC8C8, #A8D8A8, #E8C07A, #C8A8E8). Use Okabe-Ito positions 5–7 and the adaptive neutral for the four target nodes, or at minimum use a neutral secondary palette rather than arbitrary pastels.
Legend line symbols are rendered as colored dashes (—) because mark_line(filled=True) is used; consider using a custom legend or adding a mark_rect layer for legend purposes so users see filled areas.
Issues Found
VQ-05 LOW / Layout clipping: Transport node and label cut off at bottom canvas edge — only "T" visible.
Fix: Increase bottom_margin from 60 to 100, or reduce the 0.85 height scale factor to 0.80 to give more room, or reorder target nodes so Transport (smallest at 10 units) appears at a less extreme position.
VQ-07 / Palette violation: Target nodes use custom hex values outside the Okabe-Ito palette.
Fix: Replace target_colors with Okabe-Ito positions 5–7 (#E69F00, #56B4E9, #F0E442) plus the adaptive neutral, or use a consistent muted approach with the standard palette.
AI Feedback for Next Attempt
Fix the Transport label clipping first — increase bottom_margin to ~100 or reduce the height scaling factor (0.85→0.80). Replace target node colors with Okabe-Ito positions 5–7 (#E69F00, #56B4E9, #F0E442) plus adaptive neutral (#1A1A1A light / #E8E8E0 dark) to comply with the palette rules. Everything else (source colors, bezier curves, theme-adaptive chrome, title format, HTML export) is solid and should be preserved.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Implementation:
sankey-basic- python/altairImplements the python/altair version of
sankey-basic.File:
plots/sankey-basic/implementations/python/altair.pyParent Issue: #810
🤖 impl-generate workflow