# Chart Rendering

> 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.

- Skill: `agentscope-ai/chart-rendering` (Agent Skill)
- Install (CLI): `npx skillmds@latest add agentscope-ai/chart-rendering`
- Raw SKILL.md: https://api.skillmd.com/api/skills/agentscope-ai/chart-rendering/raw
- Safety review: pending
- Works with: Claude Code, Claude.ai, OpenAI Codex
- Category: AI & ML
- Author: agentscope-ai (https://skillmd.com/u/agentscope-ai)
- Updated: 2026-09-17
- Page: https://skillmd.com/skills/agentscope-ai/chart-rendering

---


# Chart Rendering Skill

Repeatable SOP for turning a result set into a chart that actually communicates
the point.

## Steps

1. **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".

2. **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.

3. **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`.

4. **Show and explain.** In the assistant reply, link the saved image with a
   markdown image embed (`![title](knowledge/charts/<topic>.png)`) 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.).

5. **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.

