|
| 1 | +# Per-library metadata for matplotlib implementation of network-force-directed |
| 2 | +# Auto-generated by impl-generate.yml |
| 3 | + |
1 | 4 | library: matplotlib |
2 | 5 | language: python |
3 | 6 | specification_id: network-force-directed |
4 | 7 | created: '2025-12-23T15:14:17Z' |
5 | | -updated: '2026-04-26T08:47:45Z' |
6 | | -generated_by: claude-opus |
7 | | -workflow_run: 24952381723 |
| 8 | +updated: '2026-07-01T01:15:35Z' |
| 9 | +generated_by: claude-sonnet |
| 10 | +workflow_run: 28486437476 |
8 | 11 | issue: 990 |
9 | | -python_version: 3.14.4 |
10 | | -library_version: 3.10.9 |
| 12 | +language_version: 3.13.14 |
| 13 | +library_version: 3.11.0 |
11 | 14 | preview_url_light: https://storage.googleapis.com/anyplot-images/plots/network-force-directed/python/matplotlib/plot-light.png |
12 | 15 | preview_url_dark: https://storage.googleapis.com/anyplot-images/plots/network-force-directed/python/matplotlib/plot-dark.png |
13 | 16 | preview_html_light: null |
14 | 17 | preview_html_dark: null |
15 | | -quality_score: 85 |
| 18 | +quality_score: null |
16 | 19 | review: |
17 | | - strengths: |
18 | | - - 'Perfect spec and data quality: realistic company social network with clear community |
19 | | - structure, degree-based hub sizing, hub labeling, and bridge edges — all spec |
20 | | - features implemented' |
21 | | - - Force-directed Fruchterman-Reingold layout implemented from scratch with correct |
22 | | - repulsive/attractive forces and temperature cooling |
23 | | - - 'Efficient matplotlib idioms: LineCollection for O(1) edge batch rendering, custom |
24 | | - legend handles, theme-adaptive chrome throughout both renders' |
25 | | - - Both renders pass theme-readability checks with no dark-on-dark or light-on-light |
26 | | - failures |
27 | | - weaknesses: |
28 | | - - Hub label fontsize (14pt) is below the 16pt minimum for secondary text at 4800x2700 |
29 | | - resolution; footer fontsize (12pt) is too small — both should be increased |
30 | | - - DE-01 design sophistication is solid but not exceptional; could differentiate |
31 | | - bridge edges (e.g., dashed or different opacity) from intra-community edges to |
32 | | - add another layer of visual storytelling |
33 | | - - LM-02 could leverage more distinctly matplotlib capabilities (e.g., FancyArrowPatch, |
34 | | - PathPatch for curved edges, or inset_axes for a degree distribution inset) |
35 | | - image_description: |- |
36 | | - Light render (plot-light.png): |
37 | | - Background: Warm off-white (~#FAF8F1) — correct theme surface, not pure white |
38 | | - Chrome: Title "network-force-directed · matplotlib · anyplot.ai" in dark ink, clearly readable; legend with "Teams" title readable; hub annotation labels readable; footer readable (but small at 12pt) |
39 | | - Data: Three communities — Engineering (#009E73 teal, right), Marketing (#D55E00 orange, lower center-left), Sales (#0072B2 blue, upper left); nodes sized by degree with hub nodes visibly larger; edges in muted gray at alpha=0.30 |
40 | | - Legibility verdict: PASS (hub labels at 14pt and footer at 12pt are slightly below 16pt/14pt guidelines but still readable) |
41 | | -
|
42 | | - Dark render (plot-dark.png): |
43 | | - Background: Warm near-black (~#1A1A17) — correct dark theme surface, not pure black |
44 | | - Chrome: Title in light-colored text readable against dark background; legend background is elevated dark surface (#242420); legend text and annotations adapt to light chrome; no dark-on-dark failures detected |
45 | | - Data: Colors identical to light render — Engineering #009E73, Marketing #D55E00, Sales #0072B2 — confirming Okabe-Ito positions 1-3 are theme-invariant; node sizing identical |
46 | | - Legibility verdict: PASS |
47 | | - criteria_checklist: |
48 | | - visual_quality: |
49 | | - score: 25 |
50 | | - max: 30 |
51 | | - items: |
52 | | - - id: VQ-01 |
53 | | - name: Text Legibility |
54 | | - score: 6 |
55 | | - max: 8 |
56 | | - passed: true |
57 | | - comment: Title 24pt, legend 16pt/18pt explicitly set; hub labels 14pt below |
58 | | - 16pt minimum; footer 12pt too small for 4800x2700 |
59 | | - - id: VQ-02 |
60 | | - name: No Overlap |
61 | | - score: 5 |
62 | | - max: 6 |
63 | | - passed: true |
64 | | - comment: Hub labels per community are adjacent but readable; no severe overlap |
65 | | - - id: VQ-03 |
66 | | - name: Element Visibility |
67 | | - score: 5 |
68 | | - max: 6 |
69 | | - passed: true |
70 | | - comment: Nodes well-sized with degree scaling; edges at alpha=0.30 intentionally |
71 | | - faint but visible |
72 | | - - id: VQ-04 |
73 | | - name: Color Accessibility |
74 | | - score: 2 |
75 | | - max: 2 |
76 | | - passed: true |
77 | | - comment: Okabe-Ito positions 1-3 are colorblind-safe with good luminance contrast |
78 | | - - id: VQ-05 |
79 | | - name: Layout & Canvas |
80 | | - score: 3 |
81 | | - max: 4 |
82 | | - passed: true |
83 | | - comment: Three-cluster layout uses canvas well; minor imbalance with empty |
84 | | - space in lower-right quadrant |
85 | | - - id: VQ-06 |
86 | | - name: Axis Labels & Title |
87 | | - score: 2 |
88 | | - max: 2 |
89 | | - passed: true |
90 | | - comment: Title in correct format; axis off is appropriate for network; footer |
91 | | - provides context |
92 | | - - id: VQ-07 |
93 | | - name: Palette Compliance |
94 | | - score: 2 |
95 | | - max: 2 |
96 | | - passed: true |
97 | | - comment: 'First series #009E73; Okabe-Ito positions 1-3 in order; backgrounds |
98 | | - #FAF8F1/#1A1A17; chrome adapts correctly' |
99 | | - design_excellence: |
100 | | - score: 13 |
101 | | - max: 20 |
102 | | - items: |
103 | | - - id: DE-01 |
104 | | - name: Aesthetic Sophistication |
105 | | - score: 5 |
106 | | - max: 8 |
107 | | - passed: true |
108 | | - comment: Node edges set to page background for clean definition; degree-based |
109 | | - sizing adds hierarchy; hub labels with rounded boxes; above default but |
110 | | - not exceptional |
111 | | - - id: DE-02 |
112 | | - name: Visual Refinement |
113 | | - score: 4 |
114 | | - max: 6 |
115 | | - passed: true |
116 | | - comment: ax.axis('off') gives clean frameless look; custom legend frame with |
117 | | - adaptive colors; edge alpha=0.30 reduces noise; solid refinement |
118 | | - - id: DE-03 |
119 | | - name: Data Storytelling |
120 | | - score: 4 |
121 | | - max: 6 |
122 | | - passed: true |
123 | | - comment: Hub nodes prominent via size; labels direct viewer to key connectors; |
124 | | - community clusters immediately visible; bridge edges reveal structure |
125 | | - spec_compliance: |
126 | | - score: 15 |
127 | | - max: 15 |
128 | | - items: |
129 | | - - id: SC-01 |
130 | | - name: Plot Type |
131 | | - score: 5 |
132 | | - max: 5 |
133 | | - passed: true |
134 | | - comment: Force-directed graph implemented from scratch (Fruchterman-Reingold); |
135 | | - correct layout behavior |
136 | | - - id: SC-02 |
137 | | - name: Required Features |
138 | | - score: 4 |
139 | | - max: 4 |
140 | | - passed: true |
141 | | - comment: Nodes with IDs, edges, degree-based node sizing, hub labels, 200 |
142 | | - iterations for convergence — all present |
143 | | - - id: SC-03 |
144 | | - name: Data Mapping |
145 | | - score: 3 |
146 | | - max: 3 |
147 | | - passed: true |
148 | | - comment: 50 nodes, 133 edges, 3 communities; intra/inter-community connections |
149 | | - correctly represented |
150 | | - - id: SC-04 |
151 | | - name: Title & Legend |
152 | | - score: 3 |
153 | | - max: 3 |
154 | | - passed: true |
155 | | - comment: Title 'network-force-directed · matplotlib · anyplot.ai'; legend |
156 | | - shows Teams with Engineering/Marketing/Sales |
157 | | - data_quality: |
158 | | - score: 15 |
159 | | - max: 15 |
160 | | - items: |
161 | | - - id: DQ-01 |
162 | | - name: Feature Coverage |
163 | | - score: 6 |
164 | | - max: 6 |
165 | | - passed: true |
166 | | - comment: Shows community clustering, degree variation, hub identification, |
167 | | - bridge edges, density contrast |
168 | | - - id: DQ-02 |
169 | | - name: Realistic Context |
170 | | - score: 5 |
171 | | - max: 5 |
172 | | - passed: true |
173 | | - comment: Company social network (Engineering, Marketing, Sales) — real-world |
174 | | - neutral scenario |
175 | | - - id: DQ-03 |
176 | | - name: Appropriate Scale |
177 | | - score: 4 |
178 | | - max: 4 |
179 | | - passed: true |
180 | | - comment: 50 nodes (within 20-200 spec range), 133 edges, realistic department |
181 | | - sizes (18/17/15) |
182 | | - code_quality: |
183 | | - score: 10 |
184 | | - max: 10 |
185 | | - items: |
186 | | - - id: CQ-01 |
187 | | - name: KISS Structure |
188 | | - score: 3 |
189 | | - max: 3 |
190 | | - passed: true |
191 | | - comment: 'Flat: imports → tokens → data → layout → plot → save; no functions |
192 | | - or classes' |
193 | | - - id: CQ-02 |
194 | | - name: Reproducibility |
195 | | - score: 2 |
196 | | - max: 2 |
197 | | - passed: true |
198 | | - comment: np.random.seed(42) set before any random operation |
199 | | - - id: CQ-03 |
200 | | - name: Clean Imports |
201 | | - score: 2 |
202 | | - max: 2 |
203 | | - passed: true |
204 | | - comment: All four imports (os, matplotlib.pyplot, numpy, LineCollection) are |
205 | | - used |
206 | | - - id: CQ-04 |
207 | | - name: Code Elegance |
208 | | - score: 2 |
209 | | - max: 2 |
210 | | - passed: true |
211 | | - comment: Clean, Pythonic; O(n²) FR loops are the algorithm; no fake UI elements |
212 | | - - id: CQ-05 |
213 | | - name: Output & API |
214 | | - score: 1 |
215 | | - max: 1 |
216 | | - passed: true |
217 | | - comment: Saves as plot-{THEME}.png with dpi=300; no deprecated API |
218 | | - library_mastery: |
219 | | - score: 7 |
220 | | - max: 10 |
221 | | - items: |
222 | | - - id: LM-01 |
223 | | - name: Idiomatic Usage |
224 | | - score: 4 |
225 | | - max: 5 |
226 | | - passed: true |
227 | | - comment: LineCollection for batch edge rendering; empty-scatter custom legend |
228 | | - handle; plt.setp for batch text styling; fig.text for footer |
229 | | - - id: LM-02 |
230 | | - name: Distinctive Features |
231 | | - score: 3 |
232 | | - max: 5 |
233 | | - passed: true |
234 | | - comment: LineCollection and empty-scatter legend pattern are distinctly matplotlib; |
235 | | - could go further with FancyArrowPatch or PathPatch for curved edges |
236 | | - verdict: REJECTED |
237 | | -impl_tags: |
238 | | - dependencies: [] |
239 | | - techniques: |
240 | | - - annotations |
241 | | - - custom-legend |
242 | | - patterns: |
243 | | - - data-generation |
244 | | - - iteration-over-groups |
245 | | - - explicit-figure |
246 | | - dataprep: [] |
247 | | - styling: |
248 | | - - minimal-chrome |
249 | | - - alpha-blending |
250 | | - - edge-highlighting |
| 20 | + strengths: [] |
| 21 | + weaknesses: [] |
0 commit comments