CtrlK
BlogDocsLog inGet started
Tessl Logo

data-visualizer

Use this skill when the user wants to create charts, graphs, or dashboards from data — bar charts, line charts, scatter plots, heatmaps, or multi-panel dashboards.

64

Quality

76%

Does it follow best practices?

Run evals on this skill

Adds up to 20 points to the overall score

View guide

SecuritybySnyk

Passed

No findings from the security scan

Fix and improve this skill with Tessl

tessl review fix ./external/community/data-visualizer/SKILL.md
SKILL.md
Quality
Evals
Security

Data Visualizer

Overview

Generate publication-quality charts and interactive dashboards from data using matplotlib (static PNG/SVG) or Plotly (interactive HTML). Includes AI-powered chart type selection.

Chart Type Selector

import anthropic
import json

client = anthropic.Anthropic()

def recommend_chart_type(data_description: str, goal: str) -> dict:
    response = client.messages.create(
        model="claude-opus-4-6",
        max_tokens=256,
        tools=[{
            "name": "chart_recommendation",
            "description": "Recommend the best chart type",
            "input_schema": {
                "type": "object",
                "properties": {
                    "chart_type": {"type": "string", "enum": ["bar", "line", "scatter", "pie", "heatmap", "histogram", "box", "area"]},
                    "reason": {"type": "string"},
                    "x_axis": {"type": "string"},
                    "y_axis": {"type": "string"}
                },
                "required": ["chart_type", "reason"]
            }
        }],
        tool_choice={"type": "tool", "name": "chart_recommendation"},
        messages=[{"role": "user", "content": f"Data: {data_description}\nGoal: {goal}\nRecommend the best chart type."}],
    )
    for block in response.content:
        if block.type == "tool_use":
            return block.input
    return {"chart_type": "bar"}

Matplotlib Charts

import matplotlib.pyplot as plt
import matplotlib.style as mplstyle
import pandas as pd
from pathlib import Path

mplstyle.use('seaborn-v0_8-whitegrid')
COLORS = ["#2563EB", "#10B981", "#F59E0B", "#EF4444", "#8B5CF6"]

def bar_chart(data: dict, title: str, xlabel: str, ylabel: str,
              output_path: str = "chart.png") -> str:
    fig, ax = plt.subplots(figsize=(10, 6))
    bars = ax.bar(data.keys(), data.values(), color=COLORS[:len(data)])

    # Add value labels on bars
    for bar in bars:
        ax.text(bar.get_x() + bar.get_width()/2., bar.get_height(),
                f'{bar.get_height():.1f}', ha='center', va='bottom', fontsize=10)

    ax.set_title(title, fontsize=14, fontweight='bold', pad=15)
    ax.set_xlabel(xlabel, fontsize=11)
    ax.set_ylabel(ylabel, fontsize=11)
    plt.tight_layout()
    plt.savefig(output_path, dpi=150, bbox_inches='tight')
    plt.close()
    return output_path

def line_chart(df: pd.DataFrame, x_col: str, y_cols: list[str],
               title: str, output_path: str = "chart.png") -> str:
    fig, ax = plt.subplots(figsize=(12, 6))
    for i, col in enumerate(y_cols):
        ax.plot(df[x_col], df[col], label=col, color=COLORS[i % len(COLORS)], linewidth=2)

    ax.set_title(title, fontsize=14, fontweight='bold')
    ax.legend()
    plt.tight_layout()
    plt.savefig(output_path, dpi=150, bbox_inches='tight')
    plt.close()
    return output_path

Interactive Plotly Dashboard

import plotly.graph_objects as go
from plotly.subplots import make_subplots

def create_dashboard(metrics: dict, title: str, output_path: str = "dashboard.html") -> str:
    """Create a multi-panel interactive dashboard."""
    n = len(metrics)
    cols = min(n, 2)
    rows = (n + cols - 1) // cols

    fig = make_subplots(rows=rows, cols=cols,
                         subplot_titles=list(metrics.keys()))

    for i, (metric_name, data) in enumerate(metrics.items()):
        row = i // cols + 1
        col = i % cols + 1
        fig.add_trace(
            go.Scatter(x=list(range(len(data))), y=data,
                       name=metric_name, mode='lines+markers'),
            row=row, col=col
        )

    fig.update_layout(
        title_text=title,
        height=400 * rows,
        showlegend=False,
    )
    fig.write_html(output_path)
    return output_path

Quick Reference

ChartFunctionLibrary
Bar chartbar_chart(data, ...)matplotlib
Line chartline_chart(df, ...)matplotlib
Dashboardcreate_dashboard(metrics, ...)plotly
Heatmappx.imshow(df)plotly express
Histogramax.hist(data, bins=30)matplotlib
Repository
ProwlrBot/prowlr-marketplace
Last updated
First committed

Is this your skill?

If you maintain this skill, you can claim it as your own. Once claimed, you can manage eval scenarios, bundle related skills, attach documentation or rules, and ensure cross-agent compatibility.