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): The plot displays a two-stage Sankey diagram on a warm off-white background (~#FAF8F1). The left sub-diagram shows four primary energy sources (Renewables 30 TWh, Nuclear 60 TWh, Natural Gas 90 TWh, Coal 120 TWh) flowing into a central hub, with Losses (100 TWh) exiting downward. The right sub-diagram shows net delivered energy (200 TWh) distributing to end-use sectors (Industrial 80 TWh, Transport 20 TWh, Commercial 45 TWh, Residential 55 TWh). The left Sankey is rendered in teal-green and the right in orange-brown. All node labels are bold, clearly readable dark text against the light background. A legend in the lower right identifies "Primary Sources & Losses" and "End-Use Sectors". An italic subtitle at the bottom provides explanatory context. Title reads "National Energy Flow · sankey-basic · matplotlib · anyplot.ai". All text is readable against the light background. Legibility: PASS.
Dark render (plot-dark.png): The same Sankey diagram is displayed on a near-black background (~#1A1A17). Data colors are identical to the light render — the same teal-green and orange-brown for the two flow stages (chrome-only flip). Node labels, title, subtitle, and legend text are rendered in light colors against the dark background. The legend box has an appropriate dark-elevated fill. No dark-on-dark failures observed — all text is clearly readable. The brand green (#009E73-range) remains visible on the dark surface. Legibility: PASS.
Critical Note: There is a significant discrepancy between the rendered images and the current implementation code. The code uses facecolor="#306998" (Python Blue) and facecolor="#FFD43B" (Python Yellow), has no ANYPLOT_THEME handling, saves as plot.png (not plot-{THEME}.png), and the title contains pyplots.ai instead of anyplot.ai. The images appear to have been generated from a different (earlier) version of the code. The current code file would produce incorrect output if run now.
Score: 79/100
Category
Score
Max
Visual Quality
23
30
Design Excellence
12
20
Spec Compliance
14
15
Data Quality
14
15
Code Quality
9
10
Library Mastery
7
10
Total
79
100
Visual Quality (23/30)
VQ-01: Text Legibility (6/8) — Font sizes explicitly set (18pt bold for node labels, 26pt for title, 16pt for subtitle); all text readable in both renders; subtitle uses hardcoded color="#555555" in code which won't adapt to dark theme
VQ-02: No Overlap (5/6) — Very minimal crowding around closely-placed source labels (Renewables/Nuclear); all content readable
VQ-03: Element Visibility (5/6) — All flow arrows clearly visible and proportional to TWh values; transport (20 TWh, smallest) still distinct
VQ-04: Color Accessibility (2/2) — Two distinct colors (green + orange), both colorblind-safe; good luminance contrast
VQ-06: Axis Labels & Title (2/2) — Descriptive title; node labels include TWh values as units; no traditional axes needed for Sankey
VQ-07: Palette Compliance (0/2) — FAIL: Code uses facecolor="#306998" (Python Blue — explicitly excluded per criteria) and facecolor="#FFD43B" (Python Yellow). No ANYPLOT_THEME handling in code; no theme-adaptive backgrounds or text colors. The rendered images appear from a different code version.
Design Excellence (12/20)
DE-01: Aesthetic Sophistication (4/8) — Two-color phase scheme creates clear visual distinction between sources and end-uses; clean professional look; alpha=0.75 adds depth; above defaults but not publication-exceptional
DE-02: Visual Refinement (4/6) — ax.axis("off") is appropriate for Sankey; alpha blending with edge highlighting; subtitle caption adds polish; generally clean composition
DE-03: Data Storytelling (4/6) — The two-stage flow clearly narrates the energy transformation story; TWh values on each node quantify the story; subtitle explicitly explains the flow direction; visual hierarchy from large (Coal 120) to small (Renewables 30) is effective
Spec Compliance (14/15)
SC-01: Plot Type (5/5) — Correct Sankey diagram with proportional flow widths and multi-stage connections
SC-02: Required Features (4/4) — Distinct colors per stage, link widths proportional to values, node labels visible, no circular flows, multi-stage flow
SC-03: Data Mapping (3/3) — Energy balance verified with assert; all 9 flows correctly mapped; correct source-to-target directionality
SC-04: Title & Legend (2/3) — Images show "National Energy Flow · sankey-basic · matplotlib · anyplot.ai" — extra prefix before spec-id, not exact format {spec-id} · {library} · anyplot.ai; code has pyplots.ai (wrong brand)
DQ-02: Realistic Context (5/5) — National energy flow is the canonical Sankey use case; coal/gas/nuclear/renewables → generation losses → residential/commercial/industrial/transport is an excellent real-world scenario
DQ-03: Appropriate Scale (4/4) — 300 TWh total with ~33% losses, realistic energy mix proportions, balanced end-use sectors; energy conservation verified with assert
Code Quality (9/10)
CQ-01: KISS Structure (3/3) — Clean linear structure: imports → data constants → plot → save; no functions or classes
CQ-02: Reproducibility (2/2) — All values are hardcoded constants; fully deterministic
CQ-03: Clean Imports (2/2) — Only matplotlib.pyplot and matplotlib.sankey.Sankey, both used
CQ-04: Code Elegance (2/2) — Clean Pythonic code; assert for energy balance is a nice correctness guard; appropriate complexity
CQ-05: Output & API (0/1) — FAIL: Saves as plt.savefig("plot.png", ...) — must be plt.savefig(f"plot-{THEME}.png", ...) with ANYPLOT_THEME variable
Library Mastery (7/10)
LM-01: Idiomatic Usage (4/5) — Good use of matplotlib.sankey.Sankey class; correct ax= parameter; proper use of flows, labels, orientations, pathlengths; sankey.finish() pattern
LM-02: Distinctive Features (3/5) — Connected two-stage Sankey using prior=0, connect=(5, 0) is distinctive to matplotlib's Sankey API; post-processing diagram texts via diagrams[i].texts shows library-specific knowledge
Score Caps Applied
None
Strengths
Excellent realistic data scenario (national energy flow — the canonical Sankey use case)
Good two-stage connected Sankey using matplotlib's native prior/connect API
Energy balance verified with assert — good correctness practice
Both renders show visually appealing, clean layout with proper axis removal
Clear visual hierarchy between source and distribution stages via two-color scheme
TWh values on node labels add quantitative context without clutter
Weaknesses
Critical: Code uses #306998 (Python Blue) and #FFD43B (Python Yellow) instead of Okabe-Ito palette (#009E73 and #D55E00) — VQ-07 hard fail
Critical: No ANYPLOT_THEME environment variable handling — no theme-adaptive backgrounds, text colors, or chrome; saves as plot.png not plot-{THEME}.png
Critical: Code has pyplots.ai in the title instead of anyplot.ai
Title has extra "National Energy Flow ·" prefix — format must be {spec-id} · {library} · anyplot.ai exactly (or descriptive title BEFORE the spec-id block)
Subtitle uses hardcoded color="#555555" which will not adapt to dark theme (should use INK_MUTED token)
No legend creation code despite legend appearing in rendered images (images appear to be from a different code version)
Issues Found
VQ-07 / CQ-05 CRITICAL: No ANYPLOT_THEME handling. Add: THEME = os.getenv("ANYPLOT_THEME", "light") with PAGE_BG, ELEVATED_BG, INK, INK_SOFT, INK_MUTED tokens; set fig, ax = plt.subplots(figsize=(16, 9), facecolor=PAGE_BG); set ax.set_facecolor(PAGE_BG); save as plt.savefig(f"plot-{THEME}.png", dpi=300, bbox_inches="tight", facecolor=PAGE_BG)
VQ-07 CRITICAL: Replace facecolor="#306998" with facecolor="#009E73" (Okabe-Ito brand green) and facecolor="#FFD43B" with facecolor="#D55E00" (Okabe-Ito vermillion)
SC-04: Fix title to "sankey-basic · matplotlib · anyplot.ai" (or prefix with descriptive text before the separator block)
VQ-01: Apply INK token to title: ax.set_title(..., color=INK); apply INK_SOFT to Sankey diagram texts after finishing; apply INK_MUTED token to subtitle annotation instead of hardcoded #555555
DE-01: Add a legend with ax.legend() and apply theme-adaptive chrome (elevated background, INK_SOFT text)
AI Feedback for Next Attempt
Replace hardcoded Python Blue/Yellow with Okabe-Ito colors (#009E73 for primary Sankey, #D55E00 for secondary). Add full ANYPLOT_THEME handling: read env var, set PAGE_BG/ELEVATED_BG/INK/INK_SOFT/INK_MUTED tokens, apply them to fig/ax facecolor, title color, Sankey text colors (iterate diagram.texts and set color=INK_SOFT), subtitle annotation color=INK_MUTED. Save as plot-{THEME}.png. Fix title to 'sankey-basic · matplotlib · anyplot.ai'. Add explicit ax.legend() with theme-adaptive frame.
Light render (plot-light.png): Warm off-white background (~#FAF8F1). Two-stage Sankey diagram: left hub rendered in teal-green (appears ~#009E73) covering Coal 120 TWh, Natural Gas 90 TWh, Nuclear 60 TWh, Renewables 30 TWh, and Losses 100 TWh; right hub rendered in orange-brown (appears ~#D55E00) covering Residential 55 TWh, Commercial 45 TWh, Industrial 80 TWh, Transport 20 TWh. Title "sankey-basic · matplotlib · anyplot.ai" is large, bold, and clearly readable. All embedded flow labels (18pt bold) are fully legible against the light background. A subtle italic annotation runs along the bottom. No dark-on-light issues. Legibility verdict: PASS
Dark render (plot-dark.png): Dark near-black background (~#1A1A17). Data colors are identical to the light render — same teal-green and orange-brown Sankey flows. Title and all flow labels remain clearly readable as light text on the dark surface. The bottom annotation is also visible. Chrome (background, text) correctly flips. No dark-on-dark failures observed. Legibility verdict: PASS
⚠️ Code–image discrepancy detected: The images above appear to be stale from a previous run. The current code uses facecolor="#306998" (Python Blue) and facecolor="#FFD43B" (golden yellow) — colors that are inconsistent with the teal/orange seen in the images. The code also lacks theme adaptation (os.getenv("ANYPLOT_THEME") is absent) and saves to plot.png rather than plot-{THEME}.png. If the code were run today, it would produce incorrect output. VQ-07 and CQ-05 are scored against the code, not the stale images.
Score: 81/100
Category
Score
Max
Visual Quality
26
30
Design Excellence
12
20
Spec Compliance
12
15
Data Quality
14
15
Code Quality
9
10
Library Mastery
8
10
Total
81
100
Visual Quality (26/30)
VQ-01: Text Legibility (7/8) — font sizes explicitly set (18pt labels, 26pt title); both renders fully readable; minor deduction for missing theme tokens that would govern dark-mode text safety
VQ-02: No Overlap (6/6) — all labels clear, no collisions with Sankey flows
VQ-03: Element Visibility (6/6) — flow widths proportional and clearly visible at canvas size
VQ-04: Color Accessibility (2/2) — teal/orange combination is CVD-safe and high-contrast
VQ-05: Layout & Canvas (3/4) — diagram fills ~60–70% of 16:9 canvas; slight excess whitespace on sides
VQ-06: Axis Labels & Title (2/2) — axes hidden (correct for Sankey); value labels embedded in flows; title present
VQ-07: Palette Compliance (0/2) — code explicitly uses #306998 (Python Blue), which is an automatic 0 per spec; #FFD43B (yellow) is also non-Okabe-Ito; no os.getenv("ANYPLOT_THEME") → no theme-adaptive backgrounds or chrome; annotation color hardcoded #555555
Design Excellence (12/20)
DE-01: Aesthetic Sophistication (4/8) — well-executed Sankey with clean background and good proportions; two-tone scheme creates visual segmentation; not exceptional, sits at "well-configured default" tier
DE-02: Visual Refinement (4/6) — ax.axis("off") produces clean canvas; generous whitespace; no unnecessary grid or spines; deduction for missing theme-adaptive polish
DE-03: Data Storytelling (4/6) — teal→orange color split visually encodes the source/transformation/end-use story; proportional flow widths make Industrial (80 TWh) the dominant destination; annotation reinforces narrative
Spec Compliance (12/15)
SC-01: Plot Type (5/5) — correct two-stage Sankey diagram
SC-02: Required Features (3/4) — no circular flows ✓; proportional link widths ✓; distinct colors ✓; link opacity (alpha=0.75) ✓; colors are per-stage rather than per-source-category (minor miss)
SC-03: Data Mapping (3/3) — flow direction and magnitudes correctly mapped
SC-04: Title & Legend (1/3) — code title is "National Energy Flow · sankey-basic · matplotlib · pyplots.ai": extra prefix, uses pyplots.ai instead of anyplot.ai; required format is sankey-basic · matplotlib · anyplot.ai
Data Quality (14/15)
DQ-01: Feature Coverage (5/6) — two-stage flow with losses demonstrated; slightly narrow (only one domain example)
DQ-02: Realistic Context (5/5) — national energy flow is a canonical, neutral Sankey use case
CQ-01: KISS Structure (3/3) — clean linear structure, no functions or classes
CQ-02: Reproducibility (2/2) — fully deterministic data
CQ-03: Clean Imports (2/2) — only matplotlib.pyplot and matplotlib.sankey.Sankey
CQ-04: Code Elegance (2/2) — readable, idiomatic; energy-balance assert is a nice touch
CQ-05: Output & API (0/1) — saves "plot.png" instead of f"plot-{THEME}.png"; pipeline expects plot-light.png / plot-dark.png
Library Mastery (8/10)
LM-01: Idiomatic Usage (5/5) — uses matplotlib.sankey.Sankey, the correct idiomatic module; add() / finish() / diagram.texts iteration is expert-level usage
LM-02: Distinctive Features (3/5) — multi-diagram connection (prior=0, connect=(5,0)) is a distinctive matplotlib Sankey feature; text styling via diagram object is library-specific
Score Caps Applied
None — VQ-07=0 does not trigger a score cap; DE-01=4 and DE-02=4 are both above the ≤2 threshold for the 75-cap
Strengths
Excellent use of matplotlib.sankey.Sankey multi-diagram connection; idiomatic and expressive
Energy-balance assertion makes the data self-validating
Clean canvas via ax.axis("off") with large, readable bold labels
Two-color staging creates a natural source→end-use visual narrative
Neutral, realistic domain with plausible TWh proportions
Weaknesses
CRITICAL: facecolor="#306998" (Python Blue) and facecolor="#FFD43B" (yellow) — must use Okabe-Ito: #009E73 for the first hub, #D55E00 for the second
CRITICAL: No theme adaptation — must add THEME = os.getenv("ANYPLOT_THEME","light"), PAGE_BG, INK, INK_MUTED tokens; set fig.set_facecolor(PAGE_BG), text color=INK, annotation color=INK_MUTED
CRITICAL: Output saved as "plot.png" — must be f"plot-{THEME}.png"
IMPORTANT: Title "National Energy Flow · sankey-basic · matplotlib · pyplots.ai" — must be exactly "sankey-basic · matplotlib · anyplot.ai"
Annotation color="#555555" is hardcoded; use INK_MUTED token for dark-mode readability
Issues Found
VQ-07 ZERO: facecolor="#306998" is the Python Blue listed as an explicit 0-case in the palette spec
Fix: facecolor="#009E73" for first hub, facecolor="#D55E00" for second hub
VQ-07 ZERO: No theme adaptation — code cannot produce correct light and dark renders
Fix: Add THEME = os.getenv("ANYPLOT_THEME", "light") block with PAGE_BG/INK tokens; pass facecolor=PAGE_BG to fig/ax; set text colors via token; save as f"plot-{THEME}.png"
Fix all four critical issues in one pass: (1) change facecolor="#306998" → #009E73 and facecolor="#FFD43B" → #D55E00; (2) add full theme-adaptive block (THEME = os.getenv("ANYPLOT_THEME", "light"), PAGE_BG/INK/INK_MUTED tokens, set fig/ax facecolor, text colors via tokens); (3) set title to exactly "sankey-basic · matplotlib · anyplot.ai"; (4) save as f"plot-{THEME}.png". The Sankey structure, data, and layout are solid — only palette and theme wiring need fixing.
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/matplotlibImplements the python/matplotlib version of
sankey-basic.File:
plots/sankey-basic/implementations/python/matplotlib.pyParent Issue: #810
🤖 impl-generate workflow