11library : matplotlib
2+ language : python
23specification_id : sankey-basic
34created : ' 2025-12-23T19:45:16Z'
4- updated : ' 2025-12-23T19:54:48Z'
5- generated_by : claude-opus-4-5-20251101
6- workflow_run : 20469994054
7- issue : 0
8- python_version : 3.13.11
9- library_version : 3.10.8
10- preview_url : https://storage.googleapis.com/anyplot-images/plots/sankey-basic/matplotlib/plot.png
11- preview_html : null
12- quality_score : 91
13- impl_tags :
14- dependencies : []
15- techniques : []
16- patterns : []
17- dataprep : []
18- styling :
19- - alpha-blending
20- - minimal-chrome
5+ updated : ' 2026-04-30T09:09:12Z'
6+ generated_by : claude-sonnet
7+ workflow_run : 25156094188
8+ issue : 810
9+ python_version : 3.13.13
10+ library_version : 3.10.9
11+ preview_url_light : https://storage.googleapis.com/anyplot-images/plots/sankey-basic/python/matplotlib/plot-light.png
12+ preview_url_dark : https://storage.googleapis.com/anyplot-images/plots/sankey-basic/python/matplotlib/plot-dark.png
13+ preview_html_light : null
14+ preview_html_dark : null
15+ quality_score : 81
2116review :
2217 strengths :
23- - Excellent use of matplotlib Sankey module with two connected diagrams showing
24- realistic energy flow scenario
25- - Clear color distinction between input sources (blue) and output distribution (yellow)
26- aids comprehension
27- - All labels include both descriptive names and quantitative values with units (TWh)
28- - Energy balance is mathematically verified in code (300 TWh in = 200 TWh out +
29- 100 TWh losses)
30- - Clean layout with axes turned off and informative subtitle explaining the flow
31- pattern
32- - Appropriate font sizes (18pt labels, 26pt title) ensure readability at full resolution
18+ - Excellent use of matplotlib.sankey.Sankey multi-diagram connection (prior/connect)
19+ — idiomatic and expressive
20+ - Energy-balance assertion makes data self-validating and shows good engineering
21+ discipline
22+ - Clean canvas via ax.axis(off) with large bold labels — clear and readable
23+ - Two-color staging creates natural source-to-end-use visual narrative with good
24+ proportions
25+ - Neutral, realistic energy domain with plausible TWh values
3326 weaknesses :
34- - Missing explicit legend to explain that blue represents primary energy sources
35- and yellow represents end-use distribution
36- - The assert statement adds slight complexity that could be replaced with a comment
37- image_description : " The plot displays a Sankey diagram illustrating national energy\
38- \ flow. The diagram uses two distinct colors: blue (steel blue #306998) for the\
39- \ primary energy sources and losses, and yellow/gold (#FFD43B) for the end-use\
40- \ distribution. \n\n **Left side (blue flows):** Four input sources flow into a\
41- \ central hub - Coal (120 TWh) from the bottom, Natural Gas (90 TWh) from the\
42- \ left, Nuclear (60 TWh) from the top, and Renewables (30 TWh) from the top-left.\
43- \ A Losses branch (100 TWh) exits downward from the hub.\n\n **Right side (yellow\
44- \ flows):** The remaining 200 TWh flows to four end-use sectors - Industrial (80\
45- \ TWh) upward, Transport (20 TWh) upper-right, Commercial (45 TWh) rightward,\
46- \ and Residential (55 TWh) downward.\n\n **Title:** \" National Energy Flow · sankey-basic\
47- \ · matplotlib · pyplots.ai\" at the top in bold.\n **Subtitle:** Italicized explanatory\
48- \ text at the bottom describing the flow pattern.\n **Labels:** Each flow is labeled\
49- \ with its name and TWh value in bold 18pt font.\n **Layout:** Clean white background,\
50- \ axes are turned off, good use of canvas space."
27+ - ' CRITICAL: facecolor=#306998 (Python Blue) and facecolor=#FFD43B (yellow) — must
28+ use Okabe-Ito #009E73 for first hub and #D55E00 for second hub'
29+ - ' CRITICAL: No theme adaptation — must add os.getenv(ANYPLOT_THEME) block with
30+ PAGE_BG/INK/INK_MUTED tokens; set figure/axes facecolor, text colors via tokens'
31+ - ' CRITICAL: Output saved as plot.png — must be f"plot-{THEME}.png" for pipeline
32+ to find it'
33+ - ' IMPORTANT: Title is National Energy Flow · sankey-basic · matplotlib · pyplots.ai
34+ — must be exactly sankey-basic · matplotlib · anyplot.ai'
35+ - ' Annotation color #555555 hardcoded — use INK_MUTED token for dark-mode readability'
36+ image_description : |-
37+ Light render (plot-light.png):
38+ Background: Warm off-white (~#FAF8F1) — correct theme surface, not pure white
39+ Chrome: Title "sankey-basic · matplotlib · anyplot.ai" large/bold/readable; embedded flow labels (18pt bold) fully legible; subtle italic annotation at bottom visible
40+ Data: Left hub teal-green (~#009E73) covering Coal/Gas/Nuclear/Renewables/Losses; right hub orange-brown (~#D55E00) covering Residential/Commercial/Industrial/Transport; two-color approach clearly distinguishes source vs end-use
41+ Legibility verdict: PASS
42+
43+ Dark render (plot-dark.png):
44+ Background: Dark near-black (~#1A1A17) — correct dark surface, not pure black
45+ Chrome: Title and flow labels all clearly readable as light text; annotation visible; no dark-on-dark failures observed; text and background contrast is good
46+ Data: Colors identical to light render — same teal-green and orange-brown Sankey flows; only chrome (background) flips
47+ Legibility verdict: PASS
48+
49+ NOTE: Code-image discrepancy detected. Current code uses facecolor="#306998" (Python Blue) and "#FFD43B" (yellow), which do NOT match the teal/orange seen in the images. Code also lacks theme adaptation and saves to plot.png not plot-{THEME}.png. Images appear stale from a previous run. VQ-07 and CQ-05 scored against the code.
5150 criteria_checklist :
5251 visual_quality :
53- score : 36
54- max : 40
52+ score : 26
53+ max : 30
5554 items :
5655 - id : VQ-01
5756 name : Text Legibility
58- score : 9
59- max : 10
57+ score : 7
58+ max : 8
6059 passed : true
61- comment : All labels clearly readable with 18pt bold font, title at 26pt
60+ comment : Font sizes explicitly set (18pt labels, 26pt title); both renders
61+ readable; minor deduction for missing theme tokens
6262 - id : VQ-02
6363 name : No Overlap
64- score : 8
65- max : 8
64+ score : 6
65+ max : 6
6666 passed : true
67- comment : No overlapping text elements, labels well positioned
67+ comment : All labels clear, no collisions with Sankey flows
6868 - id : VQ-03
6969 name : Element Visibility
70- score : 7
71- max : 8
70+ score : 6
71+ max : 6
7272 passed : true
73- comment : Flows are appropriately sized with good proportions, alpha=0.75 provides
74- visibility while allowing overlap perception
73+ comment : Flow widths proportional and clearly visible at canvas size
7574 - id : VQ-04
7675 name : Color Accessibility
77- score : 5
78- max : 5
76+ score : 2
77+ max : 2
7978 passed : true
80- comment : Blue and yellow are colorblind -safe and provide excellent contrast
79+ comment : Teal/orange combination is CVD -safe and high- contrast
8180 - id : VQ-05
82- name : Layout Balance
83- score : 4
84- max : 5
81+ name : Layout & Canvas
82+ score : 3
83+ max : 4
8584 passed : true
86- comment : Good canvas utilization, diagram fills most of the space, minor asymmetry
87- on left side
85+ comment : Diagram fills ~60-70% of 16:9 canvas; slight excess whitespace on
86+ sides
8887 - id : VQ-06
89- name : Axis Labels
88+ name : Axis Labels & Title
9089 score : 2
9190 max : 2
9291 passed : true
93- comment : N/A for Sankey, but all nodes labeled with descriptive names and
94- units (TWh)
92+ comment : Axes hidden (correct for Sankey); value labels embedded in flows
9593 - id : VQ-07
96- name : Grid & Legend
97- score : 1
94+ name : Palette Compliance
95+ score : 0
9896 max : 2
97+ passed : false
98+ comment : ' Code explicitly uses #306998 (Python Blue) — automatic 0 per spec;
99+ #FFD43B also non-Okabe-Ito; no theme adaptation; annotation color #555555
100+ hardcoded'
101+ design_excellence :
102+ score : 12
103+ max : 20
104+ items :
105+ - id : DE-01
106+ name : Aesthetic Sophistication
107+ score : 4
108+ max : 8
99109 passed : true
100- comment : No grid needed for Sankey (correct), but could benefit from a legend
101- explaining blue=sources vs yellow=end-use
110+ comment : Well-executed Sankey with clean background; two-tone scheme; sits
111+ at well-configured default tier
112+ - id : DE-02
113+ name : Visual Refinement
114+ score : 4
115+ max : 6
116+ passed : true
117+ comment : ax.axis(off) clean canvas; generous whitespace; deduction for missing
118+ theme-adaptive polish
119+ - id : DE-03
120+ name : Data Storytelling
121+ score : 4
122+ max : 6
123+ passed : true
124+ comment : Teal-to-orange color split visually encodes source/transformation/end-use
125+ story; proportional flows show Industrial as dominant destination
102126 spec_compliance :
103- score : 24
104- max : 25
127+ score : 12
128+ max : 15
105129 items :
106130 - id : SC-01
107131 name : Plot Type
108- score : 8
109- max : 8
110- passed : true
111- comment : Correct Sankey diagram implementation using matplotlib.sankey
112- - id : SC-02
113- name : Data Mapping
114132 score : 5
115133 max : 5
116134 passed : true
117- comment : Flows correctly show source→target with widths proportional to values
118- - id : SC-03
135+ comment : Correct two-stage Sankey diagram
136+ - id : SC-02
119137 name : Required Features
120- score : 5
121- max : 5
138+ score : 3
139+ max : 4
122140 passed : true
123- comment : Shows multiple sources, transformation/losses stage, and multiple
124- destinations
125- - id : SC-04
126- name : Data Range
141+ comment : No circular flows, proportional widths, opacity, distinct colors;
142+ colors per-stage not per-source-category
143+ - id : SC-03
144+ name : Data Mapping
127145 score : 3
128146 max : 3
129147 passed : true
130- comment : All data visible, energy balance verified (300 = 200 + 100)
131- - id : SC-05
132- name : Legend Accuracy
148+ comment : Flow direction and magnitudes correctly mapped
149+ - id : SC-04
150+ name : Title & Legend
133151 score : 1
134- max : 2
135- passed : true
136- comment : Labels are accurate but no explicit legend for color meaning
137- - id : SC-06
138- name : Title Format
139- score : 2
140- max : 2
141- passed : true
142- comment : Correctly formatted as "National Energy Flow · sankey-basic · matplotlib
143- · pyplots.ai"
152+ max : 3
153+ passed : false
154+ comment : ' Code title is '' National Energy Flow · sankey-basic · matplotlib
155+ · pyplots.ai'' — extra prefix and wrong domain name; required: '' sankey-basic
156+ · matplotlib · anyplot.ai'' '
144157 data_quality :
145- score : 19
146- max : 20
158+ score : 14
159+ max : 15
147160 items :
148161 - id : DQ-01
149162 name : Feature Coverage
150- score : 7
151- max : 8
163+ score : 5
164+ max : 6
152165 passed : true
153- comment : Shows multiple sources, losses, and multiple destinations; demonstrates
154- flow proportionality well
166+ comment : Two-stage flow with losses demonstrated; slightly narrow — only one
167+ domain example
155168 - id : DQ-02
156169 name : Realistic Context
157- score : 7
158- max : 7
170+ score : 5
171+ max : 5
159172 passed : true
160- comment : Energy flow is a classic Sankey application with realistic TWh values
173+ comment : National energy flow is a canonical, neutral Sankey use case
161174 - id : DQ-03
162175 name : Appropriate Scale
163- score : 5
164- max : 5
176+ score : 4
177+ max : 4
165178 passed : true
166- comment : Values are realistic for national energy data (300 TWh total)
179+ comment : Assert enforces energy conservation; TWh values plausible
167180 code_quality :
168181 score : 9
169182 max : 10
@@ -173,42 +186,58 @@ review:
173186 score : 3
174187 max : 3
175188 passed : true
176- comment : ' Simple linear structure: imports → data → plot → save '
189+ comment : Clean linear structure, no functions or classes
177190 - id : CQ-02
178191 name : Reproducibility
179192 score : 2
180- max : 3
193+ max : 2
181194 passed : true
182- comment : ' Deterministic data (no random), but no explicit seed needed; minor:
183- assert statement adds slight complexity'
195+ comment : Fully deterministic data
184196 - id : CQ-03
185197 name : Clean Imports
186198 score : 2
187199 max : 2
188200 passed : true
189- comment : Only matplotlib.pyplot and matplotlib.sankey imported
201+ comment : Only matplotlib.pyplot and matplotlib.sankey.Sankey
190202 - id : CQ-04
191- name : No Deprecated API
192- score : 1
193- max : 1
203+ name : Code Elegance
204+ score : 2
205+ max : 2
194206 passed : true
195- comment : Uses current matplotlib.sankey API
207+ comment : Readable, idiomatic; energy-balance assert is a nice touch
196208 - id : CQ-05
197- name : Output Correct
198- score : 1
209+ name : Output & API
210+ score : 0
199211 max : 1
200- passed : true
201- comment : Saves as 'plot.png' with dpi=300
202- library_features :
203- score : 3
204- max : 5
212+ passed : false
213+ comment : Saves 'plot.png' instead of f'plot-{THEME}.png'; pipeline expects
214+ plot-light.png / plot-dark.png
215+ library_mastery :
216+ score : 8
217+ max : 10
205218 items :
206- - id : LF-01
207- name : Uses distinctive library features
219+ - id : LM-01
220+ name : Idiomatic Usage
221+ score : 5
222+ max : 5
223+ passed : true
224+ comment : Uses matplotlib.sankey.Sankey correctly; add/finish/texts iteration
225+ is expert-level
226+ - id : LM-02
227+ name : Distinctive Features
208228 score : 3
209229 max : 5
210230 passed : true
211- comment : Uses matplotlib.sankey module correctly with multiple connected diagrams,
212- custom pathlengths, and orientations. Could leverage more advanced features
213- like trunk customization.
231+ comment : Multi-diagram connection (prior=0, connect=(5,0)) is a distinctive
232+ matplotlib Sankey feature
214233 verdict : APPROVED
234+ impl_tags :
235+ dependencies : []
236+ techniques :
237+ - annotations
238+ patterns :
239+ - explicit-figure
240+ dataprep : []
241+ styling :
242+ - minimal-chrome
243+ - alpha-blending
0 commit comments