| name | data-charts |
| description | Analyze tabular data and render charts (bar, line, scatter, pie, histogram) to PNG/SVG with pandas + matplotlib. Use whenever the user wants to plot, chart, graph, or visualize data from a CSV/JSON/Excel file or inline numbers. |
| license | MIT (Code Buddy original skill) |
| nativeEngine | {"triggers":["chart","plot","graph","visualize","visualization","histogram","bar chart","scatter plot","line chart","pie chart","graphique","diagramme","trace"]} |
Analyze data & render charts with pandas + matplotlib
Turn tabular data (CSV/JSON/Excel/inline) into a real chart image using the
open-source pandas + matplotlib libraries. Work in visible steps and
verify the image was written before reporting.
Getting the data when it's NOT in a file (e.g. "France GDP over 10 years")
When the user asks to chart something you must look up rather than read from a
file, gather the numbers FIRST with your normal tools — your own knowledge, or a
quick web_search — then hard-code them as inline Python lists. Do NOT
fetch from an external API inside the Python script (urllib/requests):
sandboxed network calls routinely time out (the 30 s command limit), which makes
you give up and fall back to a much worse ASCII/text "chart". Inline numbers →
matplotlib → a real PNG is fast and reliable. Only read from the network when the
user explicitly gives you a data URL and it's known-fast.
Preflight (extras-tier libs)
These libs are optional and not in the default build. Always check first:
python3 - <<'PY'
try:
import pandas, matplotlib
except ModuleNotFoundError as e:
raise SystemExit(
f"{e.name} not installed. Run `npm run prepare:python:extras` in cowork/ "
"to enable the data-charts skill (pandas + matplotlib)."
)
print("data-charts deps OK")
PY
Workflow (one step at a time)
- Load the data with pandas (
read_csv / read_json / read_excel), or
build a DataFrame from inline numbers.
- Inspect: print
df.head() and df.describe() (or the shape) so the data
is visibly understood before plotting.
- Plot: use the non-interactive Agg backend (
matplotlib.use("Agg"),
set before importing pyplot — there is no display), build the chart, add a
title + axis labels, and savefig(path, dpi=144, bbox_inches="tight").
- Verify:
assert os.path.getsize(path) > 0 and print the path + size.
- Report the saved image path and a one-line insight from the data.
Quality conventions
- Always set
matplotlib.use("Agg") before import matplotlib.pyplot — the
app has no X display; the interactive backend would crash.
- Label axes and give every chart a title; use a legend when >1 series.
- Prefer
tight_layout() / bbox_inches="tight" so labels aren't clipped.
- Save PNG by default (144 dpi); SVG when the user wants a vector.
Example
python3 - <<'PY'
import os
import pandas as pd
import matplotlib
matplotlib.use("Agg")
import matplotlib.pyplot as plt
df = pd.read_csv("sales.csv")
print(df.head()); print(df.describe())
fig, ax = plt.subplots(figsize=(8, 4.5))
ax.bar(df["month"], df["revenue"], color="#3b82f6")
ax.set_title("Monthly revenue"); ax.set_xlabel("Month"); ax.set_ylabel("Revenue ($)")
fig.tight_layout()
out = "revenue.png"
fig.savefig(out, dpi=144, bbox_inches="tight")
assert os.path.getsize(out) > 0, "chart image is empty"
print(f"wrote {out} ({os.path.getsize(out)} bytes); peak month = "
f"{df.loc[df['revenue'].idxmax(), 'month']}")
PY
Notes
- The chart image is an artifact — surface its path so the GUI can preview it.
- For quick stats without a chart,
df.describe() / df.groupby(...).agg(...).
- To put a chart into an Excel/Word/PowerPoint file, hand the saved PNG to the
xlsx/docx/pptx create skills.