|
| 1 | +# Per-library metadata for bokeh implementation of ecdf-basic |
| 2 | +# Auto-generated by impl-generate.yml |
| 3 | + |
1 | 4 | library: bokeh |
2 | 5 | language: python |
3 | 6 | specification_id: ecdf-basic |
4 | 7 | 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 |
8 | 11 | 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 |
11 | 14 | preview_url_light: https://storage.googleapis.com/anyplot-images/plots/ecdf-basic/python/bokeh/plot-light.png |
12 | 15 | preview_url_dark: https://storage.googleapis.com/anyplot-images/plots/ecdf-basic/python/bokeh/plot-dark.png |
13 | 16 | preview_html_light: https://storage.googleapis.com/anyplot-images/plots/ecdf-basic/python/bokeh/plot-light.html |
14 | 17 | 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 |
16 | 19 | 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