Install any skill in seconds. Free to start, no credit card required.
Get Started Free →Generate charts: select type, extract data, render image.
.claude/skills/hezaohezao-chart-visualization/SKILL.md| Test case | Without → With | Effect | Δ tokens | Δ turns |
|---|---|---|---|---|
| case-04 | ✗→✓ | ▲ Improved | 50% | 0% |
| case-05 | ✗→✓ | ▲ Improved | 9% | 0% |
| case-24 | ✓→✗ | ▼ Worse | 67% | 0% |
| case-06 | ✓→✓ | = Same ✓ | -10% | 0% |
| case-07 | ✓→✓ | = Same ✓ | 31% | 0% |
Transform data into visual charts. Intelligently select the most suitable chart type, extract parameters, and generate a chart image.
> Poirot note: The original deer-flow skill uses a bundled > scripts/generate.js (Node.js + charting library). Poirot doesn't bundle > that script. Use bash with Python (matplotlib/plotly) as the rendering > engine instead. Install: pip install matplotlib plotly.
| Data Pattern | Recommended Chart | When | |---|---|---| | Time Series | Line / Area | Trends over time | | Comparisons | Bar / Column | Categorical comparison | | Distribution | Histogram / Boxplot | Frequency distribution | | Part-to-Whole | Pie / Treemap | Proportions | | Relationships | Scatter | Correlation | | Flow | Sankey | Flow between stages | | Multi-dimensional | Radar | Compare across dimensions | | Process | Funnel | Stage conversion | | Hierarchy | Org chart / Mind map | Tree structure | | Geographic | Map | Spatial data |
Analyze the user's data features:
Extract data from user input, format as Python data structure:
pythondata = { "labels": ["Jan", "Feb", "Mar", "Apr", "May"], "values": [120, 150, 180, 200, 220], "title": "Monthly Revenue", "xlabel": "Month", "ylabel": "Revenue ($K)" }
bashpython3 -c " import matplotlib matplotlib.use('Agg') # non-interactive backend import matplotlib.pyplot as plt labels = ['Jan', 'Feb', 'Mar', 'Apr', 'May'] values = [120, 150, 180, 200, 220] fig, ax = plt.subplots(figsize=(10, 6)) ax.plot(labels, values, marker='o', linewidth=2, markersize=8) ax.set_title('Monthly Revenue', fontsize=16, fontweight='bold') ax.set_xlabel('Month', fontsize=12) ax.set_ylabel('Revenue ($K)', fontsize=12) ax.grid(True, alpha=0.3) plt.tight_layout() plt.savefig('.poirot/outputs/chart.png', dpi=150, bbox_inches='tight') print('Saved to .poirot/outputs/chart.png') "
bash# Bar chart python3 -c " import matplotlib; matplotlib.use('Agg') import matplotlib.pyplot as plt cats = ['A', 'B', 'C', 'D'] vals = [23, 45, 12, 67] plt.bar(cats, vals, color=['#4CAF50', '#2196F3', '#FF9800', '#F44336']) plt.title('Category Comparison') plt.savefig('.poirot/outputs/bar.png', dpi=150) " # Scatter plot python3 -c " import matplotlib; matplotlib.use('Agg') import matplotlib.pyplot as plt import numpy as np x = np.random.randn(100) y = x * 0.8 + np.random.randn(100) * 0.5 plt.scatter(x, y, alpha=0.6, c='steelblue') plt.title('Correlation Scatter') plt.savefig('.poirot/outputs/scatter.png', dpi=150) " # Pie chart python3 -c " import matplotlib; matplotlib.use('Agg') import matplotlib.pyplot as plt labels = ['Product A', 'Product B', 'Product C'] sizes = [45, 35, 20] plt.pie(sizes, labels=labels, autopct='%1.1f%%', startangle=90) plt.title('Market Share') plt.savefig('.poirot/outputs/pie.png', dpi=150) "
matplotlib.use('Agg') for non-interactive(headless) rendering. Without it, matplotlib may try to open a GUI window.
plt.rcParams['font.sans-serif'] = ['SimHei', 'Arial Unicode MS']
dpi=150 for crisp images. dpi=300 for print quality.plt.savefig('chart.svg')).| Case | Status | Duration (ms) | Turns | Tokens | Tool calls | ||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| Without | With | Δ | Without | With | Δ | Without | With | Δ | Without | With | Δ | ||
case-01 | fail→fail | 21,636 | 19,442 | -10% | 1 | 1 | 0% | 3,705 | 2,185 | -41% | 0 | 0 | — |
case-02 | fail→fail | 16,067 | 55,906 | +248% | 1 | 1 | 0% | 2,747 | 2,518 | -8% | 0 | 0 | — |
case-03 | fail→fail | 19,592 | 15,472 | -21% | 1 | 1 | 0% | 4,542 | 2,009 | -56% | 0 | 0 | — |
case-04 | fail→pass | 10,592 | 9,951 | -6% | 1 | 1 | 0% | 2,081 | 3,119 | +50% | 0 | 0 | — |
case-05 | fail→pass | 13,374 | 7,769 | -42% | 1 | 1 | 0% | 2,402 | 2,612 | +9% | 0 | 0 | — |
case-06 | pass→pass | 12,236 | 4,197 | -66% | 1 | 1 | 0% | 2,040 | 1,835 | -10% | 0 | 0 | — |
case-07 | pass→pass | 8,585 | 7,644 | -11% | 1 | 1 | 0% | 1,297 | 1,703 | +31% | 0 | 0 | — |
case-08 | pass→pass | 13,868 | 19,794 | +43% | 1 | 1 | 0% | 2,295 | 2,439 | +6% | 0 | 0 | — |
case-09 | pass→pass | 8,058 | 8,173 | +1% | 1 | 1 | 0% | 1,201 | 2,580 | +115% | 0 | 0 | — |
case-10 | pass→pass | 14,518 | 13,802 | -5% | 1 | 1 | 0% | 1,151 | 3,550 | +208% | 0 | 0 | — |
case-11 | pass→pass | 7,526 | 20,602 | +174% | 1 | 1 | 0% | 1,164 | 2,682 | +130% | 0 | 0 | — |
case-12 | pass→pass | 5,765 | 6,848 | +19% | 1 | 1 | 0% | 841 | 2,438 | +190% | 0 | 0 | — |
case-13 | pass→pass | 10,669 | 28,719 | +169% | 1 | 1 | 0% | 1,396 | 2,632 | +89% | 0 | 0 | — |
case-14 | pass→pass | 11,674 | 7,310 | -37% | 1 | 1 | 0% | 1,694 | 2,261 | +33% | 0 | 0 | — |
case-15 | pass→pass | 14,948 | 18,541 | +24% | 1 | 1 | 0% | 2,301 | 4,185 | +82% | 0 | 0 | — |
case-16 | pass→pass | 25,036 | 12,333 | -51% | 1 | 1 | 0% | 1,878 | 3,284 | +75% | 0 | 0 | — |
case-17 | pass→pass | 7,927 | 6,282 | -21% | 1 | 1 | 0% | 1,262 | 2,047 | +62% | 0 | 0 | — |
case-18 | pass→pass | 9,806 | 8,586 | -12% | 1 | 1 | 0% | 1,470 | 2,247 | +53% | 0 | 0 | — |
case-19 | pass→pass | 14,840 | 7,622 | -49% | 1 | 1 | 0% | 3,200 | 2,843 | -11% | 0 | 0 | — |
case-20 | pass→pass | 19,741 | 21,644 | +10% | 1 | 1 | 0% | 4,356 | 5,912 | +36% | 0 | 0 | — |
case-21 | pass→pass | 6,247 | 5,749 | -8% | 1 | 1 | 0% | 945 | 2,225 | +135% | 0 | 0 | — |
case-22 | pass→pass | 22,311 | 32,376 | +45% | 1 | 1 | 0% | 4,114 | 6,062 | +47% | 0 | 0 | — |
case-23 | pass→pass | 9,650 | 9,714 | +1% | 1 | 1 | 0% | 1,281 | 2,903 | +127% | 0 | 0 | — |
case-24 | pass→fail | 7,240 | 3,929 | -46% | 1 | 1 | 0% | 1,125 | 1,878 | +67% | 0 | 0 | — |
DecimalAI ran this skill against gemini-3.6-flash twice over the same eval suite — once with the skill loaded and once without — and compared the two runs case by case. 24 cases were attempted, and 21 counted toward the lift figure. The other 3 produced results that are not comparable between the two arms, so they are excluded from the headline rather than averaged into it. The headline lift of +4 percentage points is the difference between those two pass rates over the 21 comparable cases. 4 cases got worse with the skill loaded, and they are included in that figure.
Without the skill loaded, the model failed this case. With it loaded, the same prompt on the same model passed. This is one improved case from the latest verified run; every case, including any that regressed, is in the table above.
Other measured skills in the registry, with their headline benchmark lift.