Regen from quality 88. Addressed:
- Change request: swapped domain from tech-product sales (matched altair)
to manufacturing sector output ($M, 2023 vs 2024) to break cross-library
convergence
- Step 0 canvas contract: previous write_image used width=1600/height=900/
scale=3 (4800x2700, off-target); corrected to width=800/height=450/
scale=4 (3200x1800) and rescaled all font/margin/line/marker values to
match the smaller layout base
- Label crowding (VQ-02/DE-02): added a two-pass declutter algorithm that
pushes overlapping annotation labels apart in y while keeping a thin
leader line back to the true data point, so decluttering never
disconnects a label from its entity
- No size/weight variation on biggest movers (DE-03): line width and
marker size now scale with each entity's magnitude of % change
- Top/right spines (DE-02): explicit mirror=False on both axes
- Fixed missing {language} token in the mandated title format
("slope-basic · plotly · anyplot.ai" -> ". . . · python · plotly · anyplot.ai")
Preserved: semantic green/red direction coding, inline bilateral labels,
hover tooltips, HTML export, KISS structure.
Implementation:
slope-basic- python/plotlyImplements the python/plotly version of
slope-basic.File:
plots/slope-basic/implementations/python/plotly.pyParent Issue: #981
🤖 impl-generate workflow