---
name: agentscope-ai-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."
metadata:
  decimalai-skill-id: "f981cafc-4faf-4369-8f12-75c9ed745c05"
  decimalai-version-id: "950fe533-a9ac-43b9-bcb5-4d3398bb6fe2"
  decimalai-version: "1"
  decimalai-body-sha256: "32090ec0fbd5d0efdf2c2d08a9e276ec3ec415a35836975c6147baafef7dabe8"
  decimalai-name: "agentscope-ai/chart-rendering"
  decimalai-format: "1"
  decimalai-invocation: "model"
  decimalai-category: "design-media"
  decimalai-source: "https://app.decimal.ai/s/agentscope-ai-chart-rendering@1/SKILL.md"
---
# 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.
