| name | chart-rendering |
| description | Visualise the result of an analysis as a chart (line, bar, area, scatter, etc.). Use when the user asks to "plot...", "chart...", "show me the trend of...", "visualise...", or when a numerical result has more than ~10 rows and would be easier to read as a picture. Produces an image file plus the script that generated it. |
Chart Rendering Skill
Repeatable SOP for turning a result set into a chart that actually communicates
the point.
Steps
-
Match chart type to question. Decide before drawing:
| Question shape | Chart |
|---|
| "How does X change over time?" | Line (single series) or multi-line |
| "Composition / share of total" | Stacked bar, or 100% stacked area |
| "Comparison across a small set of categories" | Bar (horizontal if labels are long) |
| "Relationship between two numeric variables" | Scatter |
| "Distribution of a single variable" | Histogram or box plot |
| "Cumulative total" | Area |
If none fit, ask the user which view they want — do not default to "any chart
will do".
-
Prepare the data. The query result from the [[sql-analysis]] Skill should
already be tidy (one row per data point, one column per dimension). If not,
reshape first using pandas (pivot, melt, groupby). Save the cleaned
frame to knowledge/cache/<topic>.csv so it can be re-rendered.
-
Render with matplotlib. Write the script to a file under
scratch/charts/<topic>.py and execute it via shell_run. Conventions:
- Title — one sentence answering the question (not "Untitled chart").
- Axes — label both, include units (
Active users (count),
Date (UTC)).
- Legend — include only if there is more than one series.
- Colours — use the matplotlib default palette unless the user has a
stated brand colour in
knowledge/style.md.
- Output — save as PNG (
bbox_inches='tight', dpi=150) under
knowledge/charts/<topic>.png.
-
Show and explain. In the assistant reply, link the saved image with a
markdown image embed () and write
2–3 sentences interpreting it — what the chart shows, the one thing the
user should take away, and any caveat (incomplete latest data point,
outliers excluded, etc.).
-
Keep the script reproducible. The chart file is the artefact; the script
under scratch/charts/<topic>.py is the source of truth. If the user asks
for a tweak ("can we use a log y-axis?"), edit the script and re-run — do
not regenerate from scratch.
Anti-patterns
- ❌ Pie charts with > 5 slices.
- ❌ Charting raw counts when proportions are what the user actually asked.
- ❌ A chart whose axes have no labels or unit.
- ❌ Embedding the image without 2 sentences of interpretation.
When to delegate
If the user wants a multi-chart dashboard with narrative around it (e.g. "build
me a weekly product health deck"), spawn the report-writer sub-agent —
this Skill is for individual charts.