Skip to content

Commit 4b1e91b

Browse files
chore(altair): update quality score 79 and review feedback for stereonet-equal-area
1 parent 54290a7 commit 4b1e91b

2 files changed

Lines changed: 79 additions & 62 deletions

File tree

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

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
""" pyplots.ai
22
stereonet-equal-area: Structural Geology Stereonet (Equal-Area Projection)
33
Library: altair 6.0.0 | Python 3.14.3
4-
Quality: 78/100 | Created: 2026-03-15
4+
Quality: 79/100 | Created: 2026-03-15
55
"""
66

77
import altair as alt

plots/stereonet-equal-area/metadata/altair.yaml

Lines changed: 78 additions & 61 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
library: altair
22
specification_id: stereonet-equal-area
33
created: '2026-03-15T23:00:08Z'
4-
updated: '2026-03-15T23:04:38Z'
4+
updated: '2026-03-15T23:15:13Z'
55
generated_by: claude-opus-4-5-20251101
66
workflow_run: 23121188868
77
issue: 4576
@@ -10,36 +10,40 @@ library_version: 6.0.0
1010
preview_url: https://storage.googleapis.com/pyplots-images/plots/stereonet-equal-area/altair/plot.png
1111
preview_thumb: https://storage.googleapis.com/pyplots-images/plots/stereonet-equal-area/altair/plot_thumb.png
1212
preview_html: https://storage.googleapis.com/pyplots-images/plots/stereonet-equal-area/altair/plot.html
13-
quality_score: 78
13+
quality_score: 79
1414
review:
1515
strengths:
16-
- Mathematically correct equal-area (Schmidt) projection implementation
17-
- Clean code structure with well-organized data preparation
18-
- Thoughtful visual design with custom colors, white marker strokes, and subtle
19-
grid
20-
- 'Complete feature set: great circles, poles, density, cardinal labels, tick marks'
21-
- Interactive tooltips showing strike/dip values add value
16+
- Correct equal-area (Schmidt) projection mathematics for both poles and great circles
17+
- Well-layered composition with appropriate opacity hierarchy (density < grid <
18+
great circles < poles)
19+
- Custom color palette with white-stroke poles for visual distinction
20+
- 'Comprehensive stereonet elements: primitive circle, tick marks, cardinal labels,
21+
grid circles, cross lines'
22+
- Interactive tooltips on poles showing strike/dip values (Altair-distinctive)
2223
weaknesses:
23-
- 'Bedding and Joint colors (#306998 blue vs #2A9D8F teal) are too similar, reducing
24-
distinguishability'
25-
- Great circles at 0.35 opacity are very faint and hard to trace visually
26-
- Density is shown as blocky rectangular bins rather than smooth contours
27-
- No visual emphasis or annotations highlighting key geological patterns
24+
- Density representation uses mark_rect heatmap grid instead of smooth Kamb contour
25+
lines — creates a pixelated/blocky appearance
26+
- No mean orientation annotations or summary statistics to guide viewer interpretation
27+
- Library mastery is limited — Altair used primarily as a rendering engine for manually
28+
computed geometry
29+
- Joint color appears inconsistently between legend and plot
2830
image_description: 'The plot shows a lower-hemisphere equal-area (Schmidt) stereonet
29-
projection inside a circular primitive circle with tick marks every 10 degrees.
30-
Cardinal directions (N, E, S, W) are labeled in bold around the perimeter. Three
31-
geological feature types are plotted: Bedding (dark blue, #306998), Fault (red/coral,
32-
#C1432E), and Joint (teal, #2A9D8F). Poles to planes are shown as filled circles
33-
with white stroke, and great circles are drawn as curved lines across the stereonet
34-
at 0.35 opacity. A density heatmap using gray rectangular bins is visible in the
35-
background highlighting pole concentration areas. Grid circles at 30 and 60 degree
36-
dip and cross lines are rendered as subtle light gray lines. The title reads "stereonet-equal-area
37-
· altair · pyplots.ai" with subtitle "Lower-Hemisphere Equal-Area (Schmidt) Projection".
38-
A "Feature Type" legend is positioned in the upper right corner. The plot uses
39-
a 1200x1200 square layout.'
31+
projection rendered as a 1:1 square chart. A bold black primitive circle defines
32+
the projection boundary, with tick marks every 10 degrees (longer ticks at 30-degree
33+
intervals) and cardinal direction labels (N, E, S, W) in bold dark text. Three
34+
geological feature types are plotted: Bedding (blue), Fault (red/coral), and Joint
35+
(teal/gold). Poles to planes appear as filled circles with white stroke, clustered
36+
in three distinct groups — Bedding poles in the center-left area, Fault poles
37+
in the upper-right (NE quadrant), and Joint poles in the lower portion (S). Great
38+
circles are drawn as semi-transparent colored lines for each measurement. A gray
39+
rectangular heatmap grid approximates density contours within the primitive circle.
40+
Subtle gray grid circles at 30 and 60 degree dip and N-S/E-W cross lines provide
41+
reference. The title reads "stereonet-equal-area · altair · pyplots.ai" with subtitle
42+
"Lower-Hemisphere Equal-Area (Schmidt) Projection". A legend in the top-right
43+
shows Feature Type with colored symbols.'
4044
criteria_checklist:
4145
visual_quality:
42-
score: 24
46+
score: 25
4347
max: 30
4448
items:
4549
- id: VQ-01
@@ -48,39 +52,42 @@ review:
4852
max: 8
4953
passed: true
5054
comment: 'Font sizes explicitly set: title=28, subtitle=20, cardinal labels=24,
51-
legend title=20, legend labels=18'
55+
legend title=20, legend labels=18. All readable.'
5256
- id: VQ-02
5357
name: No Overlap
5458
score: 5
5559
max: 6
5660
passed: true
57-
comment: Minor overlap among clustered pole data points, no text overlap
61+
comment: Text elements well-separated. Some density grid rectangles create
62+
minor visual clutter near poles.
5863
- id: VQ-03
5964
name: Element Visibility
60-
score: 4
65+
score: 5
6166
max: 6
62-
passed: false
63-
comment: Great circles at 0.35 opacity are very faint. Bedding and Joint colors
64-
appear similar
67+
passed: true
68+
comment: Poles well-sized (180) with white stroke. Great circles at opacity=0.35
69+
visible but not overwhelming.
6570
- id: VQ-04
6671
name: Color Accessibility
6772
score: 3
6873
max: 4
69-
passed: false
70-
comment: Bedding (#306998) and Joint (#2A9D8F) both blue-spectrum, hard to
71-
distinguish
74+
passed: true
75+
comment: Blue/red/teal palette distinguishable for most colorblind types.
76+
Red and teal could be difficult for some deuteranopia cases.
7277
- id: VQ-05
7378
name: Layout & Canvas
7479
score: 3
7580
max: 4
7681
passed: true
77-
comment: Square canvas appropriate for stereonet, legend slightly isolated
82+
comment: Square 1200x1200 appropriate for stereonet. Circle fills canvas well.
83+
Some empty space in corners inherent to circular projection.
7884
- id: VQ-06
7985
name: Axis Labels & Title
8086
score: 2
8187
max: 2
8288
passed: true
83-
comment: Cardinal directions labeled, descriptive title and subtitle
89+
comment: Axes hidden (appropriate for stereonet). Cardinal directions serve
90+
as orientation labels.
8491
design_excellence:
8592
score: 12
8693
max: 20
@@ -90,47 +97,51 @@ review:
9097
score: 5
9198
max: 8
9299
passed: true
93-
comment: Custom palette, white marker strokes, clean design above defaults
100+
comment: Custom color palette, layered opacity hierarchy, white stroke on
101+
poles. Above defaults but not publication-quality.
94102
- id: DE-02
95103
name: Visual Refinement
96104
score: 4
97105
max: 6
98106
passed: true
99-
comment: View stroke removed, subtle grid, tick mark differentiation
107+
comment: View stroke removed, subtle grid, differentiated tick lengths at
108+
30-degree intervals.
100109
- id: DE-03
101110
name: Data Storytelling
102111
score: 3
103112
max: 6
104-
passed: false
105-
comment: Three clusters visible with density but no emphasis guiding the viewer
113+
passed: true
114+
comment: Three distinct clusters visible. Great circles + poles tell structural
115+
geology story. No annotations guide interpretation.
106116
spec_compliance:
107-
score: 13
117+
score: 14
108118
max: 15
109119
items:
110120
- id: SC-01
111121
name: Plot Type
112122
score: 5
113123
max: 5
114124
passed: true
115-
comment: Correct equal-area Schmidt lower-hemisphere projection
125+
comment: Correct equal-area Schmidt net lower-hemisphere stereographic projection.
116126
- id: SC-02
117127
name: Required Features
118128
score: 3
119129
max: 4
120-
passed: false
121-
comment: Density shown as blocky rectangles rather than smooth Kamb contours
130+
passed: true
131+
comment: All features present except density shown as rect heatmap instead
132+
of Kamb contour lines.
122133
- id: SC-03
123134
name: Data Mapping
124135
score: 3
125136
max: 3
126137
passed: true
127-
comment: Strike/dip correctly converted to equal-area projection
138+
comment: Strike/dip correctly projected using equal-area formulas.
128139
- id: SC-04
129140
name: Title & Legend
130141
score: 3
131142
max: 3
132143
passed: true
133-
comment: Correct title format, legend labels match feature types
144+
comment: Title format correct. Legend labels match data categories.
134145
data_quality:
135146
score: 14
136147
max: 15
@@ -140,53 +151,57 @@ review:
140151
score: 5
141152
max: 6
142153
passed: true
143-
comment: Three feature types with different orientations and dip angles
154+
comment: 'Three feature types with distinct orientations: Bedding (~35 dip),
155+
Fault (~70 dip), Joint (~80 dip).'
144156
- id: DQ-02
145157
name: Realistic Context
146158
score: 5
147159
max: 5
148160
passed: true
149-
comment: Geological structural measurements, realistic and neutral
161+
comment: Geological structural data with realistic feature types and plausible
162+
orientations.
150163
- id: DQ-03
151164
name: Appropriate Scale
152165
score: 4
153166
max: 4
154167
passed: true
155-
comment: Realistic strike and dip values for geological structures
168+
comment: Strike and dip values are realistic with natural-looking cluster
169+
scatter.
156170
code_quality:
157-
score: 10
171+
score: 9
158172
max: 10
159173
items:
160174
- id: CQ-01
161175
name: KISS Structure
162176
score: 3
163177
max: 3
164178
passed: true
165-
comment: 'Linear flow: imports, data, projection, layers, compose, save'
179+
comment: 'Linear flow: imports, data, projection, layers, composition, save.'
166180
- id: CQ-02
167181
name: Reproducibility
168182
score: 2
169183
max: 2
170184
passed: true
171-
comment: np.random.seed(42) set
185+
comment: np.random.seed(42) set.
172186
- id: CQ-03
173187
name: Clean Imports
174188
score: 2
175189
max: 2
176190
passed: true
177-
comment: Only altair, numpy, pandas imported and all used
191+
comment: Only altair, numpy, pandas imported; all used.
178192
- id: CQ-04
179193
name: Code Elegance
180-
score: 2
194+
score: 1
181195
max: 2
182196
passed: true
183-
comment: Well-structured, appropriate complexity for the projection math
197+
comment: Verbose but appropriate for stereonet complexity. Density grid approach
198+
is a workaround.
184199
- id: CQ-05
185200
name: Output & API
186201
score: 1
187202
max: 1
188203
passed: true
189-
comment: Saves as plot.png with scale_factor=3.0 and plot.html
204+
comment: Saves as plot.png and plot.html. Current API.
190205
library_mastery:
191206
score: 5
192207
max: 10
@@ -195,22 +210,24 @@ review:
195210
name: Idiomatic Usage
196211
score: 3
197212
max: 5
198-
passed: false
199-
comment: Most computation is numpy-based; Altair serves primarily as renderer
213+
passed: true
214+
comment: Uses alt.layer(), proper encodings, mark_* functions. Most computation
215+
is manual numpy.
200216
- id: LM-02
201217
name: Distinctive Features
202218
score: 2
203219
max: 5
204-
passed: false
205-
comment: Tooltips and HTML export used but no selections or parameters
220+
passed: true
221+
comment: Interactive tooltips on poles showing strike/dip. HTML export. Core
222+
visualization doesn't leverage declarative grammar.
206223
verdict: REJECTED
207224
impl_tags:
208225
dependencies: []
209226
techniques:
227+
- polar-projection
210228
- layer-composition
211229
- hover-tooltips
212230
- html-export
213-
- polar-projection
214231
- manual-ticks
215232
patterns:
216233
- data-generation

0 commit comments

Comments
 (0)