antv-skills 0.0.1-alpha.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (102) hide show
  1. package/.claude/settings.local.json +15 -0
  2. package/CONTRIBUTING.md +151 -0
  3. package/README.md +169 -0
  4. package/common/concepts/common-concept-chart-selection.md +235 -0
  5. package/common/concepts/common-concept-color-theory.md +252 -0
  6. package/common/concepts/common-concept-grammar-of-graphics.md +91 -0
  7. package/common/concepts/common-concept-visual-channels.md +181 -0
  8. package/common/data/common-data-format-graph.md +205 -0
  9. package/common/data/common-data-format-tabular.md +280 -0
  10. package/common/data/common-data-transform-patterns.md +294 -0
  11. package/common/patterns/common-pattern-antv-v4-to-v5.md +380 -0
  12. package/common/patterns/common-pattern-performance.md +280 -0
  13. package/common/patterns/common-pattern-responsive.md +274 -0
  14. package/g2/components/g2-comp-annotation.md +178 -0
  15. package/g2/components/g2-comp-axis-config.md +186 -0
  16. package/g2/components/g2-comp-label-config.md +174 -0
  17. package/g2/components/g2-comp-legend-config.md +166 -0
  18. package/g2/components/g2-comp-tooltip-config.md +250 -0
  19. package/g2/compositions/g2-comp-facet-rect.md +241 -0
  20. package/g2/compositions/g2-comp-repeat-matrix.md +171 -0
  21. package/g2/coordinates/g2-coord-transpose.md +127 -0
  22. package/g2/core/g2-core-chart-init.md +248 -0
  23. package/g2/core/g2-core-encode-channel.md +197 -0
  24. package/g2/core/g2-core-view-composition.md +176 -0
  25. package/g2/interactions/g2-interaction-brush.md +184 -0
  26. package/g2/interactions/g2-interaction-element-highlight.md +190 -0
  27. package/g2/interactions/g2-interaction-element-select.md +249 -0
  28. package/g2/interactions/g2-interaction-slider-filter.md +231 -0
  29. package/g2/interactions/g2-interaction-tooltip.md +192 -0
  30. package/g2/marks/arc/g2-mark-arc-donut.md +148 -0
  31. package/g2/marks/arc/g2-mark-arc-pie.md +212 -0
  32. package/g2/marks/area/g2-mark-area-basic.md +168 -0
  33. package/g2/marks/area/g2-mark-area-stacked.md +150 -0
  34. package/g2/marks/box/g2-mark-box-boxplot.md +163 -0
  35. package/g2/marks/cell/g2-mark-cell-heatmap.md +183 -0
  36. package/g2/marks/g2-mark-gauge.md +217 -0
  37. package/g2/marks/g2-mark-radar.md +231 -0
  38. package/g2/marks/g2-mark-sankey.md +217 -0
  39. package/g2/marks/g2-mark-text.md +309 -0
  40. package/g2/marks/g2-mark-treemap.md +258 -0
  41. package/g2/marks/interval/g2-mark-interval-basic.md +341 -0
  42. package/g2/marks/interval/g2-mark-interval-grouped.md +161 -0
  43. package/g2/marks/interval/g2-mark-interval-normalized.md +147 -0
  44. package/g2/marks/interval/g2-mark-interval-stacked.md +183 -0
  45. package/g2/marks/line/g2-mark-line-basic.md +276 -0
  46. package/g2/marks/point/g2-mark-point-scatter.md +177 -0
  47. package/g2/recipes/g2-recipe-dashboard.md +183 -0
  48. package/g2/recipes/g2-recipe-funnel.md +255 -0
  49. package/g2/recipes/g2-recipe-timeseries-compare.md +276 -0
  50. package/g2/scales/g2-scale-band.md +98 -0
  51. package/g2/scales/g2-scale-linear.md +221 -0
  52. package/g2/scales/g2-scale-time.md +138 -0
  53. package/g2/themes/g2-theme-builtin.md +192 -0
  54. package/g2/transforms/g2-transform-binx.md +133 -0
  55. package/g2/transforms/g2-transform-dodgex.md +90 -0
  56. package/g2/transforms/g2-transform-fold.md +155 -0
  57. package/g2/transforms/g2-transform-normalizey.md +83 -0
  58. package/g2/transforms/g2-transform-sortx.md +111 -0
  59. package/g2/transforms/g2-transform-stacky.md +189 -0
  60. package/g6/behaviors/g6-behavior-brush-select.md +313 -0
  61. package/g6/behaviors/g6-behavior-click-select.md +222 -0
  62. package/g6/behaviors/g6-behavior-collapse-expand.md +308 -0
  63. package/g6/behaviors/g6-behavior-drag-canvas.md +116 -0
  64. package/g6/behaviors/g6-behavior-hover-activate.md +231 -0
  65. package/g6/behaviors/g6-behavior-zoom-canvas.md +246 -0
  66. package/g6/core/g6-core-data-model.md +201 -0
  67. package/g6/core/g6-core-graph-init.md +280 -0
  68. package/g6/elements/edges/g6-edge-builtin-types.md +251 -0
  69. package/g6/elements/g6-element-combo.md +394 -0
  70. package/g6/elements/g6-element-state.md +294 -0
  71. package/g6/elements/nodes/g6-node-builtin-shapes.md +222 -0
  72. package/g6/elements/nodes/g6-node-style-mapping.md +270 -0
  73. package/g6/layouts/g6-layout-circular.md +173 -0
  74. package/g6/layouts/g6-layout-concentric.md +320 -0
  75. package/g6/layouts/g6-layout-dagre.md +158 -0
  76. package/g6/layouts/g6-layout-force.md +180 -0
  77. package/g6/layouts/g6-layout-grid.md +139 -0
  78. package/g6/layouts/g6-layout-mindmap.md +387 -0
  79. package/g6/layouts/g6-layout-radial.md +314 -0
  80. package/g6/layouts/g6-layout-tree.md +249 -0
  81. package/g6/plugins/g6-plugin-contextmenu.md +399 -0
  82. package/g6/plugins/g6-plugin-history.md +330 -0
  83. package/g6/plugins/g6-plugin-legend.md +341 -0
  84. package/g6/plugins/g6-plugin-minimap.md +215 -0
  85. package/g6/plugins/g6-plugin-toolbar.md +311 -0
  86. package/g6/plugins/g6-plugin-tooltip.md +240 -0
  87. package/g6/recipes/g6-recipe-flow-chart.md +185 -0
  88. package/g6/recipes/g6-recipe-knowledge-graph.md +295 -0
  89. package/g6/recipes/g6-recipe-mindmap.md +336 -0
  90. package/g6/recipes/g6-recipe-org-chart.md +270 -0
  91. package/index/common.index.json +337 -0
  92. package/index/full.index.json +2722 -0
  93. package/index/g2.index.json +1527 -0
  94. package/index/g6.index.json +874 -0
  95. package/package.json +23 -0
  96. package/prompts/g2-system-prompt.md +219 -0
  97. package/prompts/g6-system-prompt.md +192 -0
  98. package/schema/index.schema.json +66 -0
  99. package/schema/skill.schema.json +105 -0
  100. package/tools/build-index.js +248 -0
  101. package/tools/rag-retrieval.js +243 -0
  102. package/tools/validate.js +182 -0
@@ -0,0 +1,15 @@
1
+ {
2
+ "permissions": {
3
+ "allow": [
4
+ "Bash(node:*)",
5
+ "Bash(/Users/liufu/aiWorkspaces/antv-skills/common/data/common-data-transform-patterns.md:*)",
6
+ "Bash(/Users/liufu/aiWorkspaces/antv-skills/common/patterns/common-pattern-responsive.md:*)",
7
+ "Bash(/Users/liufu/aiWorkspaces/antv-skills/common/patterns/common-pattern-performance.md:*)",
8
+ "Bash(/Users/liufu/aiWorkspaces/antv-skills/common/patterns/common-pattern-antv-v4-to-v5.md:*)",
9
+ "Bash(xargs basename:*)",
10
+ "Bash(xargs:*)",
11
+ "Bash(do:*)",
12
+ "Bash(git:*)"
13
+ ]
14
+ }
15
+ }
@@ -0,0 +1,151 @@
1
+ # Skill 编写规范
2
+
3
+ ## Skill 文件命名规则
4
+
5
+ ```
6
+ {library}-{category}-{subcategory?}-{name}.md
7
+
8
+ 示例:
9
+ g2-mark-interval-basic.md ✅
10
+ g6-layout-dagre.md ✅
11
+ common-data-format-graph.md ✅
12
+ G2_Interval_Basic.md ❌(不符合规范)
13
+ ```
14
+
15
+ 规则:
16
+ - 全部小写
17
+ - 使用连字符(hyphen)分隔,不使用下划线
18
+ - 文件名与 `id` 字段保持一致
19
+ - `{name}` 部分不超过 4 个单词
20
+
21
+ ## Front Matter 字段说明
22
+
23
+ ### 必填字段
24
+
25
+ | 字段 | 类型 | 说明 |
26
+ |------|------|------|
27
+ | `id` | string | 与文件名一致(不含 .md) |
28
+ | `title` | string | 中文标题,5-60 字 |
29
+ | `description` | string | 2-5 句话描述,20 字以上 |
30
+ | `library` | enum | `g2` \| `g6` \| `common` |
31
+ | `version` | string | 如 `5.x` |
32
+ | `category` | string | 一级分类 |
33
+ | `tags` | string[] | 至少 3 个,中英文均可 |
34
+
35
+ ### 推荐字段
36
+
37
+ | 字段 | 类型 | 说明 |
38
+ |------|------|------|
39
+ | `subcategory` | string | 二级分类 |
40
+ | `related` | string[] | 关联 Skill ID 列表 |
41
+ | `use_cases` | string[] | 适用场景,至少 1 个 |
42
+ | `anti_patterns` | string[] | 反模式,何时不用此 Skill |
43
+ | `difficulty` | enum | `beginner` \| `intermediate` \| `advanced` |
44
+ | `source_url` | string | 官方文档链接 |
45
+
46
+ ## Markdown 正文结构规范
47
+
48
+ 每个 Skill 的正文应包含以下章节(按重要性排序):
49
+
50
+ ### 必须包含(至少一个)
51
+
52
+ ```markdown
53
+ ## 最小可运行示例
54
+ (一个可直接复制运行的完整代码,不省略 import 和 container)
55
+
56
+ ## 基本用法
57
+ (基础使用方式)
58
+ ```
59
+
60
+ ### 强烈推荐
61
+
62
+ ```markdown
63
+ ## 核心概念
64
+ (2-5 句话解释原理,适合 beginner 和 intermediate)
65
+
66
+ ## 常用变体
67
+ (2-4 个常见变化形式的代码示例)
68
+
69
+ ## API 速查
70
+ (表格形式的关键 API 列表)
71
+
72
+ ## 常见错误与修正
73
+ (至少 2 个,每个包含 ❌ 错误 + ✅ 正确)
74
+ ```
75
+
76
+ ### 可选
77
+
78
+ ```markdown
79
+ ## 完整类型参考
80
+ (TypeScript 接口定义)
81
+
82
+ ## 性能说明
83
+ (性能相关的使用建议)
84
+ ```
85
+
86
+ ## 代码规范
87
+
88
+ ### 1. 每个代码块必须包含 import 语句
89
+
90
+ ```javascript
91
+ // ✅ 正确
92
+ import { Chart } from '@antv/g2';
93
+
94
+ // ❌ 错误(缺少 import)
95
+ const chart = new Chart({ ... });
96
+ ```
97
+
98
+ ### 2. 所有示例必须指定 container
99
+
100
+ ```javascript
101
+ // ✅ 正确
102
+ const chart = new Chart({ container: 'container', width: 640, height: 480 });
103
+
104
+ // ❌ 错误(缺少 container)
105
+ const chart = new Chart({ width: 640, height: 480 });
106
+ ```
107
+
108
+ ### 3. 错误示例格式
109
+
110
+ 使用 `// ❌ 错误` 和 `// ✅ 正确` 标注:
111
+
112
+ ```javascript
113
+ // ❌ 错误:简洁说明错误原因
114
+ badCode();
115
+
116
+ // ✅ 正确
117
+ goodCode();
118
+ ```
119
+
120
+ ### 4. 注释语言
121
+
122
+ 关键配置使用中文注释,代码逻辑保持英文:
123
+
124
+ ```javascript
125
+ const chart = new Chart({
126
+ container: 'container', // DOM 容器 ID
127
+ autoFit: true, // 自动适应容器尺寸
128
+ });
129
+ ```
130
+
131
+ ## 质量检查清单
132
+
133
+ 提交 PR 前,请确认:
134
+
135
+ - [ ] 文件名符合命名规范,与 `id` 字段一致
136
+ - [ ] 所有必填 Front Matter 字段已填写
137
+ - [ ] `tags` 包含中文和英文关键词
138
+ - [ ] 至少一个**最小可运行示例**(含 import + container)
139
+ - [ ] 包含至少 2 个**常见错误与修正**
140
+ - [ ] 运行 `node tools/validate.js` 无 ERROR
141
+
142
+ ## 添加新 Skill 的步骤
143
+
144
+ 1. 确认 Skill 不在已有文件中(避免重复)
145
+ 2. 选择正确的目录位置
146
+ 3. 创建 `.md` 文件,文件名即 ID
147
+ 4. 填写 Front Matter(参考 `schema/skill.schema.json`)
148
+ 5. 编写正文(参考已有 Skill 文件)
149
+ 6. 运行 `node tools/validate.js` 检查格式
150
+ 7. 运行 `node tools/build-index.js` 重建索引
151
+ 8. 提交 PR
package/README.md ADDED
@@ -0,0 +1,169 @@
1
+ # AntV Skills
2
+
3
+ > 帮助大模型更好地生成 G2、G6 可视化代码的 Skill 知识库
4
+
5
+ ## 简介
6
+
7
+ AntV Skills 是一个结构化的知识库,通过 **RAG(检索增强生成)** 和 **Few-shot** 等技术,显著提升大模型生成 [G2 v5](https://g2.antv.antgroup.com)(图表库)和 [G6 v5](https://g6.antv.antgroup.com)(图分析库)代码的准确性。
8
+
9
+ **核心价值:**
10
+ - 防止 LLM 使用 G2/G6 v4 的废弃 API(最常见的幻觉错误)
11
+ - 提供可直接运行的代码示例作为 Few-shot
12
+ - 覆盖从入门到高级的完整使用场景
13
+
14
+ ## 目录结构
15
+
16
+ ```
17
+ antv-skills/
18
+ ├── schema/ # Skill 文件的 JSON Schema 定义
19
+ ├── index/ # 构建生成的索引文件(RAG 检索用)
20
+ ├── prompts/ # G2/G6 代码生成的 System Prompt 模板
21
+ ├── common/ # 公共基础概念(图形语法、数据格式等)
22
+ ├── g2/ # G2 图表库 Skills
23
+ │ ├── core/ # 初始化、通道系统等核心概念
24
+ │ ├── marks/ # Mark 类型(interval/line/point/arc 等)
25
+ │ ├── transforms/ # 数据变换(stackY/dodgeX/normalizeY 等)
26
+ │ ├── scales/ # 比例尺
27
+ │ ├── coordinates/ # 坐标系
28
+ │ ├── interactions/ # 交互(tooltip/brush/zoom 等)
29
+ │ ├── compositions/ # 复合图表(layer/facet/view)
30
+ │ ├── themes/ # 主题
31
+ │ ├── animations/ # 动画
32
+ │ └── recipes/ # 完整图表配方
33
+ └── g6/ # G6 图分析库 Skills
34
+ ├── core/ # 初始化、数据模型等核心概念
35
+ ├── elements/ # 节点/边/Combo 配置
36
+ ├── layouts/ # 布局算法(force/dagre/tree 等)
37
+ ├── behaviors/ # 交互行为
38
+ ├── plugins/ # 插件
39
+ ├── animations/ # 动画
40
+ └── recipes/ # 完整图谱配方
41
+ ```
42
+
43
+ ## Skill 文件格式
44
+
45
+ 每个 Skill 是一个 `.md` 文件,采用 **YAML Front Matter + Markdown Body** 格式:
46
+
47
+ ```markdown
48
+ ---
49
+ id: "g2-mark-interval-basic"
50
+ title: "G2 基础柱状图(Interval Mark)"
51
+ description: "使用 Interval Mark 创建基础柱状图..."
52
+ library: "g2"
53
+ version: "5.x"
54
+ category: "marks"
55
+ subcategory: "interval"
56
+ tags: ["柱状图", "bar chart", "Interval"]
57
+ related: ["g2-mark-interval-stacked", "g2-core-encode-channel"]
58
+ use_cases: ["比较不同类别的数值大小"]
59
+ anti_patterns: ["不适合展示连续趋势(改用 Line)"]
60
+ difficulty: "beginner"
61
+ ---
62
+
63
+ ## 最小可运行示例
64
+ ...
65
+
66
+ ## 常用变体
67
+ ...
68
+
69
+ ## 常见错误与修正
70
+ ...
71
+ ```
72
+
73
+ ## 快速开始
74
+
75
+ ### 1. 构建索引
76
+
77
+ ```bash
78
+ node tools/build-index.js
79
+ ```
80
+
81
+ ### 2. 测试检索
82
+
83
+ ```bash
84
+ node tools/rag-retrieval.js "如何创建柱状图"
85
+ node tools/rag-retrieval.js "力导向布局" --library=g6
86
+ ```
87
+
88
+ ### 3. 校验文件格式
89
+
90
+ ```bash
91
+ node tools/validate.js
92
+ ```
93
+
94
+ ## 如何在 AI 应用中使用
95
+
96
+ ### 方式 1:RAG 检索(推荐)
97
+
98
+ ```python
99
+ # 伪代码示例
100
+ from antv_skills import SkillRetriever
101
+
102
+ retriever = SkillRetriever(index_path="index/full.index.json")
103
+
104
+ def generate_chart_code(user_query):
105
+ # 1. 检索相关 Skill
106
+ skills = retriever.search(user_query, top_k=5)
107
+
108
+ # 2. 组装 System Prompt
109
+ system_prompt = load_template("prompts/g2-system-prompt.md")
110
+ skill_context = "\n\n".join(skill.key_content for skill in skills)
111
+ system_prompt = system_prompt.replace("{RETRIEVED_SKILLS_CONTENT}", skill_context)
112
+
113
+ # 3. 调用 LLM
114
+ return llm.complete(system_prompt, user_query)
115
+ ```
116
+
117
+ ### 方式 2:直接注入 System Prompt
118
+
119
+ 将 `prompts/g2-system-prompt.md` 或 `prompts/g6-system-prompt.md` 的内容直接作为系统提示词,适合轻量级场景。
120
+
121
+ ### 方式 3:MCP Server
122
+
123
+ 可将 Skills 封装为 MCP (Model Context Protocol) 工具,供 Claude Code 等 AI 工具调用。
124
+
125
+ ## Skill 分类覆盖
126
+
127
+ > 当前共 **87 个 Skill**:G2 46 个 · G6 31 个 · Common 10 个
128
+
129
+ ### G2 Skills(图表库)46 个
130
+
131
+ | 分类 | 数量 | 已覆盖 Skill |
132
+ |------|:----:|-------------|
133
+ | `core` | 3 | Chart 初始化、encode 通道系统、view 视图组合 |
134
+ | `marks` | 17 | interval(基础/堆叠/分组/百分比)、line、area(基础/堆叠)、arc(饼图/环形图)、point 散点图、cell 热力图、box 箱线图、text 文字标注、gauge 仪表盘、sankey 桑基图、treemap 矩形树图、radar 雷达图 |
135
+ | `transforms` | 6 | stackY、dodgeX、normalizeY、binX、sortX、fold |
136
+ | `scales` | 3 | band 分类比例尺、time 时间比例尺、linear 线性比例尺 |
137
+ | `coordinates` | 1 | transpose 转置坐标系 |
138
+ | `components` | 5 | axis 坐标轴、legend 图例、annotation 标注、labels 数据标签、tooltip 自定义配置 |
139
+ | `interactions` | 5 | tooltip、brush 框选、elementHighlight 元素高亮、elementSelect 元素选中、sliderFilter 缩略轴过滤 |
140
+ | `compositions` | 2 | facetRect 矩形分面、repeatMatrix 重复矩阵 |
141
+ | `themes` | 1 | 内置主题(classic / classicDark / academy) |
142
+ | `recipes` | 3 | 数据看板、时序对比图、漏斗图 |
143
+
144
+ ### G6 Skills(图分析库)31 个
145
+
146
+ | 分类 | 数量 | 已覆盖 Skill |
147
+ |------|:----:|-------------|
148
+ | `core` | 2 | Graph 初始化、数据模型(nodes/edges/combos CRUD)|
149
+ | `elements` | 5 | 内置节点形状、内置边类型、节点样式映射、元素状态样式、Combo 分组容器 |
150
+ | `layouts` | 8 | force 力导向、dagre 有向无环图、compactBox 树形、circular 环形、grid 网格、radial 辐射、concentric 同心圆、mindmap 思维导图 |
151
+ | `behaviors` | 6 | drag-canvas 拖拽画布、click-select 点击选择、hover-activate 悬停激活、zoom-canvas 画布缩放、brush-select 框选、collapse-expand 折叠展开 |
152
+ | `plugins` | 6 | tooltip 气泡提示、minimap 缩略图、contextmenu 右键菜单、toolbar 工具栏、history 历史记录、legend 图例 |
153
+ | `recipes` | 4 | 流程图、知识图谱、组织架构图、思维导图 |
154
+
155
+ ### Common Skills(公共基础)10 个
156
+
157
+ | 分类 | 数量 | 已覆盖 Skill |
158
+ |------|:----:|-------------|
159
+ | `concepts` | 4 | 图形语法原理、视觉通道理论、图表类型选择指南、数据可视化配色理论 |
160
+ | `data` | 3 | G2 表格数据格式、G6 图数据格式、通用数据转换模式 |
161
+ | `patterns` | 3 | 响应式图表适配、大数据量性能优化、G2/G6 v4→v5 迁移指南 |
162
+
163
+ ## 贡献指南
164
+
165
+ 请查看 [CONTRIBUTING.md](CONTRIBUTING.md) 了解如何添加或修改 Skill。
166
+
167
+ ## License
168
+
169
+ MIT
@@ -0,0 +1,235 @@
1
+ ---
2
+ id: "common-concept-chart-selection"
3
+ title: "图表类型选择指南"
4
+ description: |
5
+ 根据数据特征和分析目的选择合适的图表类型。
6
+ 覆盖比较、趋势、占比、分布、关系、流程六大场景,
7
+ 对应 G2/G6 的具体实现方式,帮助避免"用错图表"的常见错误。
8
+
9
+ library: "common"
10
+ version: "5.x"
11
+ category: "concepts"
12
+ tags:
13
+ - "图表选择"
14
+ - "chart selection"
15
+ - "可视化设计"
16
+ - "柱状图"
17
+ - "折线图"
18
+ - "饼图"
19
+ - "散点图"
20
+ - "决策"
21
+
22
+ related:
23
+ - "common-concept-visual-channels"
24
+ - "g2-mark-interval-basic"
25
+ - "g2-mark-line-basic"
26
+ - "g2-mark-arc-pie"
27
+ - "g2-mark-point-scatter"
28
+
29
+ use_cases:
30
+ - "根据用户需求选择正确的图表类型"
31
+ - "避免在不合适场景使用饼图或折线图"
32
+ - "理解何时用 G2 图表 vs G6 图分析"
33
+
34
+ difficulty: "beginner"
35
+ completeness: "full"
36
+ created: "2024-01-01"
37
+ updated: "2025-03-01"
38
+ author: "antv-team"
39
+ ---
40
+
41
+ ## 核心决策树
42
+
43
+ ```
44
+ 你的数据和目的是什么?
45
+
46
+ ├── 比较类别间的大小 → 柱状图 / 条形图
47
+ ├── 展示随时间的变化趋势 → 折线图 / 面积图
48
+ ├── 展示部分与整体的占比 → 饼图 / 环形图 / 堆叠柱状图
49
+ ├── 展示两个变量的相关性 → 散点图 / 气泡图
50
+ ├── 展示数据的分布规律 → 直方图 / 箱线图 / 小提琴图
51
+ └── 展示节点间的关系网络 → G6 图(force/dagre/tree 布局)
52
+ ```
53
+
54
+ ## 场景一:比较(Comparison)
55
+
56
+ **目的**:比较不同类别/时间点的数值大小
57
+
58
+ | 数据特征 | 推荐图表 | G2 实现 |
59
+ |---------|---------|---------|
60
+ | 类别 ≤ 10,竖向标签可读 | **柱状图** | `type: 'interval'` |
61
+ | 类别名称较长 / 类别多 | **条形图**(水平) | `type: 'interval'` + `coordinate: { type: 'transpose' }` |
62
+ | 多个系列并排比较 | **分组柱状图** | `transform: [{ type: 'dodgeX' }]` |
63
+ | 展示子类在总量中的贡献 | **堆叠柱状图** | `transform: [{ type: 'stackY' }]` |
64
+
65
+ ```javascript
66
+ // 柱状图(最常见的比较图)
67
+ chart.options({
68
+ type: 'interval',
69
+ data,
70
+ encode: { x: 'category', y: 'value', color: 'category' },
71
+ transform: [{ type: 'sortX', by: 'y', reverse: true }], // 按值降序
72
+ });
73
+ ```
74
+
75
+ ## 场景二:趋势(Trend)
76
+
77
+ **目的**:展示数值随时间或序列的变化
78
+
79
+ | 数据特征 | 推荐图表 | G2 实现 |
80
+ |---------|---------|---------|
81
+ | 单一指标时间趋势 | **折线图** | `type: 'line'` |
82
+ | 多指标对比趋势 | **多系列折线图** | `type: 'line'` + `encode.color: 'series'` |
83
+ | 强调面积/累积量 | **面积图** | `type: 'area'` |
84
+ | 展示数量随时间增减 | **面积图**(堆叠)| `type: 'area'` + `transform: [{ type: 'stackY' }]` |
85
+
86
+ ```javascript
87
+ // 多系列折线图
88
+ chart.options({
89
+ type: 'line',
90
+ data,
91
+ encode: { x: 'date', y: 'value', color: 'series' },
92
+ scale: { x: { type: 'time' } },
93
+ labels: [{ text: 'series', selector: 'last', position: 'right' }],
94
+ });
95
+ ```
96
+
97
+ ## 场景三:占比(Part-to-Whole)
98
+
99
+ **目的**:展示部分占整体的比例
100
+
101
+ | 数据特征 | 推荐图表 | G2 实现 | 注意 |
102
+ |---------|---------|---------|------|
103
+ | 类别 ≤ 5,强调比例 | **饼图** | `interval` + `theta` 坐标 | 类别多时难区分 |
104
+ | 需要中心留白 | **环形图** | 饼图 + `innerRadius` | 可在中心放总数 |
105
+ | 类别多,强调排名 | **百分比堆叠柱状图** | `stackY` + `normalizeY` | |
106
+ | 多层级占比 | **旭日图** | 暂用 `sunburst` 插件 | |
107
+
108
+ ```javascript
109
+ // 饼图(类别 ≤ 5 时)
110
+ chart.options({
111
+ type: 'interval',
112
+ data,
113
+ encode: { y: 'value', color: 'category' },
114
+ transform: [{ type: 'stackY' }],
115
+ coordinate: { type: 'theta', outerRadius: 0.85 },
116
+ labels: [{
117
+ text: (d) => `${d.category}\n${d.pct}%`,
118
+ position: 'outside',
119
+ connector: true,
120
+ }],
121
+ });
122
+ ```
123
+
124
+ ## 场景四:相关性(Correlation)
125
+
126
+ **目的**:探索两个或多个变量之间的关系
127
+
128
+ | 数据特征 | 推荐图表 | G2 实现 |
129
+ |---------|---------|---------|
130
+ | 两个数值变量 | **散点图** | `type: 'point'` |
131
+ | 两个数值 + 第三数值维度 | **气泡图** | `point` + `encode.size` |
132
+ | 多变量热力矩阵 | **热力图** | `type: 'cell'` |
133
+ | 展示分布+相关 | **散点图 + 趋势线** | `view` + `point` + `line` |
134
+
135
+ ```javascript
136
+ // 气泡图
137
+ chart.options({
138
+ type: 'point',
139
+ data,
140
+ encode: {
141
+ x: 'income',
142
+ y: 'happiness',
143
+ size: 'population', // 第三数值维度
144
+ color: 'region',
145
+ },
146
+ scale: { size: { range: [4, 30] } },
147
+ });
148
+ ```
149
+
150
+ ## 场景五:分布(Distribution)
151
+
152
+ **目的**:了解数据的分布规律
153
+
154
+ | 数据特征 | 推荐图表 | G2 实现 |
155
+ |---------|---------|---------|
156
+ | 单变量分布 | **直方图** | `type: 'interval'` + `transform: [{ type: 'binX' }]` |
157
+ | 多组分布比较 | **箱线图** | `type: 'boxplot'` |
158
+ | 展示中位数/四分位 | **箱线图** | `type: 'boxplot'` |
159
+
160
+ ```javascript
161
+ // 直方图
162
+ chart.options({
163
+ type: 'interval',
164
+ data,
165
+ encode: { x: 'value', y: 'count' },
166
+ transform: [{ type: 'binX', y: 'count' }],
167
+ });
168
+ ```
169
+
170
+ ## 场景六:关系网络(Relationship)
171
+
172
+ **目的**:展示实体间的连接关系、层次结构、流向
173
+
174
+ | 数据特征 | 推荐库 | G6 布局 |
175
+ |---------|--------|---------|
176
+ | 无层级的网络关系 | **G6** | `force`(力导向) |
177
+ | 有方向的流程/依赖 | **G6** | `dagre`(有向无环图) |
178
+ | 单根树形层级 | **G6** | `compactBox`(树形)|
179
+ | 对等环状关系 | **G6** | `circular`(环形) |
180
+
181
+ ```javascript
182
+ // G6 知识图谱(力导向)
183
+ const graph = new Graph({
184
+ layout: { type: 'force', preventOverlap: true },
185
+ data: { nodes, edges },
186
+ });
187
+ await graph.render();
188
+ ```
189
+
190
+ ## 快速选择口诀
191
+
192
+ ```
193
+ 比较用柱状,趋势用折线,
194
+ 占比用饼图,关系用散点,
195
+ 分布用直方,层级用树形,
196
+ 网络用 G6,复杂用组合。
197
+ ```
198
+
199
+ ## 常见错误
200
+
201
+ ### 错误 1:用折线图表示无时间顺序的分类数据
202
+
203
+ ```javascript
204
+ // ❌ 误用:城市名称没有顺序,不应该用折线(会误导"趋势"感知)
205
+ chart.options({
206
+ type: 'line',
207
+ [{ city: '北京', gdp: 3.6 }, { city: '上海', gdp: 4.3 }],
208
+ encode: { x: 'city', y: 'gdp' }, // ❌ 城市是无序分类,不是时序
209
+ });
210
+
211
+ // ✅ 正确:分类比较用柱状图
212
+ chart.options({
213
+ type: 'interval',
214
+ encode: { x: 'city', y: 'gdp' },
215
+ });
216
+ ```
217
+
218
+ ### 错误 2:用饼图展示 8+ 个类别
219
+
220
+ ```javascript
221
+ // ❌ 误用:10个类别的饼图,各扇区难以区分
222
+ chart.options({
223
+ type: 'interval',
224
+ coordinate: { type: 'theta' },
225
+ // 如果有 10 个国家/地区...很难读取
226
+ });
227
+
228
+ // ✅ 正确:超过 5 类改用排序条形图
229
+ chart.options({
230
+ type: 'interval',
231
+ encode: { x: 'country', y: 'value' },
232
+ coordinate: { type: 'transpose' },
233
+ transform: [{ type: 'sortX', by: 'y', reverse: true }],
234
+ });
235
+ ```