关于 antv-gpt-vis
GPT-Vis Chart Visualization Skill 指导 LLM 根据意图和数据选择图表,并生成配置或可运行代码。它涵盖 26 种图表类型,支持语法、JSON 和代码输出模式。
主要功能
- 01支持 26 种图表类型
- 02依据意图和数据选择图表
- 03生成语法和 JSON 配置
- 04生成适合流式输出的语法
- 05生成可运行代码
适用场景
- 01根据数据生成图表配置
- 02为 LLM 应用生成流式图表语法
- 03创建可运行的可视化代码
- 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 种图表类型,并通过简单、自然的语法,让大模型轻松生成高质量的可视化内容。
步骤
- 识别意图:根据用户意图和数据特征选择图表类型
- 确定输出模式:根据上下文选择语法模式或代码模式
- 生成输出:按所选模式生成内容
支持的图表类型
| 类型值 | 使用场景 |
|---|---|
| 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:
| 参数 | 类型 | 必填 | 默认值 | 描述 |
|---|---|---|---|---|
container | string | HTMLElement | 是 | — | CSS 选择器或 DOM 元素 |
width | number | 否 | — | 图表宽度(px) |
height | number | 否 | — | 图表高度(px) |
theme | 'default' | 'light' | 'dark' | 'academy' | 否 | 'light' | 主题 |
wrapper | boolean | 否 | false | 是否显示外层 UI 容器(标签页、下载、复制) |
locale | string | 否 | '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 语法规则、完整的实体类型列表、属性字段定义、生成要求和示例,然后再生成内容。跳过此步骤会导致语法错误。
最佳实践
- 饼图的类别数不要超过 5 个;其余类别合并为“其他”,或改用条形图
- 不要用饼图展示趋势,也不要用折线图展示无序类别
- 数值字段必须为数值类型;类别字段必须为文本类型
- 连续值(例如薪资、分数、年龄)的分布必须使用直方图
- 多维字段映射:有两个分类维度时,将 x 轴维度写为
time/category,另一个写为 group
- 在 Syntax 模式下,优先使用 Syntax 格式(便于流式处理)
- 在 Code 模式下,默认采用 HTML + CDN 方式(无需安装);仅在用户指定框架时才使用 npm 方式