Skip to content

Commit bb71996

Browse files
chore(bokeh): update quality score 88 and review feedback for stereonet-equal-area
1 parent 28193e3 commit bb71996

2 files changed

Lines changed: 72 additions & 72 deletions

File tree

plots/stereonet-equal-area/implementations/bokeh.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
1-
"""pyplots.ai
1+
""" pyplots.ai
22
stereonet-equal-area: Structural Geology Stereonet (Equal-Area Projection)
33
Library: bokeh 3.9.0 | Python 3.14.3
4-
Created: 2026-03-15
4+
Quality: 88/100 | Created: 2026-03-15
55
"""
66

77
import numpy as np
Lines changed: 70 additions & 70 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
library: bokeh
22
specification_id: stereonet-equal-area
33
created: '2026-03-15T22:59:30Z'
4-
updated: '2026-03-15T23:16:25Z'
4+
updated: '2026-03-15T23:25:08Z'
55
generated_by: claude-opus-4-5-20251101
66
workflow_run: 23121188869
77
issue: 4576
@@ -10,110 +10,113 @@ library_version: 3.9.0
1010
preview_url: https://storage.googleapis.com/pyplots-images/plots/stereonet-equal-area/bokeh/plot.png
1111
preview_thumb: https://storage.googleapis.com/pyplots-images/plots/stereonet-equal-area/bokeh/plot_thumb.png
1212
preview_html: https://storage.googleapis.com/pyplots-images/plots/stereonet-equal-area/bokeh/plot.html
13-
quality_score: 84
13+
quality_score: 88
1414
review:
1515
strengths:
16-
- 'Full spec compliance: all required features including grid lines, density overlay,
17-
and degree labels'
18-
- 'Excellent Bokeh-specific features: HoverTool, interactive legend, image_rgba,
19-
HTML export'
20-
- Clean removal of matplotlib dependency — density rendered natively with Bokeh
21-
image_rgba
22-
- Well-chosen colorblind-safe palette with intentional visual hierarchy
23-
- Correct equal-area projection math throughout
16+
- Full spec compliance with all required features including grid lines, density
17+
heatmap, degree labels, and cardinal directions
18+
- Warm orange-red KDE density heatmap clearly visible and effectively communicates
19+
clustering patterns
20+
- 'Excellent use of Bokeh-specific features: HoverTool, interactive legend, image_rgba
21+
raster, HTML export'
22+
- Vectorized RGBA construction using numpy - clean and efficient
23+
- Correct equal-area projection math with proper visual hierarchy (density → great
24+
circles → poles)
25+
- Colorblind-safe blue/orange/purple palette with thoughtful styling throughout
2426
weaknesses:
25-
- KDE density heatmap overlay too faint — grayish shading barely visible, fails
26-
to communicate clustering density
27-
- Nested Python for-loop for RGBA construction is slow and verbose — should be vectorized
28-
with numpy
29-
- Great circles create visual clutter in dense areas at alpha=0.4
30-
- Design needs stronger density visualization to reach publication quality
27+
- Density heatmap uses a single warm color gradient without a colorbar/legend to
28+
quantify density levels
29+
- Great circles still create some visual noise where many overlap near the primitive
30+
circle edge
31+
- Design falls slightly short of publication-quality - no colorbar for density,
32+
could benefit from more refined typography
3133
image_description: 'The plot shows a lower-hemisphere equal-area (Schmidt net) stereonet
32-
rendered as a circle on a white 3600x3600 canvas. N is at the top, S at bottom,
33-
E at right, W at left, each in bold dark text (N is larger at ~38pt). Degree labels
34-
appear every 30 degrees around the perimeter (30, 60, 120, etc.) in gray. Tick
35-
marks are drawn every 10 degrees with thicker marks at cardinal and 30-degree
36-
intervals. Inside the primitive circle, subtle light gray grid lines form small
37-
circles at 10-degree dip intervals and great circle arcs at 30-degree azimuth
38-
intervals. Three geological feature types are plotted: Bedding (blue #306998,
39-
~40 measurements clustered in the NW quadrant), Joints (orange #E8833A, clustered
40-
near the S-SE region), and Faults (purple #8B5CF6, clustered in the SW quadrant).
41-
Both great circles (semi-transparent, alpha=0.4) and poles (solid dots with white
42-
edges, size=22) are shown for each type. A grayish KDE density heatmap overlay
43-
is faintly visible behind the pole clusters. A styled legend in the upper-right
44-
corner lists all three types. The title is centered at top, with an italic subtitle
45-
at bottom describing the projection type.'
34+
rendered as a circle on a white 3600x3600 canvas. The title "stereonet-equal-area
35+
· bokeh · pyplots.ai" is centered at top in 38pt text. Cardinal directions N (38pt
36+
bold), S, E, W (30pt bold) mark the perimeter. Degree labels appear every 30 degrees
37+
(30, 60, 120, 150, 210, 240, 300, 330) in gray 20pt text. Tick marks are drawn
38+
every 10 degrees with heavier marks at cardinal and 30-degree intervals. Inside
39+
the primitive circle, subtle light gray grid lines form small circles at 10-degree
40+
dip intervals and great circle arcs at 30-degree azimuth intervals. Three geological
41+
feature types are plotted: Bedding (blue #306998, approximately 40 poles clustered
42+
in the NW quadrant), Joints (orange #E8833A, poles near the S-SE region), and
43+
Faults (purple #8B5CF6, poles in the SW quadrant). Great circles are rendered
44+
as semi-transparent lines (alpha=0.25) and poles as solid dots (size=22) with
45+
white edges. A warm orange-red KDE density heatmap is clearly visible with three
46+
distinct hotspots around each pole cluster, effectively showing density concentrations.
47+
A styled legend in the upper-right corner with white background, gray border,
48+
and 26pt text lists all three types. An italic subtitle at the bottom reads "Lower-hemisphere
49+
equal-area (Schmidt) projection - Click legend to toggle."'
4650
criteria_checklist:
4751
visual_quality:
48-
score: 26
52+
score: 27
4953
max: 30
5054
items:
5155
- id: VQ-01
5256
name: Text Legibility
5357
score: 7
5458
max: 8
5559
passed: true
56-
comment: 'All font sizes explicitly set: title 38pt, N 38pt, cardinals 30pt,
57-
degree labels 18pt, legend 26pt. Degree labels slightly small for 3600px
58-
but readable'
60+
comment: 'All font sizes explicitly set: title 38pt, N 38pt, cardinal 30pt,
61+
degree labels 20pt, legend 26pt. All readable at 3600px'
5962
- id: VQ-02
6063
name: No Overlap
6164
score: 6
6265
max: 6
6366
passed: true
64-
comment: No overlapping text; all labels cleanly separated
67+
comment: No overlapping text or data elements
6568
- id: VQ-03
6669
name: Element Visibility
67-
score: 4
70+
score: 5
6871
max: 6
6972
passed: true
70-
comment: Poles visible at size=22 with white edge; great circles create clutter
71-
in dense areas; KDE density heatmap too faint
73+
comment: Poles clearly visible with white edges; density heatmap visible in
74+
warm tones; great circles slightly cluttered in dense areas
7275
- id: VQ-04
7376
name: Color Accessibility
7477
score: 4
7578
max: 4
7679
passed: true
77-
comment: Blue/orange/purple palette is colorblind-safe with excellent contrast
80+
comment: Blue/orange/purple palette is colorblind-safe
7881
- id: VQ-05
7982
name: Layout & Canvas
8083
score: 3
8184
max: 4
8285
passed: true
8386
comment: Square format correct; net fills ~60% of canvas; slight wasted space
84-
below subtitle
87+
in corners
8588
- id: VQ-06
8689
name: Axis Labels & Title
8790
score: 2
8891
max: 2
8992
passed: true
90-
comment: Cardinal directions and degree labels serve as orientation; descriptive
91-
title and subtitle
93+
comment: Cardinal directions and degree labels present; descriptive title
94+
and subtitle
9295
design_excellence:
93-
score: 12
96+
score: 14
9497
max: 20
9598
items:
9699
- id: DE-01
97100
name: Aesthetic Sophistication
98-
score: 5
101+
score: 6
99102
max: 8
100103
passed: true
101-
comment: Custom palette, alpha-blended great circles, styled legend — above
102-
defaults but not publication-quality
104+
comment: Strong design with custom palette, warm density heatmap, styled legend,
105+
white-edged poles, alpha-blended great circles
103106
- id: DE-02
104107
name: Visual Refinement
105108
score: 4
106109
max: 6
107110
passed: true
108-
comment: Axes hidden, custom grid, outline removed, tick marks with varying
109-
weight, styled legend background
111+
comment: Axes hidden, custom grid lines, outline removed, styled tick marks
112+
and legend
110113
- id: DE-03
111114
name: Data Storytelling
112-
score: 3
115+
score: 4
113116
max: 6
114117
passed: true
115-
comment: Three distinct clusters visible with visual hierarchy; density overlay
116-
too faint to highlight preferred orientations
118+
comment: 'Clear visual hierarchy: density heatmap → great circles → poles.
119+
Warm density hotspots highlight preferred orientations'
117120
spec_compliance:
118121
score: 15
119122
max: 15
@@ -130,13 +133,13 @@ review:
130133
max: 4
131134
passed: true
132135
comment: 'All features present: great circles, poles, grid lines, density
133-
overlay, tick marks, degree labels, legend'
136+
heatmap, degree labels, legend'
134137
- id: SC-03
135138
name: Data Mapping
136139
score: 3
137140
max: 3
138141
passed: true
139-
comment: Strike/dip correctly projected to equal-area coordinates
142+
comment: Strike/dip correctly converted to equal-area projection
140143
- id: SC-04
141144
name: Title & Legend
142145
score: 3
@@ -152,8 +155,8 @@ review:
152155
score: 5
153156
max: 6
154157
passed: true
155-
comment: Three feature types with different orientations and dip angles; good
156-
clustering variation
158+
comment: Three distinct feature types with different orientations and dip
159+
angles
157160
- id: DQ-02
158161
name: Realistic Context
159162
score: 5
@@ -165,9 +168,9 @@ review:
165168
score: 4
166169
max: 4
167170
passed: true
168-
comment: Strike 0-360, dip 5-89 proper geological ranges
171+
comment: Strike 0-360, dip 5-89 degrees - proper geological ranges
169172
code_quality:
170-
score: 9
173+
score: 10
171174
max: 10
172175
items:
173176
- id: CQ-01
@@ -181,7 +184,7 @@ review:
181184
score: 2
182185
max: 2
183186
passed: true
184-
comment: np.random.seed(42) set at start
187+
comment: np.random.seed(42) set
185188
- id: CQ-03
186189
name: Clean Imports
187190
score: 2
@@ -190,17 +193,16 @@ review:
190193
comment: All imports used
191194
- id: CQ-04
192195
name: Code Elegance
193-
score: 1
196+
score: 2
194197
max: 2
195198
passed: true
196-
comment: Double nested for-loop for RGBA construction is verbose; should be
197-
vectorized
199+
comment: Vectorized RGBA construction, clean Pythonic code
198200
- id: CQ-05
199201
name: Output & API
200202
score: 1
201203
max: 1
202204
passed: true
203-
comment: Saves plot.png and plot.html; current API
205+
comment: Saves plot.png and plot.html with current API
204206
library_mastery:
205207
score: 8
206208
max: 10
@@ -210,15 +212,15 @@ review:
210212
score: 4
211213
max: 5
212214
passed: true
213-
comment: Uses ColumnDataSource, multi_line, scatter, Label, Legend, image_rgba
214-
— proper Bokeh patterns
215+
comment: Uses ColumnDataSource, multi_line, scatter, Label, Legend/LegendItem,
216+
image_rgba
215217
- id: LM-02
216218
name: Distinctive Features
217219
score: 4
218220
max: 5
219221
passed: true
220-
comment: HoverTool, interactive legend click_policy, image_rgba, HTML export
221-
— distinctively Bokeh
222+
comment: HoverTool, interactive legend click_policy=hide, image_rgba raster,
223+
HTML export
222224
verdict: REJECTED
223225
impl_tags:
224226
dependencies:
@@ -227,17 +229,15 @@ impl_tags:
227229
- polar-projection
228230
- hover-tooltips
229231
- custom-legend
230-
- annotations
231232
- html-export
232233
patterns:
233234
- data-generation
234235
- iteration-over-groups
235236
- columndatasource
236-
- matrix-construction
237237
dataprep:
238238
- kde
239239
styling:
240-
- minimal-chrome
241240
- alpha-blending
242-
- grid-styling
243241
- edge-highlighting
242+
- grid-styling
243+
- minimal-chrome

0 commit comments

Comments
 (0)