ufo-ai/ufo-core/data-visualization
Claude Code and agent skill by ufo-ai/ufo-core
- community
Checking that the SKILL.md file is still in the repository.
Load when visualizing data — choosing chart types and producing plots that communicate distributions, trends, or comparisons.
Install
npx vskill@latest install ufo-ai/ufo-core/data-visualizationSKILL.md
Data Visualization
Chart selection, Python patterns, and design principles. Read $UFO_HOME/skills/design-foundations/references/color.md for color palettes and $UFO_HOME/skills/design-foundations/SKILL.md for foundational design rules.
Render, Inspect, Revise
Render the chart before finalizing. After saving the figure, read the saved PNG back. Look closely at the edges where text usually collides — title/subtitle stacking, annotation boxes overlapping each other, footer notes touching x-axis tick labels — and at clipping, spacing, missing content, and visual consistency. Revise until the rendered output is clean.
Chart Selection
| What you're showing | Best chart | Alternatives | |
|---|---|---|---|
| Trend over time | Line | Area (cumulative/composition) | |
| Comparison across categories | Vertical bar | Horizontal bar (many categories) | |
| Ranking | Horizontal bar | Dot plot, slope chart (two periods) | |
| Part-to-whole | Stacked bar | Treemap (hierarchical) | |
| Composition over time | Stacked area | 100% stacked bar (proportion focus) | |
| Distribution | Histogram | Box plot (group comparison), violin | |
| Correlation (2 vars) | Scatter | Bubble (3rd var as size) | |
| Correlation (many vars) | Heatmap | Pair plot | |
| Multiple KPIs | Small multiples | Dashboard with separate charts |
Avoid: Pie charts (humans compare angles poorly — use bar), 3D charts (distortion, zero information gain), dual-axis (implies false correlation).
Python Setup
Number Formatting
Design Principles
- Highlight the story: Bright accent for the key insight; grey everything else.
- Titles state insights: "Revenue grew 23% YoY" not "Revenue by Month." Subtitle adds date range and source.
- Sort by value, not alphabetically, unless natural order exists (months, funnel stages).
- Aspect ratio: Time series wider than tall (3:1 to 2:1); comparisons squarer.
- Bar charts start at zero. Line charts can use non-zero baselines when range matters.
- Consistent scales across panels when comparing multiple charts.
Accessibility
- Use
sns.color_palette("colorblind")as a colorblind-safe alternative. - Add pattern fills (
hatchin matplotlib) or distinct line styles alongside color. - Include alt text describing the key finding; provide data table alternative.
- Test: does the chart work in B&W? Text readable at standard zoom?
Gotchas
- Truncated y-axis exaggerates differences — A bar chart starting at 95 instead of 0 makes a 2% difference look like a 10x gap. Always start bar charts at zero.
- Sequential palettes hide categorical data — Using a gradient (light-to-dark) for unordered categories implies a ranking that doesn't exist. Use distinct hues for categorical, sequential for ordered.
- Legend order != data order — Matplotlib legend order matches plot call order, not the visual stack order in area/stacked charts. Reverse legend order or label directly on the chart.
- savefig cuts off labels — Default
plt.savefig()clips titles and axis labels. Always usebbox_inches='tight'. - Title and subtitle collide — Don't hand-position a subtitle with
fig.text(y=...)near afig.suptitle(y=...)— fontsize math is fragile and the inspect step rarely catches the collision. Useax.set_title("Headline\nsubtitle", loc='left')(matplotlib spaces\n-separated titles automatically), orplt.subplots(layout='constrained')withfig.suptitleand a separate small subtitleTextso spacing is computed for you. - Footer source/notes text — Long source/note strings passed directly to
fig.text(...)widen the entire figure (matplotlib expands to fit;wrap=Trueis unreliable withbbox_inches='tight'). Always wrap to a fixed width first:
``python import textwrap note = textwrap.fill("your long source string", 100) fig.text(0.01, -0.02, note, ha='left', va='top', fontsize=8) # negative y; bbox_inches='tight' pads it in ``
- Seaborn mutates global state —
sns.set_theme()changesrcParamsglobally. Reset withplt.rcdefaults()after use or scope changes withplt.rc_context().
Security
- Security scanPassed, 90 of 100Pattern checks on the skill's files.
- Model reviewPassed
Quality evaluation
- Task evaluationNot runNo evaluation yet. Run one in Skill Studio.
Source
- SKILL.md in the repositoryCheckingextensions/repl/ufo_ext_repl/skills/data-visualization/SKILL.md
Popularity
- 7-day trend score
- 0
Not refreshed yet.
Works with
Any agent vskill installs to: 56 targets in all. These 39 have a page on this site.
- Claude Code
- Cursor
- GitHub Copilot
- Windsurf
- Codex
- Gemini CLI
- Cline
- Amp
- Roo Code
- Goose
- Continue
- Kilo Code
- Junie
- Trae
- OpenHands
- Qwen Code
- AI Agent
- Tabnine Chat
- Sourcegraph Cody
- Amazon Q
- Firebase Genkit
- Sweep
- Devin
- Phind
- Mentat
- Claude Desktop
- Aider
- GPT Pilot
- Plandex
- bolt.new
- v0
- Replit Agent
- Anse
- TypingMind
- BetterChatGPT
- LibreChat
- Warp AI
- Pieces
- Fig AI
Embed badge
[](https://verified-skill.com/skills/ufo-ai/ufo-core/data-visualization)