mcpField
D
data-visualization

data-visualization

github.com/seb1n数据与数据库236161 次安装12 周前更新
代码仓库

关于 data-visualization

data-visualization 是将结构化数据转化为图表的 AI Agent 技能,根据分析问题选择图表类型,并生成静态或交互式可视化。适用于需要探索数据、制作报告或构建仪表板的场景。

主要功能

  1. 01依据分析问题选择图表
  2. 02使用 matplotlib 和 seaborn 制作静态图表
  3. 03使用 plotly 创建交互式图表
  4. 04整理数据以适配绘图
  5. 05添加标签、图例和注释
  6. 06导出 PNG、SVG 或 HTML

适用场景

  1. 01比较不同类别的数据
  2. 02呈现时间序列趋势
  3. 03探索变量间关系或数据分布
  4. 04制作报告图表或交互式仪表板

安装

复制下面的命令,在终端中运行。

$npx skills add https://github.com/seb1n/awesome-ai-agent-skills --skill data-visualization

安装后在 Claude Code 中输入/data-visualization确认已加载。

详细介绍

数据可视化

此技能使 AI Agent 能将结构化数据转换为有意义的可视化表示。Agent 会根据数据和所提出的问题选择合适的图表类型,使用 matplotlib 和 seaborn 绘制达到出版质量的静态图表,并使用 plotly 创建交互式可视化。此技能遵循成熟的数据可视化原则,确保图表清晰、准确且美观。

工作流

  1. 了解数据和问题。 检查数据集的结构——变量数量、类型(数值型、类别型、时间型),以及用户希望突出显示的关系或比较。与单看数据相比,问题对图表选择的影响更大。

  2. 选择合适的图表类型。 根据分析目标选择恰当的可视化形式。类别比较使用条形图,展示时间趋势使用折线图,展示两个连续变量之间的关系使用散点图,展示分布使用直方图,展示离散程度和异常值使用箱线图,展示相关矩阵或密集类别网格使用热力图。

  3. 准备绘图数据。 根据需要对数据进行汇总、透视或重塑。绘制条形图时,按数值对类别轴排序。将时间序列重采样到合适的粒度。确保没有 NaN 值进入图表,以免产生空隙或错误。

  4. 使用合适的样式创建可视化。 使用统一的调色板、易读的坐标轴标签、描述性标题和恰当的图例。移除图表杂项——不必要的网格线、边框和装饰。根据预期的输出媒介(报告、幻灯片、仪表板)设置合适的图形尺寸。

  5. 添加背景信息和注释。 使用注释、参考线或阴影区域突出关键数据点。在有帮助的情况下,直接在图表中添加汇总统计信息(例如,箱线图上的中位数线、散点图上的趋势线)。背景信息能让图表从装饰变成分析工具。

  6. 导出或显示。 将静态图表保存为 PNG 或 SVG,以用于报告;也可以渲染交互式 HTML,用于仪表板和探索。将 DPI 设置为 150 以上,以获得适合打印的输出质量。

支持的技术

  • matplotlib — 基础绘图库,可全面控制每个视觉元素
  • seaborn — 具有合理默认设置和内置主题的统计可视化库
  • plotly — 支持悬停提示、缩放和平移的交互式图表
  • plotly.express — 简洁的 API,可快速创建交互式图表
何时使用哪种图表类型
目标图表类型库
比较类别条形图(垂直或水平)matplotlib, seaborn
展示时间趋势折线图matplotlib, plotly
探索 2 个变量之间的关系散点图seaborn, plotly
展示变量的分布直方图或 KDEseaborn
比较不同组的分布箱线图或小提琴图seaborn
展示相关矩阵热力图seaborn
展示构成/比例堆叠条形图或饼图matplotlib
支持用户探索交互式图表plotly

用法

向 Agent 提供数据集,并描述你希望可视化的内容。也可以指定图表类型、颜色偏好、输出格式和图形尺寸。如果未指定图表类型,Agent 将选择最佳方案。

示例

示例 1:使用 matplotlib 和 seaborn 创建销售仪表板
import pandas as pd
import matplotlib.pyplot as plt
import seaborn as sns

df = pd.read_csv("quarterly_sales.csv", parse_dates=["date"])
sns.set_theme(style="whitegrid", palette="viridis")

fig, axes = plt.subplots(2, 2, figsize=(14, 10))
fig.suptitle("Q4 2024 Sales Dashboard", fontsize=16, fontweight="bold")

# 1. Monthly revenue trend
monthly = df.resample("M", on="date")["revenue"].sum()
axes[0, 0].plot(monthly.index, monthly.values, marker="o", linewidth=2)
axes[0, 0].set_title("Monthly Revenue Trend")
axes[0, 0].set_ylabel("Revenue ($)")
axes[0, 0].tick_params(axis="x", rotation=45)

# 2. Revenue by region (horizontal bar)
region = df.groupby("region")["revenue"].sum().sort_values()
axes[0, 1].barh(region.index, region.values, color=sns.color_palette("viridis", len(region)))
axes[0, 1].set_title("Revenue by Region")
axes[0, 1].set_xlabel("Total Revenue ($)")

# 3. Units sold distribution (histogram)
axes[1, 0].hist(df["units_sold"], bins=30, edgecolor="white", alpha=0.8)
axes[1, 0].axvline(df["units_sold"].median(), color="red", linestyle="--", label="Median")
axes[1, 0].set_title("Units Sold Distribution")
axes[1, 0].legend()

# 4. Revenue vs. discount scatter with regression
sns.regplot(data=df, x="discount", y="revenue", ax=axes[1, 1],
            scatter_kws={"alpha": 0.4, "s": 15}, line_kws={"color": "red"})
axes[1, 1].set_title("Revenue vs. Discount")

plt.tight_layout()
plt.savefig("sales_dashboard.png", dpi=150, bbox_inches="tight")
plt.show()
示例 2:使用 plotly 创建交互式可视化
import pandas as pd
import plotly.express as px

df = pd.read_csv("global_sales.csv")

# Interactive scatter with size, color, and hover data
fig = px.scatter(
    df,
    x="marketing_spend",
    y="revenue",
    size="units_sold",
    color="region",
    hover_data=["product_name", "quarter"],
    title="Marketing Spend vs Revenue by Region",
    labels={
        "marketing_spend": "Marketing Spend ($)",
        "revenue": "Revenue ($)",
        "units_sold": "Units Sold"
    },
    template="plotly_white"
)

fig.update_traces(marker=dict(opacity=0.7, line=dict(width=1, color="DarkSlateGrey")))

# Add a trend line annotation
fig.add_annotation(
    x=45000, y=320000,
    text="Strong ROI cluster:<br>low spend, high revenue",
    showarrow=True, arrowhead=2,
    font=dict(size=12, color="darkblue")
)

fig.write_html("interactive_scatter.html")
fig.show()
# Users can hover over points to see product_name and quarter,
# zoom into clusters, and toggle regions on/off via the legend.

最佳实践

  • 根据分析问题选择图表类型,而非只看美观程度——如果问题关注相关性,那么即使散点图未能揭示任何模式,它仍然是合适的选择。
  • 将颜色类别限制在 7 个以内;超过此数量时,应使用分面或小图,而不是把更多颜色塞进同一个图例。
  • 始终为坐标轴标注单位,并采用便于阅读的数字格式(例如,“$1.2M”,而不是“1200000”)。
  • 柱状图的 y 轴应从零开始,以免夸大差异;如果重点是变化而非绝对值,折线图可以使用截断坐标轴。
  • 默认使用适合色觉障碍者的调色板(viridis、cividis 或 ColorBrewer 定性配色方案)。
  • 任何将用于文档或演示文稿的图表,导出分辨率应达到 150 DPI 或更高。

边缘情况

  • 单张图表类别过多。 如果柱状图的柱子超过 15 根,应仅显示前 N 项,并将其余项汇总为“其他”类别,或改用树状图。
  • 散点图中的点重叠。 当数千个点重叠时,使用透明度(alpha=0.3)、抖动或六边形分箱/二维密度图。
  • 坐标轴标签过长。 将标签旋转 45 度、用省略号截断,或改用横向柱状图,以确保文本清晰易读。
  • 缺失值导致折线图出现间断。 对较小的间断(1-2 个点)进行线性插值,并用虚线段标出。对于较大的间断,应断开折线,避免暗示数据连续。
  • 数据极度偏斜。 使用对数刻度坐标轴,并在坐标轴标签中清楚注明转换方式(例如,“收入(对数刻度)”)。

评论

支持 Markdown