mcpField
A
antv-gpt-vis

antv-gpt-vis

github.com/antvis数据与数据库51685 次安装5 周前更新
代码仓库

关于 antv-gpt-vis

GPT-Vis Chart Visualization Skill 指导 LLM 根据意图和数据选择图表,并生成配置或可运行代码。它涵盖 26 种图表类型,支持语法、JSON 和代码输出模式。

主要功能

  1. 01支持 26 种图表类型
  2. 02依据意图和数据选择图表
  3. 03生成语法和 JSON 配置
  4. 04生成适合流式输出的语法
  5. 05生成可运行代码

适用场景

  1. 01根据数据生成图表配置
  2. 02为 LLM 应用生成流式图表语法
  3. 03创建可运行的可视化代码
  4. 04为数据比较选择图表

安装

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

$npx skills add https://github.com/antvis/chart-visualization-skills --skill antv-gpt-vis

安装后在 Claude Code 中输入/antv-gpt-vis确认已加载。

附带文件references/summary.md

详细介绍

GPT-Vis 图表可视化技能

GPT-Vis 是一款面向大模型时代的 AI 原生可视化库。它采用与框架无关的架构,支持 26 种图表类型,并通过简单、自然的语法,让大模型轻松生成高质量的可视化内容。

步骤

  1. 识别意图:根据用户意图和数据特征选择图表类型
  2. 确定输出模式:根据上下文选择语法模式或代码模式
  3. 生成输出:按所选模式生成内容

支持的图表类型

类型值使用场景
line时间序列趋势
area时间序列趋势和总量
column分类数据对比
bar分类数据对比(标签较长时)
pie部分与整体的占比
scatter两个变量之间的关系
dual-axes不同量级数据的对比
histogram连续值的频率分布
boxplot数据分布和异常值
violin数据分布密度
radar多维度对比
funnel流程转化率
waterfall累计增减
liquid百分比 / 进度
word-cloud词频展示
venn集合交集 / 并集关系
treemap层级数据占比
sankey数量的流向和流量
flow-diagram流程步骤
mindmap层级化知识组织
indented-tree树节点层级 / 目录
network-graph实体之间的关系
organization-chart组织层级
fishbone-diagram根因分析
table表格数据展示
summary内容摘要

输出模式

模式 1:语法模式(Syntax / JSON)

适用于大模型应用集成场景。生成由 GPTVis.render() 使用的图表配置。支持两种格式:

  • 语法格式:类似 Markdown 的缩进语法,适合流式输出(大模型生成 token 时实时渲染)
  • JSON 格式:标准 JSON 对象,适合结构化 API 调用

两种格式等效,可直接传递给 GPTVis.render()。

模式 2:代码模式

适用于用户需要完整可运行代码的场景。生成包含安装说明和完整代码的输出。

GPTVis API

GPTVis 是该库的统一入口类,负责创建、渲染和销毁图表。

构造函数
new GPTVis(options: VisualizationOptions)

VisualizationOptions:

参数类型必填默认值描述
containerstring | HTMLElement是—CSS 选择器或 DOM 元素
widthnumber否—图表宽度(px)
heightnumber否—图表高度(px)
theme'default' | 'light' | 'dark' | 'academy'否'light'主题
wrapperboolean否false是否显示外层 UI 容器(标签页、下载、复制)
localestring否'zh-CN'wrapper 内文本的语言
方法
render(config: string | object): void

渲染图表。接受两种输入:

  • 语法字符串:以 vis [type] 开头的文本,会自动解析为配置对象
  • JSON 配置对象:包含 type 字段的对象
  • 纯文本:不以 vis 开头的字符串会作为 summary 类型渲染

多次调用 render() 时,会在渲染新图表前自动销毁上一个图表。

destroy(): void

销毁当前图表实例并释放资源。

语法模式:JSON 格式

直接输出符合图表 TypeScript 类型的 JSON 对象;GPTVis.render() 可以直接使用该对象。

JSON 示例
{
  "type": "column",
  "data": [
    { "category": "Product A", "value": 30, "group": "Online" },
    { "category": "Product B", "value": 50, "group": "Online" }
  ],
  "title": "Product Sales Comparison",
  "axisXTitle": "Product",
  "axisYTitle": "Sales (10k)",
  "stack": true,
  "theme": "academy",
  "style": {
    "palette": ["#5B8FF9", "#61DDAA"]
  }
}

语法模式:语法格式

类似 Markdown 的缩进语法,支持流式渲染。第一行必须是 vis [type]。

语法规则

基本属性 — 每行一个,格式为 key value:

title Annual Trend
theme dark

对象数组 — 在 data 下,每个项目以 - 开头,子字段缩进:

{ data: { time: string; value: number; }[]; }

对应于:

data
  - time 2020
    value 100
  - time 2021
    value 120

纯值数组 — 每个项目以 - 开头:

{ data: number[] }

对应于:

data
  - 10
  - 20

包含空格的字符串值 — 使用单引号或双引号括起来;不含空格时可省略引号:

categories
  - "North America"
  - 'Southeast Asia'
  - Europe

嵌套对象 — 对象名称单独占一行,子属性缩进:

{ style?: { backgroundColor?: string; palette?: string[] } }

对应于:

style
  backgroundColor #f0f2f5
  palette
    - #5B8FF9
    - #61DDAA

递归树 — children 数组使用 - 缩进:

type TreeData = { name: string; children?: TreeData[] };
{ data: TreeData; }

对应于:

data
  name Root
  children
    - name Child A
      children
        - name Grandchild
    - name Child B
完整语法示例
vis column
data
  - category Product A
    value 30
    group Online
  - category Product B
    value 50
    group Online
title Product Sales Comparison
axisXTitle Product
axisYTitle Sales (10k)
stack true
theme academy
style
  palette
    - #5B8FF9
    - #61DDAA
Markdown 语法

输出为 Markdown 格式时,围栏代码块的语言标签使用 GPT-Vis,并在内容区域中写入完整的语法格式:

```GPT-Vis
vis line
data
  - time 2020
    value 100
```

格式:

```GPT-Vis
<complete Syntax content, first line: vis <chart-type>>
```

语法规则:

  • 语言标签固定为 GPT-Vis
  • 内容区域遵循语法格式规则,且第一行必须包含 vis <chart-type>(完整列表请参阅上文的支持的图表类型)
  • Markdown 插件会将代码块转换为 ,并在浏览器端渲染

注意:在 Markdown 模式下,内容区域必须包含第一行 vis <type>,与纯语法模式格式一致。

代码模式

根据目标框架生成完整的可运行代码。

安装

NPM:

npm install @antv/gpt-vis
import { GPTVis } from '@antv/gpt-vis';

CDN:

<script src="https://unpkg.com/@antv/gpt-vis/dist/umd/index.min.js"></script>

通过 CDN 加载后,可通过 GPTVis.GPTVis 访问主类。

完整 HTML 示例
<html>
  <head>
    <script src="https://unpkg.com/@antv/gpt-vis/dist/umd/index.min.js"></script>
  </head>
  <body>
    <div id="container"></div>
    <script>
      const gptVis = new GPTVis.GPTVis({
        container: '#container',
        width: 600,
        height: 400,
      });

      gptVis.render(`
vis line
data
  - time 2020
    value 100
  - time 2021
    value 120
title Annual Trend
`);
    </script>
  </body>
</html>

图表类型配置

通用配置

所有图表都包含以下字段,下文各图表类型定义中不再列出。每个小节标题就是 type 的值(例如 line、column),与上方图表类型表中的类型列相对应。

{ type: string; title?: string; theme?: 'default' | 'light' | 'dark' | 'academy'; style?: { backgroundColor?: string; palette?: string[] } }
line / area
{ data: { time: string | number; value: number; group?: string }[]; axisXTitle?: string; axisYTitle?: string; stack?: boolean; style?: { lineWidth?: number } }

stack 仅适用于 area。

column / bar
{ data: { category: string; value: number; group?: string }[]; axisXTitle?: string; axisYTitle?: string; stack?: boolean; group?: boolean }
pie

值不能是百分比数值。

{ data: { category: string; value: number }[]; innerRadius?: number }

将 innerRadius 设为 0.6,即可将其转换为环形图。

scatter
{ data: { x: number; y: number; group?: string }[]; axisXTitle?: string; axisYTitle?: string }
dual-axes
{ categories: string[]; series: { type: 'line' | 'column'; data: number[]; axisYTitle?: string }[]; axisXTitle?: string; style?: { startAtZero?: boolean } }
histogram
{ data: number[]; binNumber?: number; axisXTitle?: string; axisYTitle?: string }
boxplot / violin

同一类别需要有多个数据点才能显示分布。

{ data: { category: string; value: number; group?: string }[]; axisXTitle?: string; axisYTitle?: string; style?: { startAtZero?: boolean } }
radar
{ data: { name: string; value: number; group?: string }[]; align?: boolean }

align:是否对齐所有维度的刻度。默认为 false(每个轴独立缩放);设为 true 时,所有轴共享相同的最大值,适合比较多个系列的绝对值。

funnel
{ data: { category: string; value: number; }[]; }
waterfall

值可以为负数,以表示减少。palette 是一个颜色数组,顺序为[正值颜色、负值颜色、总计颜色]。

{ data: { category: string; value: number }[]; axisXTitle?: string; axisYTitle?: string; style?: { palette?: string[] } }
liquid

percent 的取值范围为 0 到 1。

{ percent: number; shape?: 'rect' | 'circle' | 'pin' | 'triangle' }
word-cloud
{ data: { text: string; value: number; }[]; }
venn

交集使用逗号分隔集合标识符:sets: "A,B"。label 用于在图表上显示相应集合的名称。

{ data: { sets: string | string[]; value: number; label?: string }[] }
treemap
type TreeNode = { name: string; value: number; children?: TreeNode[] };
{ data: TreeNode[] }
sankey
{ data: { source: string; target: string; value: number }[]; nodeAlign?: 'left' | 'center' | 'right' | 'justify' }
flow-diagram / network-graph

source/target 引用节点的 name 值。

type GraphData = { nodes: { name: string }[]; edges: { source: string; target: string; name?: string }[] };

// flow-diagram
{ data: GraphData }

// network-graph
{ data: GraphData; layout?: 'force' | 'circular' | 'grid' | 'radial' | 'concentric' | 'dagre' }
mindmap / indented-tree / organization-chart
type TreeData = { name: string; children?: TreeData[] };

// mindmap
{ data: TreeData; direction?: 'H' | 'LR' | 'RL' }

// indented-tree
{ data: TreeData; direction?: 'LR' | 'RL' | 'H' }

// organization-chart
type OrganizationChartData = {
  name: string;
  description?: string;
  children?: OrganizationChartData[];
};

{ data: OrganizationChartData }

mindmap 默认为 'H';indented-tree 默认为 'LR'。

fishbone-diagram
type FishboneNode = { name: string; children?: FishboneNode[] };
{ data: FishboneNode; style?: { texture?: 'rough' | 'default' } }

texture: 'rough' 会生成手绘风格。

table
{ data: Record<string, string | number>[]; }
summary

summary 与其他图表类型完全不同:它不使用 Syntax/JSON 配置,而是使用 T8 语法(Markdown + 语义注释)。

⚠️ 生成 summary 之前,必须:先阅读 references/summary.md,了解 T8 语法规则、完整的实体类型列表、属性字段定义、生成要求和示例,然后再生成内容。跳过此步骤会导致语法错误。

最佳实践

  1. 饼图的类别数不要超过 5 个;其余类别合并为“其他”,或改用条形图
  2. 不要用饼图展示趋势,也不要用折线图展示无序类别
  3. 数值字段必须为数值类型;类别字段必须为文本类型
  4. 连续值(例如薪资、分数、年龄)的分布必须使用直方图
  5. 多维字段映射:有两个分类维度时,将 x 轴维度写为 time/category,另一个写为 group
  6. 在 Syntax 模式下,优先使用 Syntax 格式(便于流式处理)
  7. 在 Code 模式下,默认采用 HTML + CDN 方式(无需安装);仅在用户指定框架时才使用 npm 方式

评论

支持 Markdown