Skip to content

Commit bc3ccf7

Browse files
chore(bokeh): add metadata for ecdf-basic
1 parent 12e6a63 commit bc3ccf7

1 file changed

Lines changed: 11 additions & 256 deletions

File tree

Lines changed: 11 additions & 256 deletions
Original file line numberDiff line numberDiff line change
@@ -1,266 +1,21 @@
1+
# Per-library metadata for bokeh implementation of ecdf-basic
2+
# Auto-generated by impl-generate.yml
3+
14
library: bokeh
25
language: python
36
specification_id: ecdf-basic
47
created: '2025-12-23T13:02:55Z'
5-
updated: '2026-04-24T13:32:51Z'
6-
generated_by: claude-opus
7-
workflow_run: 24890383540
8+
updated: '2026-06-25T09:36:19Z'
9+
generated_by: claude-sonnet
10+
workflow_run: 28160456663
811
issue: 976
9-
python_version: 3.14.4
10-
library_version: 3.9.0
12+
language_version: 3.13.14
13+
library_version: 3.9.1
1114
preview_url_light: https://storage.googleapis.com/anyplot-images/plots/ecdf-basic/python/bokeh/plot-light.png
1215
preview_url_dark: https://storage.googleapis.com/anyplot-images/plots/ecdf-basic/python/bokeh/plot-dark.png
1316
preview_html_light: https://storage.googleapis.com/anyplot-images/plots/ecdf-basic/python/bokeh/plot-light.html
1417
preview_html_dark: https://storage.googleapis.com/anyplot-images/plots/ecdf-basic/python/bokeh/plot-dark.html
15-
quality_score: 87
18+
quality_score: null
1619
review:
17-
strengths:
18-
- Correct ECDF implementation using p.step(mode='after') — the step-after mode precisely
19-
matches the 1/n jump at each observation
20-
- 'Full theme adaptation: PAGE_BG, INK, INK_SOFT tokens applied to all chrome elements
21-
in both light and dark renders — no dark-on-dark or light-on-light failures'
22-
- 'Excellent data storytelling: percentile reference lines (25th, 50th, 75th) with
23-
labeled annotations enable direct quantile reading from the chart'
24-
- 'Idiomatic Bokeh usage: ColumnDataSource, add_layout(Span), add_layout(Label),
25-
HoverTool with mode=''vline'' — leverages library-specific APIs correctly'
26-
- 'Perfect spec compliance: step function increases by 1/n, y-axis 0–1, distinct
27-
line style, grid lines for percentile reading, all spec requirements satisfied'
28-
- 'Realistic and neutral domain: marathon finish times (normal ~240 min) is a compelling,
29-
politically neutral real-world scenario'
30-
weaknesses:
31-
- 'DE-01 LOW (4/8): Design is a well-configured library default — brand green ECDF
32-
on themed chrome is correct but not exceptional. Needs more aesthetic sophistication:
33-
consider adding a subtle area fill under the ECDF curve (fill_alpha=0.08), refining
34-
typography weight on the title (bold is set but could add font_face), or other
35-
polish that elevates it above the baseline.'
36-
- 'DE-02 MODERATE (3/6): Visual refinement is present (no outline, y-only grid,
37-
minor ticks removed) but could go further — consider adding min_border padding
38-
for generous whitespace, or adding a subtle horizontal reference line at y=0.5
39-
with distinct styling to emphasize the median visually.'
40-
- 'VQ-02 MINOR (5/6): The 50th and 75th percentile labels (at ~242 and ~260 on x-axis)
41-
are only 18 minutes apart; at full 4800px resolution with 20pt text, these labels
42-
may crowd. Consider staggering label y-positions (e.g., 75th at y=0.08 instead
43-
of 0.03) to avoid overlap risk.'
44-
- 'DE-03 MODERATE (4/6): Storytelling is good but relies only on the three percentile
45-
lines. Adding a light shaded region between Q1 and Q3 (the interquartile range)
46-
would give the chart a stronger visual focal point and immediately communicate
47-
distribution spread.'
48-
- 'LM-02 (3/5): HoverTool and Span/Label are used but could leverage more Bokeh-specific
49-
features — e.g., adding a CDSView or a CrosshairTool for richer interactivity
50-
consistent with Bokeh''s strengths.'
51-
image_description: |-
52-
Light render (plot-light.png):
53-
Background: Warm off-white consistent with #FAF8F1 — correct light surface, no pure white.
54-
Chrome: Title "Marathon Finish Times · ecdf-basic · bokeh · anyplot.ai" in bold dark text, clearly visible top-left. Y-axis label "Cumulative Proportion of Runners" rotated, readable. X-axis label "Finish Time (minutes)" clearly visible at bottom. Tick labels on both axes in medium-dark secondary text — all legible.
55-
Data: Single ECDF step line in brand green (#009E73), line_width=4, clearly distinguishable from the warm background. Three dashed vertical reference lines in INK_SOFT gray mark 25th (~218 min), 50th/median (~242 min), and 75th (~260 min) percentiles. Annotation labels at y=0.03 in italic INK_SOFT: "25th: 218 min", "50th (median): 242 min", "75th: 260 min". Y-axis grid lines subtle at 10% opacity. No box outline.
56-
Legibility verdict: PASS — all text readable, no light-on-light failures. Labels for 50th and 75th percentiles are close in x-position but appear readable in the thumbnail.
57-
58-
Dark render (plot-dark.png):
59-
Background: Near-black consistent with #1A1A17 — correct dark surface, no pure black.
60-
Chrome: Title and axis labels render in light (#F0EFE8) text — clearly visible against dark background. Tick labels in lighter secondary tone (#B8B7B0) — all readable. No dark-on-dark failures detected.
61-
Data: ECDF step line in identical brand green (#009E73) — color matches light render exactly, confirming Okabe-Ito data colors are theme-independent. Dashed reference lines in light gray (INK_SOFT dark = #B8B7B0). Annotation labels also in #B8B7B0 — readable on dark surface. Y-only grid at 10% alpha — subtle, not dominant.
62-
Legibility verdict: PASS — all text readable against dark background. Data green is visible and identical to light theme.
63-
criteria_checklist:
64-
visual_quality:
65-
score: 29
66-
max: 30
67-
items:
68-
- id: VQ-01
69-
name: Text Legibility
70-
score: 8
71-
max: 8
72-
passed: true
73-
comment: 'All sizes explicitly set: title 28pt, axis labels 22pt, tick labels
74-
18pt, annotations 20pt — all readable in both themes'
75-
- id: VQ-02
76-
name: No Overlap
77-
score: 5
78-
max: 6
79-
passed: true
80-
comment: 50th and 75th percentile labels are only ~18 units apart; minor crowding
81-
risk at full resolution
82-
- id: VQ-03
83-
name: Element Visibility
84-
score: 6
85-
max: 6
86-
passed: true
87-
comment: ECDF line at line_width=4 clearly visible; reference spans and labels
88-
all readable
89-
- id: VQ-04
90-
name: Color Accessibility
91-
score: 2
92-
max: 2
93-
passed: true
94-
comment: Single series in brand green on neutral background — excellent contrast,
95-
CVD-safe
96-
- id: VQ-05
97-
name: Layout & Canvas
98-
score: 4
99-
max: 4
100-
passed: true
101-
comment: 4800x2700 canvas well utilized, balanced margins, nothing cut off
102-
- id: VQ-06
103-
name: Axis Labels & Title
104-
score: 2
105-
max: 2
106-
passed: true
107-
comment: '''Finish Time (minutes)'' and ''Cumulative Proportion of Runners''
108-
— descriptive with units'
109-
- id: VQ-07
110-
name: Palette Compliance
111-
score: 2
112-
max: 2
113-
passed: true
114-
comment: 'First series #009E73 correct; background #FAF8F1/#1A1A17 correct;
115-
all chrome theme-adaptive in both renders'
116-
design_excellence:
117-
score: 11
118-
max: 20
119-
items:
120-
- id: DE-01
121-
name: Aesthetic Sophistication
122-
score: 4
123-
max: 8
124-
passed: false
125-
comment: Well-configured library default — brand green and themed chrome correct
126-
but not exceptional; no area fill, gradient, or distinctive design flair
127-
- id: DE-02
128-
name: Visual Refinement
129-
score: 3
130-
max: 6
131-
passed: false
132-
comment: No box outline, y-only grid at 10% alpha, minor ticks removed — above
133-
default, but generous whitespace padding and min_border not set
134-
- id: DE-03
135-
name: Data Storytelling
136-
score: 4
137-
max: 6
138-
passed: false
139-
comment: Percentile reference lines + annotations create good visual storytelling;
140-
missing IQR shading or other focal emphasis for stronger hierarchy
141-
spec_compliance:
142-
score: 15
143-
max: 15
144-
items:
145-
- id: SC-01
146-
name: Plot Type
147-
score: 5
148-
max: 5
149-
passed: true
150-
comment: Correct ECDF using p.step(mode='after') — step-after matches 1/n
151-
jump at each observation
152-
- id: SC-02
153-
name: Required Features
154-
score: 4
155-
max: 4
156-
passed: true
157-
comment: Step function 1/n increments, y-axis 0-1 (with 1.02 padding), distinct
158-
line style, grid for percentile reading — all present
159-
- id: SC-03
160-
name: Data Mapping
161-
score: 3
162-
max: 3
163-
passed: true
164-
comment: X=finish times, Y=cumulative proportion 0-1, all 300 data points
165-
shown
166-
- id: SC-04
167-
name: Title & Legend
168-
score: 3
169-
max: 3
170-
passed: true
171-
comment: Title includes 'ecdf-basic · bokeh · anyplot.ai' with descriptive
172-
prefix; no legend for single series (correct)
173-
data_quality:
174-
score: 15
175-
max: 15
176-
items:
177-
- id: DQ-01
178-
name: Feature Coverage
179-
score: 6
180-
max: 6
181-
passed: true
182-
comment: Shows ECDF S-curve, step function character, percentile reading —
183-
all key aspects of ECDF visualized
184-
- id: DQ-02
185-
name: Realistic Context
186-
score: 5
187-
max: 5
188-
passed: true
189-
comment: Marathon finish times for recreational runners — real, neutral, scientifically
190-
plausible domain
191-
- id: DQ-03
192-
name: Appropriate Scale
193-
score: 4
194-
max: 4
195-
passed: true
196-
comment: normal(loc=240, scale=32) minutes — ~4 hours mean with 32 min std
197-
dev is realistic for recreational marathoners
198-
code_quality:
199-
score: 10
200-
max: 10
201-
items:
202-
- id: CQ-01
203-
name: KISS Structure
204-
score: 3
205-
max: 3
206-
passed: true
207-
comment: 'Linear: imports → tokens → data → ECDF calc → figure → style → save;
208-
no functions or classes'
209-
- id: CQ-02
210-
name: Reproducibility
211-
score: 2
212-
max: 2
213-
passed: true
214-
comment: np.random.seed(42) set
215-
- id: CQ-03
216-
name: Clean Imports
217-
score: 2
218-
max: 2
219-
passed: true
220-
comment: All imported symbols (export_png, output_file, save, ColumnDataSource,
221-
HoverTool, Label, Span, figure) are used
222-
- id: CQ-04
223-
name: Code Elegance
224-
score: 2
225-
max: 2
226-
passed: true
227-
comment: Loop for percentile reference lines is clean; no over-engineering
228-
or fake functionality
229-
- id: CQ-05
230-
name: Output & API
231-
score: 1
232-
max: 1
233-
passed: true
234-
comment: Saves plot-{THEME}.png and plot-{THEME}.html; current Bokeh API
235-
library_mastery:
236-
score: 7
237-
max: 10
238-
items:
239-
- id: LM-01
240-
name: Idiomatic Usage
241-
score: 4
242-
max: 5
243-
passed: true
244-
comment: ColumnDataSource, p.step() with correct mode='after', add_layout(Span),
245-
add_layout(Label), HoverTool with renderers — idiomatic Bokeh patterns used
246-
correctly
247-
- id: LM-02
248-
name: Distinctive Features
249-
score: 3
250-
max: 5
251-
passed: false
252-
comment: HoverTool with mode='vline' and Span/Label annotations are distinctly
253-
Bokeh; could further leverage CrosshairTool or custom JS callbacks
254-
verdict: REJECTED
255-
impl_tags:
256-
dependencies: []
257-
techniques:
258-
- hover-tooltips
259-
- html-export
260-
- annotations
261-
patterns:
262-
- data-generation
263-
- columndatasource
264-
dataprep: []
265-
styling:
266-
- alpha-blending
20+
strengths: []
21+
weaknesses: []

0 commit comments

Comments
 (0)