11library : highcharts
22specification_id : heatmap-cohort-retention
33created : ' 2026-03-16T20:46:45Z'
4- updated : ' 2026-03-16T20:51:24Z '
4+ updated : ' 2026-03-16T21:00:52Z '
55generated_by : claude-opus-4-5-20251101
66workflow_run : 23165008487
77issue : 4570
@@ -10,101 +10,106 @@ library_version: unknown
1010preview_url : https://storage.googleapis.com/pyplots-images/plots/heatmap-cohort-retention/highcharts/plot.png
1111preview_thumb : https://storage.googleapis.com/pyplots-images/plots/heatmap-cohort-retention/highcharts/plot_thumb.png
1212preview_html : https://storage.googleapis.com/pyplots-images/plots/heatmap-cohort-retention/highcharts/plot.html
13- quality_score : 85
13+ quality_score : 90
1414review :
1515 strengths :
16- - Perfect spec compliance with all required features including triangular shape,
17- retention percentages in cells, cohort sizes, and color bar
18- - Strong data quality with realistic SaaS retention scenario and plausible values
19- - Custom 7-stop blue colorAxis with adaptive white/dark text labels via JS formatter
20- - Clean code structure with fallback CDN URLs for reliability
16+ - Excellent data storytelling with highlighted best/worst cohorts, star annotations,
17+ and color-coded labels explaining the narrative
18+ - Adaptive data label colors (white on dark, dark on light cells) ensure readability
19+ across the full retention range
20+ - Clean triangular shape with transparent null cells and matching border colors
21+ - Realistic SaaS retention data with differentiated cohort curves and plausible
22+ context
2123 weaknesses :
22- - Subtitle, x-axis title, and x-axis category labels are crowded at the top
23- - No data storytelling emphasis — all cohorts look similar with no focal point
24- - Right margin is generous, slightly reducing chart area
25- image_description : ' The plot displays a triangular heatmap of cohort retention data
26- with a blue sequential colormap. The title reads "heatmap-cohort-retention · highcharts
27- · pyplots.ai" at the top, followed by a subtitle "Monthly cohort retention rates
28- — percentage of users returning each month after signup" and the x-axis title
29- "Months Since Signup" — all three lines stacked closely together at the top. The
30- x-axis shows "Month 0" through "Month 9" along the top edge. The y-axis on the
31- left shows cohort labels from "Oct 2024 (1,290)" at the top to "Jan 2024 (1,240)"
32- at the bottom, with "Signup Cohort (Users)" as the axis title. Each cell contains
33- the retention percentage as text — white text on dark blue cells, dark text on
34- light blue cells. The triangular shape is correct: Oct 2024 has only 1 column
35- (100%), while Jan 2024 spans all 10 months (100% to 22.5%). A vertical color bar
36- on the right shows "Retention %" from 0% to 100%. The background is a subtle off-white
37- (#fafafa). Cell borders match the background, creating clean visual separation.'
24+ - Does not use the highcharts-core Python library; constructs raw JSON configuration
25+ instead
26+ image_description : ' The plot displays a triangular cohort retention heatmap with
27+ the title "heatmap-cohort-retention · highcharts · pyplots.ai" at the top. Below
28+ the title is a subtitle: "Monthly cohort retention rates — percentage of users
29+ returning each month after signup" with colored annotations highlighting the best
30+ cohort (Jun 2024 — new onboarding, in blue with a star) and worst cohort (Apr
31+ 2024 — buggy release, in red). The x-axis at the top shows "Month 0" through "Month
32+ 9" with the label "Months Since Signup." The y-axis on the left shows cohort labels
33+ with user counts (e.g., "Jan 2024 (1,240)"). The heatmap uses a blue sequential
34+ colormap from very light blue (low retention) to very dark navy (high retention/100%).
35+ Each cell displays its retention percentage with adaptive text color (white on
36+ dark cells, dark on light cells). The triangular shape is correctly formed — Jan
37+ 2024 at the bottom has all 10 periods, while Oct 2024 at the top has only 1. A
38+ vertical color bar on the right shows "Retention %" from 0% to 100%. The Jun 2024
39+ row has a subtle blue plotBand and its y-axis label is bold with a star; the Apr
40+ 2024 row has a subtle red plotBand and red-colored label. The background is a
41+ soft off-white (#fafafa).'
3842 criteria_checklist :
3943 visual_quality :
40- score : 26
44+ score : 28
4145 max : 30
4246 items :
4347 - id : VQ-01
4448 name : Text Legibility
4549 score : 7
4650 max : 8
4751 passed : true
48- comment : All font sizes explicitly set (title 48px, subtitle 28px , axis titles
49- 30px , labels 26-28px , data labels 24px). All readable .
52+ comment : All font sizes explicitly set (title 48px, subtitle 26px , axis titles
53+ 28px , labels 24-26px , data labels 24px). Subtitle annotations slightly small .
5054 - id : VQ-02
5155 name : No Overlap
52- score : 4
56+ score : 6
5357 max : 6
5458 passed : true
55- comment : Subtitle, x-axis title, and category labels stacked closely at top
56- creating visual crowding .
59+ comment : No overlapping text. Data labels fit within cells. Y-axis labels
60+ well-spaced .
5761 - id : VQ-03
5862 name : Element Visibility
5963 score : 6
6064 max : 6
6165 passed : true
62- comment : Heatmap cells well-sized with clear border separation. Adaptive data
63- label colors .
66+ comment : Heatmap cells well-sized with 3px borders creating crisp separation.
67+ Triangular shape well-defined .
6468 - id : VQ-04
6569 name : Color Accessibility
6670 score : 4
6771 max : 4
6872 passed : true
69- comment : Blue sequential colormap is colorblind-safe. Adaptive white/dark
70- text for contrast.
73+ comment : Blue sequential colormap is colorblind-safe. Adaptive text colors
74+ ensure contrast.
7175 - id : VQ-05
7276 name : Layout & Canvas
7377 score : 3
7478 max : 4
7579 passed : true
76- comment : Chart fills canvas reasonably. Right margin for colorbar is generous.
80+ comment : Good canvas usage. Triangular shape inherently leaves empty space
81+ in upper-right.
7782 - id : VQ-06
7883 name : Axis Labels & Title
7984 score : 2
8085 max : 2
8186 passed : true
8287 comment : ' Descriptive labels: Months Since Signup, Signup Cohort (Users).'
8388 design_excellence :
84- score : 13
89+ score : 15
8590 max : 20
8691 items :
8792 - id : DE-01
8893 name : Aesthetic Sophistication
8994 score : 6
9095 max : 8
9196 passed : true
92- comment : ' Custom 7 -stop blue gradient, custom font family, #fafafa background,
93- adaptive data label colors. Above defaults. '
97+ comment : Custom 8 -stop blue palette, adaptive text colors, highlighted cohorts
98+ with star/color, off-white background, custom font stack.
9499 - id : DE-02
95100 name : Visual Refinement
96101 score : 4
97102 max : 6
98103 passed : true
99- comment : Grid lines removed, axis lines removed, cell borders match background
100- for clean separation .
104+ comment : Grid/ axis lines removed, clean borders matching background, subtle
105+ plotBands for emphasis rows .
101106 - id : DE-03
102107 name : Data Storytelling
103- score : 3
108+ score : 5
104109 max : 6
105- passed : false
106- comment : Triangular shape and gradient convey retention decay but no focal
107- point or emphasis on insights .
110+ passed : true
111+ comment : Best cohort starred and blue-highlighted, worst in red, subtitle
112+ explains why, plotBands draw attention. Clear narrative .
108113 spec_compliance :
109114 score : 15
110115 max : 15
@@ -114,51 +119,51 @@ review:
114119 score : 5
115120 max : 5
116121 passed : true
117- comment : Correct heatmap with triangular shape .
122+ comment : Correct triangular heatmap with proper cohort structure .
118123 - id : SC-02
119124 name : Required Features
120125 score : 4
121126 max : 4
122127 passed : true
123- comment : ' All spec features present: period 0=100%, triangular shape, sequential
124- colormap, retention % in cells, cohort sizes, Month labels , color bar.'
128+ comment : ' All spec features present: triangular shape, percentages in cells,
129+ cohort sizes, blue colormap , color bar, Month N labels .'
125130 - id : SC-03
126131 name : Data Mapping
127132 score : 3
128133 max : 3
129134 passed : true
130- comment : X=periods, Y=cohorts, color=retention rate. All correct.
135+ comment : X=periods, Y=cohorts. Period 0=100%. Triangular shape correct.
131136 - id : SC-04
132137 name : Title & Legend
133138 score : 3
134139 max : 3
135140 passed : true
136- comment : Title follows spec-id · library · pyplots.ai format. Color bar labeled
137- Retention %.
141+ comment : Title format correct. Color bar labeled Retention %.
138142 data_quality :
139- score : 14
143+ score : 15
140144 max : 15
141145 items :
142146 - id : DQ-01
143147 name : Feature Coverage
144- score : 5
148+ score : 6
145149 max : 6
146150 passed : true
147- comment : Shows retention decay, triangular shape, cohort variation. Cohorts
148- are somewhat similar in decay pattern .
151+ comment : Differentiated retention curves, best/worst cohorts, varied sizes,
152+ proper triangular structure .
149153 - id : DQ-02
150154 name : Realistic Context
151155 score : 5
152156 max : 5
153157 passed : true
154- comment : SaaS monthly cohort retention is a classic realistic business scenario.
158+ comment : SaaS monthly cohort retention — real, neutral business scenario with
159+ plausible narratives.
155160 - id : DQ-03
156161 name : Appropriate Scale
157162 score : 4
158163 max : 4
159164 passed : true
160- comment : Retention 100% to ~17-22% over 9 months is realistic. Cohort sizes
161- 1190-1680 are plausible .
165+ comment : Retention 100% to ~20% realistic. Cohort sizes 1,190-1,680 plausible
166+ for SaaS .
162167 code_quality :
163168 score : 10
164169 max : 10
@@ -168,7 +173,7 @@ review:
168173 score : 3
169174 max : 3
170175 passed : true
171- comment : ' Linear flow: imports, data generation, chart config, HTML, screenshot.'
176+ comment : ' Linear flow: imports, data, config, HTML, screenshot. No functions/classes .'
172177 - id : CQ-02
173178 name : Reproducibility
174179 score : 2
@@ -180,45 +185,46 @@ review:
180185 score : 2
181186 max : 2
182187 passed : true
183- comment : All imports are used.
188+ comment : All imports used.
184189 - id : CQ-04
185190 name : Code Elegance
186191 score : 2
187192 max : 2
188193 passed : true
189- comment : Clean, well-organized. Chart config as dict is idiomatic. Fallback
190- URLs.
194+ comment : Clean code, appropriate complexity. No fake UI.
191195 - id : CQ-05
192196 name : Output & API
193197 score : 1
194198 max : 1
195199 passed : true
196- comment : Saves as plot.png and plot.html .
200+ comment : Saves as plot.png via Selenium .
197201 library_mastery :
198202 score : 7
199203 max : 10
200204 items :
201205 - id : LM-01
202206 name : Idiomatic Usage
203- score : 4
207+ score : 3
204208 max : 5
205209 passed : true
206- comment : Constructs Highcharts heatmap via JSON config + Selenium. Valid approach.
210+ comment : Raw JSON config approach instead of highcharts-core Python API. Works
211+ correctly but bypasses Python wrapper.
207212 - id : LM-02
208213 name : Distinctive Features
209- score : 3
214+ score : 4
210215 max : 5
211216 passed : true
212- comment : Uses heatmap module, colorAxis with stops, custom JS formatter, tooltip
213- pointFormat, opposite x-axis .
214- verdict : REJECTED
217+ comment : Good use of colorAxis, plotBands, useHTML formatters, heatmap module,
218+ tooltip config .
219+ verdict : APPROVED
215220impl_tags :
216221 dependencies :
217222 - selenium
218223 techniques :
224+ - colorbar
219225 - annotations
226+ - hover-tooltips
220227 - html-export
221- - colorbar
222228 patterns :
223229 - data-generation
224230 - matrix-construction
0 commit comments