mcpField
D
data-visualization

data-visualization

github.com/qu-skills数据与数据库442 次安装12 周前更新
代码仓库

关于 data-visualization

这是一个通过 inference.sh 的 belt 命令行创建数据可视化的技能,面向需要将数据转为清晰图表的人。它提供图表选择与设计建议,并附有 Python 图表示例。

主要功能

  1. 01按数据关系选择图表
  2. 02坐标轴、颜色与标签建议
  3. 03常见图表的 Python 示例
  4. 04标题与注释指导
  5. 05深色模式图表示例

适用场景

  1. 01为数据集选择图表类型
  2. 02创建时间序列或比较图表
  3. 03制作 KPI 卡片或热力图
  4. 04提升图表的可读性与准确性

安装

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

$npx skills add https://github.com/qu-skills/superpowers --skill data-visualization

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

详细介绍

安装 belt CLI 技能: npx skills add belt-sh/cli

数据可视化

通过 inference.sh CLI 创建清晰、有效的数据可视化。

快速开始

需要 inference.sh CLI(belt)。安装说明

belt login

# Generate a chart with Python
belt app run infsh/python-executor --input '{
  "code": "import matplotlib.pyplot as plt\nimport matplotlib\nmatplotlib.use(\"Agg\")\n\nmonths = [\"Jan\", \"Feb\", \"Mar\", \"Apr\", \"May\", \"Jun\"]\nrevenue = [42, 48, 55, 61, 72, 89]\n\nfig, ax = plt.subplots(figsize=(10, 6))\nax.bar(months, revenue, color=\"#3b82f6\", width=0.6)\nax.set_ylabel(\"Revenue ($K)\")\nax.set_title(\"Monthly Revenue Growth\", fontweight=\"bold\")\nfor i, v in enumerate(revenue):\n    ax.text(i, v + 1, f\"${v}K\", ha=\"center\", fontweight=\"bold\")\nplt.tight_layout()\nplt.savefig(\"revenue.png\", dpi=150)\nprint(\"Saved\")"
}'

图表选择指南

不同数据适合哪种图表?
数据关系最佳图表切勿使用
随时间变化折线图饼图
比较类别条形图(类别较多时使用横向条形图)折线图
整体中的部分堆叠条形图、矩形树图饼图(虽有争议,但条形图始终更清晰)
分布直方图、箱线图条形图
相关性散点图条形图
排名横向条形图纵向条形图、饼图
地理数据分级统计地图条形图
随时间变化的构成堆叠面积图多个饼图
单个指标大数字(KPI 卡片)任何图表(过度设计)
流向 / 流程桑基图条形图
饼图的问题

饼图几乎总是错误的选择:

❌ Pie chart problems:
   - Hard to compare similar-sized slices
   - Can't show more than 5-6 categories
   - 3D pie charts are always wrong
   - Impossible to read exact values

✅ Use instead:
   - Horizontal bar chart (easy comparison)
   - Stacked bar (part of whole)
   - Treemap (hierarchical parts)
   - Just a table (if precision matters)

设计规则

坐标轴
规则原因
Y 轴始终从 0 开始(条形图)避免造成误导
折线图可以从高于 0 的位置开始展示变化而非绝对值时
标注两个坐标轴读者不应需要猜测单位
删除不必要的网格线减少视觉杂乱
使用水平标签竖排文字难以阅读
按数值排序条形图除非有特殊原因,否则不要按字母顺序排列
颜色
原则应用
每张图表最多使用 5-7 种颜色更多颜色会难以辨读
突出一项内容其他内容全部用灰色,聚焦项使用颜色
表示大小时使用顺序色低值使用浅色 → 高值使用深色
表示正负值时使用发散色红色 ← 中性色 → 蓝色
表示分组时使用分类色色相有区别,亮度相近
色盲友好不要只用红色 / 绿色——增加形状或标签
含义一致如果蓝色代表收入,就始终用蓝色表示
好用的调色板
# Sequential (low to high)
sequential = ["#eff6ff", "#bfdbfe", "#60a5fa", "#2563eb", "#1d4ed8"]

# Diverging (negative to positive)
diverging = ["#ef4444", "#f87171", "#d1d5db", "#34d399", "#10b981"]

# Categorical (distinct groups)
categorical = ["#3b82f6", "#f59e0b", "#10b981", "#8b5cf6", "#ef4444"]

# Colorblind-safe
cb_safe = ["#0077BB", "#33BBEE", "#009988", "#EE7733", "#CC3311"]
文本和标签
元素规则
标题陈述洞见,而非数据类型。“第二季度收入翻倍”,而不是“第二季度收入图表”
注释直接在图表上标出关键数据点
图例尽量避免——直接在图表的线条 / 条形上标注
字号至少 12px,演示文稿中使用 14px 以上
数字格式大数字使用 K、M、B(用 42K,而不是 42,000)
数据标签需要精确数值时,在条形 / 数据点上添加标签

图表示例

折线图(时间序列)
belt app run infsh/python-executor --input '{
  "code": "import matplotlib.pyplot as plt\nimport matplotlib\nmatplotlib.use(\"Agg\")\n\nfig, ax = plt.subplots(figsize=(12, 6))\nfig.patch.set_facecolor(\"white\")\n\nmonths = [\"Jan\", \"Feb\", \"Mar\", \"Apr\", \"May\", \"Jun\", \"Jul\", \"Aug\", \"Sep\", \"Oct\", \"Nov\", \"Dec\"]\nthis_year = [120, 135, 148, 162, 178, 195, 210, 228, 245, 268, 290, 320]\nlast_year = [95, 102, 108, 115, 122, 130, 138, 145, 155, 165, 178, 190]\n\nax.plot(months, this_year, color=\"#3b82f6\", linewidth=2.5, marker=\"o\", markersize=6, label=\"2024\")\nax.plot(months, last_year, color=\"#94a3b8\", linewidth=2, linestyle=\"--\", label=\"2023\")\nax.fill_between(range(len(months)), last_year, this_year, alpha=0.1, color=\"#3b82f6\")\n\nax.annotate(\"$320K\", xy=(11, 320), fontsize=14, fontweight=\"bold\", color=\"#3b82f6\")\nax.annotate(\"$190K\", xy=(11, 190), fontsize=12, color=\"#94a3b8\")\n\nax.set_ylabel(\"Revenue ($K)\", fontsize=12)\nax.set_title(\"Revenue grew 68% year-over-year\", fontsize=16, fontweight=\"bold\")\nax.legend(fontsize=12)\nax.spines[\"top\"].set_visible(False)\nax.spines[\"right\"].set_visible(False)\nax.grid(axis=\"y\", alpha=0.3)\nplt.tight_layout()\nplt.savefig(\"line-chart.png\", dpi=150)\nprint(\"Saved\")"
}'
横向条形图(比较)
belt app run infsh/python-executor --input '{
  "code": "import matplotlib.pyplot as plt\nimport matplotlib\nmatplotlib.use(\"Agg\")\n\nfig, ax = plt.subplots(figsize=(10, 6))\n\ncategories = [\"Email\", \"Social\", \"SEO\", \"Paid Ads\", \"Referral\", \"Direct\"]\nvalues = [12, 18, 35, 22, 8, 5]\ncolors = [\"#94a3b8\"] * len(values)\ncolors[2] = \"#3b82f6\"  # Highlight the winner\n\n# Sort by value\nsorted_pairs = sorted(zip(values, categories, colors))\nvalues, categories, colors = zip(*sorted_pairs)\n\nax.barh(categories, values, color=colors, height=0.6)\nfor i, v in enumerate(values):\n    ax.text(v + 0.5, i, f\"{v}%\", va=\"center\", fontsize=12, fontweight=\"bold\")\n\nax.set_xlabel(\"% of Total Traffic\", fontsize=12)\nax.set_title(\"SEO drives the most traffic\", fontsize=16, fontweight=\"bold\")\nax.spines[\"top\"].set_visible(False)\nax.spines[\"right\"].set_visible(False)\nplt.tight_layout()\nplt.savefig(\"bar-chart.png\", dpi=150)\nprint(\"Saved\")"
}'
KPI / 大数字卡片
belt app run infsh/html-to-image --input '{
  "html": "<div style=\"display:flex;gap:20px;padding:20px;background:white;font-family:system-ui\"><div style=\"background:#f8fafc;border:1px solid #e2e8f0;border-radius:12px;padding:24px;width:200px;text-align:center\"><p style=\"color:#64748b;font-size:14px;margin:0\">Monthly Revenue</p><p style=\"font-size:48px;font-weight:900;margin:8px 0;color:#1e293b\">$89K</p><p style=\"color:#22c55e;font-size:14px;margin:0\">↑ 23% vs last month</p></div><div style=\"background:#f8fafc;border:1px solid #e2e8f0;border-radius:12px;padding:24px;width:200px;text-align:center\"><p style=\"color:#64748b;font-size:14px;margin:0\">Active Users</p><p style=\"font-size:48px;font-weight:900;margin:8px 0;color:#1e293b\">12.4K</p><p style=\"color:#22c55e;font-size:14px;margin:0\">↑ 8% vs last month</p></div><div style=\"background:#f8fafc;border:1px solid #e2e8f0;border-radius:12px;padding:24px;width:200px;text-align:center\"><p style=\"color:#64748b;font-size:14px;margin:0\">Churn Rate</p><p style=\"font-size:48px;font-weight:900;margin:8px 0;color:#1e293b\">2.1%</p><p style=\"color:#ef4444;font-size:14px;margin:0\">↑ 0.3% vs last month</p></div></div>"
}'
热力图
belt app run infsh/python-executor --input '{
  "code": "import matplotlib.pyplot as plt\nimport numpy as np\nimport matplotlib\nmatplotlib.use(\"Agg\")\n\nfig, ax = plt.subplots(figsize=(10, 6))\n\ndays = [\"Mon\", \"Tue\", \"Wed\", \"Thu\", \"Fri\", \"Sat\", \"Sun\"]\nhours = [\"9AM\", \"10AM\", \"11AM\", \"12PM\", \"1PM\", \"2PM\", \"3PM\", \"4PM\", \"5PM\"]\ndata = np.random.randint(10, 100, size=(len(hours), len(days)))\ndata[2][1] = 95  # Tuesday 11AM peak\ndata[2][3] = 88  # Thursday 11AM\n\nim = ax.imshow(data, cmap=\"Blues\", aspect=\"auto\")\nax.set_xticks(range(len(days)))\nax.set_yticks(range(len(hours)))\nax.set_xticklabels(days, fontsize=12)\nax.set_yticklabels(hours, fontsize=12)\n\nfor i in range(len(hours)):\n    for j in range(len(days)):\n        color = \"white\" if data[i][j] > 60 else \"black\"\n        ax.text(j, i, data[i][j], ha=\"center\", va=\"center\", fontsize=10, color=color)\n\nax.set_title(\"Website Traffic by Day & Hour\", fontsize=16, fontweight=\"bold\")\nplt.colorbar(im, label=\"Visitors\")\nplt.tight_layout()\nplt.savefig(\"heatmap.png\", dpi=150)\nprint(\"Saved\")"
}'

用数据讲故事

叙事弧线
步骤操作示例
1. 背景说明读者需要了解的信息“我们每月跟踪客户获取成本”
2. 冲突展示问题或变化“第三季度 CAC 增加了 40%”
3. 解决展示洞见或解决方案“但 LTV 增加了 80%,因此单位经济效益有所改善”
让标题体现洞见
❌ Descriptive titles (what the chart shows):
   "Q3 Revenue by Product Line"
   "Monthly Active Users 2024"
   "Customer Satisfaction Survey Results"

✅ Insight titles (what the chart means):
   "Enterprise product drives 70% of revenue growth"
   "User growth accelerated after the free tier launch"
   "Support response time is the #1 satisfaction driver"
注释技巧
技巧适用情况
标注突出特定数据点(“峰值:320K”)
参考线显示目标 / 基准(“目标:100K”)
阴影区域标记某个时间段(“产品发布窗口期”)
箭头 + 文本引起对趋势变化的关注
前后对比线展示某个事件的影响

深色模式图表

belt app run infsh/python-executor --input '{
  "code": "import matplotlib.pyplot as plt\nimport matplotlib\nmatplotlib.use(\"Agg\")\n\n# Dark theme\nplt.rcParams.update({\n    \"figure.facecolor\": \"#0f172a\",\n    \"axes.facecolor\": \"#0f172a\",\n    \"axes.edgecolor\": \"#334155\",\n    \"axes.labelcolor\": \"white\",\n    \"text.color\": \"white\",\n    \"xtick.color\": \"white\",\n    \"ytick.color\": \"white\",\n    \"grid.color\": \"#1e293b\"\n})\n\nfig, ax = plt.subplots(figsize=(12, 6))\nmonths = [\"Jan\", \"Feb\", \"Mar\", \"Apr\", \"May\", \"Jun\"]\nvalues = [45, 52, 58, 72, 85, 98]\n\nax.plot(months, values, color=\"#818cf8\", linewidth=3, marker=\"o\", markersize=8)\nax.fill_between(range(len(months)), values, alpha=0.15, color=\"#818cf8\")\nax.set_title(\"MRR Growth: On track for $100K\", fontsize=18, fontweight=\"bold\")\nax.set_ylabel(\"MRR ($K)\", fontsize=13)\nax.spines[\"top\"].set_visible(False)\nax.spines[\"right\"].set_visible(False)\nax.grid(axis=\"y\", alpha=0.2)\n\nfor i, v in enumerate(values):\n    ax.annotate(f\"${v}K\", (i, v), textcoords=\"offset points\", xytext=(0, 12), ha=\"center\", fontsize=11, fontweight=\"bold\")\n\nplt.tight_layout()\nplt.savefig(\"dark-chart.png\", dpi=150, facecolor=\"#0f172a\")\nprint(\"Saved\")"
}'

常见错误

错误问题修正方法
饼图难以比较,而且总是会误导读者使用条形图或树状图
条形图的 Y 轴未从 0 开始夸大差异条形图从 0 开始;折线图可以截断
颜色过多造成视觉干扰,令人困惑最多使用 5-7 种颜色,只突出重要内容
没有标题或标题过于笼统读者不知道要传达什么信息标题应概括结论,而非数据类型
3D 图表扭曲数据,显得不专业始终使用 2D 图表
双 Y 轴容易误导,难以阅读使用两张独立的图表
条形图按字母顺序排序掩盖数据背后的信息按数值排序(从大到小)
坐标轴没有标签读者无法解读始终标注单位
图表垃圾(装饰性元素)分散对数据的注意力删除所有不传达信息的内容
仅用红色和绿色进行颜色编码色盲用户无法阅读使用形状、图案或色盲友好型配色方案

相关技能

npx skills add inference-sh/skills@pitch-deck-visuals
npx skills add inference-sh/skills@technical-blog-writing
npx skills add inference-sh/skills@competitor-teardown

浏览所有应用:belt app list

评论

支持 Markdown