@antv/gpt-vis 1.0.0-beta.1 → 1.0.0

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 (159) hide show
  1. package/README.md +223 -47
  2. package/README.zh-CN.md +227 -51
  3. package/dist/cjs/gpt-vis/index.d.ts +8 -1
  4. package/dist/cjs/gpt-vis/index.js +43 -20
  5. package/dist/cjs/index.d.ts +15 -2
  6. package/dist/cjs/index.js +22 -2
  7. package/dist/cjs/syntax/parser.d.ts +17 -2
  8. package/dist/cjs/syntax/parser.js +151 -38
  9. package/dist/cjs/util/container.d.ts +5 -0
  10. package/dist/cjs/util/container.js +43 -0
  11. package/dist/cjs/util/theme.d.ts +5 -0
  12. package/dist/cjs/util/theme.js +9 -2
  13. package/dist/cjs/vis/area/index.js +2 -1
  14. package/dist/cjs/vis/bar/index.js +5 -4
  15. package/dist/cjs/vis/boxplot/index.js +7 -2
  16. package/dist/cjs/vis/column/index.js +5 -4
  17. package/dist/cjs/vis/dual-axes/index.js +3 -3
  18. package/dist/cjs/vis/fishbone-diagram/index.d.ts +35 -0
  19. package/dist/cjs/vis/fishbone-diagram/index.js +191 -0
  20. package/dist/cjs/vis/flow-diagram/index.d.ts +27 -0
  21. package/dist/cjs/vis/flow-diagram/index.js +287 -0
  22. package/dist/cjs/vis/funnel/index.js +2 -1
  23. package/dist/cjs/vis/histogram/index.js +3 -7
  24. package/dist/cjs/vis/indented-tree/index.d.ts +40 -0
  25. package/dist/cjs/vis/indented-tree/index.js +385 -0
  26. package/dist/cjs/vis/line/index.js +2 -1
  27. package/dist/cjs/vis/liquid/index.js +2 -1
  28. package/dist/cjs/vis/mindmap/index.d.ts +32 -0
  29. package/dist/cjs/vis/mindmap/index.js +222 -0
  30. package/dist/cjs/vis/network-graph/index.d.ts +59 -0
  31. package/dist/cjs/vis/network-graph/index.js +175 -0
  32. package/dist/cjs/vis/organization-chart/index.d.ts +64 -0
  33. package/dist/cjs/vis/organization-chart/index.js +200 -0
  34. package/dist/cjs/vis/pie/index.js +3 -3
  35. package/dist/cjs/vis/radar/index.d.ts +1 -0
  36. package/dist/cjs/vis/radar/index.js +10 -9
  37. package/dist/cjs/vis/sankey/index.js +2 -1
  38. package/dist/cjs/vis/scatter/index.d.ts +2 -0
  39. package/dist/cjs/vis/scatter/index.js +9 -4
  40. package/dist/cjs/vis/summary/index.js +17 -3
  41. package/dist/cjs/vis/table/index.d.ts +1 -0
  42. package/dist/cjs/vis/table/index.js +37 -1
  43. package/dist/cjs/vis/treemap/index.js +2 -1
  44. package/dist/cjs/vis/venn/index.d.ts +2 -1
  45. package/dist/cjs/vis/venn/index.js +18 -3
  46. package/dist/cjs/vis/violin/index.js +2 -1
  47. package/dist/cjs/vis/waterfall/index.d.ts +6 -9
  48. package/dist/cjs/vis/waterfall/index.js +29 -6
  49. package/dist/cjs/vis/word-cloud/index.js +2 -1
  50. package/dist/cjs/vis-wrapper/icons.js +2 -2
  51. package/dist/cjs/vis-wrapper/index.d.ts +1 -0
  52. package/dist/cjs/vis-wrapper/index.js +27 -16
  53. package/dist/cjs/vis-wrapper/styles.d.ts +1 -1
  54. package/dist/cjs/vis-wrapper/styles.js +8 -1
  55. package/dist/esm/gpt-vis/index.d.ts +8 -1
  56. package/dist/esm/gpt-vis/index.js +47 -26
  57. package/dist/esm/index.d.ts +15 -2
  58. package/dist/esm/index.js +7 -1
  59. package/dist/esm/syntax/parser.d.ts +17 -2
  60. package/dist/esm/syntax/parser.js +248 -90
  61. package/dist/esm/util/container.d.ts +5 -0
  62. package/dist/esm/util/container.js +20 -0
  63. package/dist/esm/util/theme.d.ts +5 -0
  64. package/dist/esm/util/theme.js +9 -0
  65. package/dist/esm/vis/area/index.js +3 -2
  66. package/dist/esm/vis/bar/index.js +7 -6
  67. package/dist/esm/vis/boxplot/index.js +17 -4
  68. package/dist/esm/vis/column/index.js +7 -6
  69. package/dist/esm/vis/dual-axes/index.js +13 -5
  70. package/dist/esm/vis/fishbone-diagram/index.d.ts +35 -0
  71. package/dist/esm/vis/fishbone-diagram/index.js +219 -0
  72. package/dist/esm/vis/flow-diagram/index.d.ts +27 -0
  73. package/dist/esm/vis/flow-diagram/index.js +349 -0
  74. package/dist/esm/vis/funnel/index.js +3 -2
  75. package/dist/esm/vis/histogram/index.js +6 -7
  76. package/dist/esm/vis/indented-tree/index.d.ts +40 -0
  77. package/dist/esm/vis/indented-tree/index.js +569 -0
  78. package/dist/esm/vis/line/index.js +3 -2
  79. package/dist/esm/vis/liquid/index.js +3 -2
  80. package/dist/esm/vis/mindmap/index.d.ts +32 -0
  81. package/dist/esm/vis/mindmap/index.js +316 -0
  82. package/dist/esm/vis/network-graph/index.d.ts +59 -0
  83. package/dist/esm/vis/network-graph/index.js +242 -0
  84. package/dist/esm/vis/organization-chart/index.d.ts +64 -0
  85. package/dist/esm/vis/organization-chart/index.js +271 -0
  86. package/dist/esm/vis/pie/index.js +4 -8
  87. package/dist/esm/vis/radar/index.d.ts +1 -0
  88. package/dist/esm/vis/radar/index.js +20 -4
  89. package/dist/esm/vis/sankey/index.js +3 -2
  90. package/dist/esm/vis/scatter/index.d.ts +2 -0
  91. package/dist/esm/vis/scatter/index.js +15 -4
  92. package/dist/esm/vis/summary/index.js +25 -4
  93. package/dist/esm/vis/table/index.d.ts +1 -0
  94. package/dist/esm/vis/table/index.js +9 -2
  95. package/dist/esm/vis/treemap/index.js +3 -2
  96. package/dist/esm/vis/venn/index.d.ts +2 -1
  97. package/dist/esm/vis/venn/index.js +29 -4
  98. package/dist/esm/vis/violin/index.js +3 -2
  99. package/dist/esm/vis/waterfall/index.d.ts +6 -9
  100. package/dist/esm/vis/waterfall/index.js +33 -13
  101. package/dist/esm/vis/word-cloud/index.js +3 -2
  102. package/dist/esm/vis-wrapper/icons.js +2 -2
  103. package/dist/esm/vis-wrapper/index.d.ts +1 -0
  104. package/dist/esm/vis-wrapper/index.js +15 -10
  105. package/dist/esm/vis-wrapper/styles.d.ts +1 -1
  106. package/dist/esm/vis-wrapper/styles.js +1 -1
  107. package/dist/umd/index.min.js +1 -1
  108. package/package.json +17 -21
  109. package/src/gpt-vis/index.ts +0 -283
  110. package/src/index.ts +0 -44
  111. package/src/readme.md +0 -37
  112. package/src/syntax/index.ts +0 -2
  113. package/src/syntax/parser.ts +0 -411
  114. package/src/types/index.ts +0 -29
  115. package/src/util/theme.ts +0 -167
  116. package/src/vis/area/README.md +0 -143
  117. package/src/vis/area/index.ts +0 -212
  118. package/src/vis/bar/README.md +0 -158
  119. package/src/vis/bar/index.ts +0 -186
  120. package/src/vis/boxplot/README.md +0 -168
  121. package/src/vis/boxplot/index.ts +0 -162
  122. package/src/vis/column/README.md +0 -158
  123. package/src/vis/column/index.ts +0 -185
  124. package/src/vis/dual-axes/README.md +0 -191
  125. package/src/vis/dual-axes/index.ts +0 -218
  126. package/src/vis/funnel/README.md +0 -143
  127. package/src/vis/funnel/index.ts +0 -238
  128. package/src/vis/histogram/README.md +0 -130
  129. package/src/vis/histogram/index.ts +0 -153
  130. package/src/vis/line/README.md +0 -138
  131. package/src/vis/line/index.ts +0 -159
  132. package/src/vis/liquid/README.md +0 -150
  133. package/src/vis/liquid/index.ts +0 -130
  134. package/src/vis/pie/README.md +0 -127
  135. package/src/vis/pie/index.ts +0 -163
  136. package/src/vis/radar/README.md +0 -184
  137. package/src/vis/radar/index.ts +0 -214
  138. package/src/vis/sankey/README.md +0 -144
  139. package/src/vis/sankey/index.ts +0 -144
  140. package/src/vis/scatter/README.md +0 -145
  141. package/src/vis/scatter/index.ts +0 -147
  142. package/src/vis/summary/README.md +0 -272
  143. package/src/vis/summary/index.ts +0 -91
  144. package/src/vis/table/README.md +0 -174
  145. package/src/vis/table/index.ts +0 -241
  146. package/src/vis/treemap/README.md +0 -199
  147. package/src/vis/treemap/index.ts +0 -167
  148. package/src/vis/venn/README.md +0 -153
  149. package/src/vis/venn/index.ts +0 -149
  150. package/src/vis/violin/README.md +0 -168
  151. package/src/vis/violin/index.ts +0 -216
  152. package/src/vis/waterfall/README.md +0 -178
  153. package/src/vis/waterfall/index.ts +0 -258
  154. package/src/vis/word-cloud/README.md +0 -137
  155. package/src/vis/word-cloud/index.ts +0 -137
  156. package/src/vis-wrapper/README.md +0 -159
  157. package/src/vis-wrapper/icons.ts +0 -35
  158. package/src/vis-wrapper/index.ts +0 -276
  159. package/src/vis-wrapper/styles.ts +0 -195
@@ -1,168 +0,0 @@
1
- # Boxplot
2
-
3
- A boxplot (box-and-whisker plot) component for displaying statistical distribution data, built with G2 5.0.
4
-
5
- ## Usage
6
-
7
- ```ts
8
- import { Boxplot } from '@antv/gpt-vis/ai';
9
-
10
- const boxplot = Boxplot({
11
- container: '#container',
12
- width: 600,
13
- height: 400,
14
- });
15
-
16
- boxplot.render({
17
- data: [
18
- { category: '班级A', value: 15 },
19
- { category: '班级A', value: 18 },
20
- { category: '班级A', value: 22 },
21
- { category: '班级A', value: 27 },
22
- { category: '班级A', value: 35 },
23
- { category: '班级B', value: 10 },
24
- { category: '班级B', value: 14 },
25
- { category: '班级B', value: 19 },
26
- { category: '班级B', value: 23 },
27
- { category: '班级B', value: 30 },
28
- ],
29
- });
30
-
31
- boxplot.destroy();
32
- ```
33
-
34
- ## Configuration
35
-
36
- ### Constructor Options (BoxplotOptions)
37
-
38
- | Property | Type | Default | Description |
39
- | --------- | --------------------- | ------- | ----------------------------- |
40
- | container | string \| HTMLElement | - | Container element or selector |
41
- | width | number | 640 | Chart width in pixels |
42
- | height | number | 480 | Chart height in pixels |
43
-
44
- ### Render Config (BoxplotConfig)
45
-
46
- | Property | Type | Default | Description |
47
- | ---------- | ------ | --------- | ------------------------- |
48
- | data | Array | - | Chart data array |
49
- | theme | string | 'default' | Color theme |
50
- | title | string | - | Chart title |
51
- | axisXTitle | string | - | X-axis title |
52
- | axisYTitle | string | - | Y-axis title |
53
- | style | object | - | Chart style configuration |
54
-
55
- ### Data Structure
56
-
57
- ```ts
58
- type BoxplotDataItem = {
59
- category: string; // Category name (required)
60
- value: number; // Data value (required)
61
- group?: string; // Group name for grouped boxplots (optional)
62
- };
63
- ```
64
-
65
- ### Style Options
66
-
67
- ```ts
68
- style?: {
69
- backgroundColor?: string; // Background color
70
- palette?: string[]; // Color palette
71
- startAtZero?: boolean; // Whether Y-axis starts at zero
72
- }
73
- ```
74
-
75
- ## Examples
76
-
77
- ### Basic Example
78
-
79
- ```ts
80
- boxplot.render({
81
- data: [
82
- { category: '班级A', value: 15 },
83
- { category: '班级A', value: 18 },
84
- { category: '班级A', value: 22 },
85
- { category: '班级A', value: 27 },
86
- { category: '班级A', value: 35 },
87
- { category: '班级B', value: 10 },
88
- { category: '班级B', value: 14 },
89
- { category: '班级B', value: 19 },
90
- { category: '班级B', value: 23 },
91
- { category: '班级B', value: 30 },
92
- ],
93
- title: '成绩分布',
94
- });
95
- ```
96
-
97
- ### With Theme
98
-
99
- ```ts
100
- boxplot.render({
101
- data: [
102
- { category: '实验组1', value: 12 },
103
- { category: '实验组1', value: 15 },
104
- { category: '实验组1', value: 20 },
105
- { category: '实验组1', value: 25 },
106
- { category: '实验组1', value: 30 },
107
- ],
108
- theme: 'academy',
109
- title: '实验数据分布',
110
- });
111
- ```
112
-
113
- ### With Custom Styles
114
-
115
- ```ts
116
- boxplot.render({
117
- data: [
118
- { category: '股票A', value: 50 },
119
- { category: '股票A', value: 55 },
120
- { category: '股票A', value: 60 },
121
- { category: '股票A', value: 65 },
122
- { category: '股票A', value: 70 },
123
- ],
124
- title: '金融数据分布',
125
- style: {
126
- palette: ['#FF9800', '#2196F3'],
127
- backgroundColor: '#F5F5F5',
128
- },
129
- });
130
- ```
131
-
132
- ### Grouped Boxplot
133
-
134
- ```ts
135
- boxplot.render({
136
- data: [
137
- { category: 'Adelie', group: 'MALE', value: 181 },
138
- { category: 'Adelie', group: 'FEMALE', value: 186 },
139
- { category: 'Adelie', group: 'MALE', value: 190 },
140
- { category: 'Adelie', group: 'FEMALE', value: 181 },
141
- { category: 'Adelie', group: 'MALE', value: 191 },
142
- { category: 'Chinstrap', group: 'MALE', value: 195 },
143
- { category: 'Chinstrap', group: 'FEMALE', value: 191 },
144
- { category: 'Chinstrap', group: 'MALE', value: 198 },
145
- ],
146
- title: '帕尔默企鹅身高性别差异',
147
- });
148
- ```
149
-
150
- ### Start at Zero
151
-
152
- ```ts
153
- boxplot.render({
154
- data: [
155
- { category: '班级A', value: 15 },
156
- { category: '班级A', value: 18 },
157
- { category: '班级A', value: 22 },
158
- ],
159
- style: {
160
- startAtZero: true,
161
- },
162
- });
163
- ```
164
-
165
- ## Methods
166
-
167
- - `render(config: BoxplotConfig): void` - Render or update the chart
168
- - `destroy(): void` - Destroy the chart instance and clean up resources
@@ -1,162 +0,0 @@
1
- import { Chart } from '@antv/g2';
2
- import type { VisualizationOptions } from '../../types';
3
- import { getBackgroundColor, getThemeColors, getThemeObject } from '../../util/theme';
4
-
5
- /**
6
- * BoxplotDataItem is the type for each data item in the boxplot chart.
7
- */
8
- export type BoxplotDataItem = {
9
- category: string;
10
- value: number;
11
- group?: string;
12
- };
13
-
14
- /**
15
- * BoxplotConfig defines the configuration for rendering the boxplot chart.
16
- */
17
- export interface BoxplotConfig {
18
- type?: 'boxplot';
19
- data: BoxplotDataItem[];
20
- theme?: 'default' | 'academy' | 'dark';
21
- title?: string;
22
- axisXTitle?: string;
23
- axisYTitle?: string;
24
- style?: {
25
- backgroundColor?: string;
26
- palette?: string[];
27
- startAtZero?: boolean;
28
- };
29
- }
30
-
31
- /**
32
- * BoxplotInstance represents a boxplot chart instance with render and destroy.
33
- */
34
- export interface BoxplotInstance {
35
- render: (config: BoxplotConfig) => void;
36
- destroy: () => void;
37
- }
38
-
39
- /**
40
- * Boxplot chart component using G2 5.0.
41
- *
42
- * @example
43
- * ```ts
44
- * const boxplot = Boxplot({
45
- * container: '#container',
46
- * width: 600,
47
- * height: 400,
48
- * });
49
- *
50
- * boxplot.render({
51
- * type: 'boxplot',
52
- * data: [
53
- * { category: '班级A', value: 15 },
54
- * { category: '班级A', value: 18 },
55
- * { category: '班级A', value: 22 },
56
- * { category: '班级A', value: 27 },
57
- * { category: '班级A', value: 35 },
58
- * ],
59
- * theme: 'academy'
60
- * });
61
- *
62
- * boxplot.destroy();
63
- * ```
64
- */
65
- export const Boxplot = (options: VisualizationOptions): BoxplotInstance => {
66
- const { container, width, height, theme: chartTheme = 'default' } = options;
67
- let chart: Chart | null = null;
68
-
69
- /**
70
- * Render the boxplot chart with the given configuration.
71
- */
72
- const render = (config: BoxplotConfig): void => {
73
- const { data = [], theme = chartTheme, title, axisXTitle, axisYTitle, style = {} } = config;
74
-
75
- // Clean up previous chart if exists
76
- if (chart) {
77
- chart.destroy();
78
- }
79
-
80
- // Get colors from style.palette or theme defaults
81
- const colors = style.palette || getThemeColors(theme);
82
- const backgroundColor = style.backgroundColor || getBackgroundColor(theme);
83
- const startAtZero = style.startAtZero || false;
84
-
85
- // Determine if data has group field for grouped boxplot
86
- const hasGroupField = (data || [])[0]?.group !== undefined;
87
- let encode = {};
88
-
89
- if (hasGroupField) {
90
- encode = {
91
- x: 'category',
92
- y: 'value',
93
- color: 'group',
94
- series: 'group',
95
- };
96
- } else {
97
- encode = {
98
- x: 'category',
99
- y: 'value',
100
- color: 'category',
101
- };
102
- }
103
-
104
- // Create chart
105
- chart = new Chart({
106
- container,
107
- width,
108
- height,
109
- autoFit: true,
110
- });
111
-
112
- // Configure chart options
113
- // Note: Using 'any' type due to G2's complex type system with transformations
114
- // This is consistent with how G2 5.0 is used elsewhere in the codebase
115
- const chartOptions: any = {
116
- type: 'boxplot',
117
- data,
118
- title: title ?? '',
119
- encode: encode,
120
- axis: {
121
- x: {
122
- title: axisXTitle || false,
123
- },
124
- y: {
125
- title: axisYTitle || false,
126
- },
127
- },
128
- scale: {
129
- x: { paddingInner: 0.6, paddingOuter: 0.3 },
130
- series: { paddingInner: 0.3, paddingOuter: 0.1 },
131
- y: { nice: true, zero: startAtZero },
132
- color: { range: colors },
133
- },
134
- style: { stroke: 'black' },
135
- legend: {
136
- color: hasGroupField ? { position: 'top' } : false,
137
- },
138
- viewStyle: {
139
- viewFill: backgroundColor,
140
- },
141
- theme: getThemeObject(theme),
142
- };
143
-
144
- chart.options(chartOptions);
145
- chart.render();
146
- };
147
-
148
- /**
149
- * Destroy the chart instance and clean up resources.
150
- */
151
- const destroy = (): void => {
152
- if (chart) {
153
- chart.destroy();
154
- chart = null;
155
- }
156
- };
157
-
158
- return {
159
- render,
160
- destroy,
161
- };
162
- };
@@ -1,158 +0,0 @@
1
- # Column
2
-
3
- A vertical column chart component for comparing categorical data, built with G2 5.0.
4
-
5
- ## Usage
6
-
7
- ```ts
8
- import { Column } from '@antv/gpt-vis/ai';
9
-
10
- const column = Column({
11
- container: '#container',
12
- width: 600,
13
- height: 400,
14
- });
15
-
16
- column.render({
17
- data: [
18
- { category: '2015 年', value: 80 },
19
- { category: '2016 年', value: 140 },
20
- { category: '2017 年', value: 220 },
21
- ],
22
- title: '海底捞公司外卖收入',
23
- axisXTitle: '年份',
24
- axisYTitle: '金额 (百万元)',
25
- });
26
-
27
- column.destroy();
28
- ```
29
-
30
- ## Configuration
31
-
32
- ### Constructor Options (ColumnOptions)
33
-
34
- | Property | Type | Default | Description |
35
- | --------- | --------------------- | ------- | ----------------------------- |
36
- | container | string \| HTMLElement | - | Container element or selector |
37
- | width | number | 640 | Chart width in pixels |
38
- | height | number | 480 | Chart height in pixels |
39
-
40
- ### Render Config (ColumnConfig)
41
-
42
- | Property | Type | Default | Description |
43
- | ---------- | ------- | --------- | -------------------------------------- |
44
- | data | Array | - | Chart data array |
45
- | type | string | 'column' | Chart type identifier |
46
- | group | boolean | false | Enable grouping (requires group field) |
47
- | stack | boolean | false | Enable stacking (requires group field) |
48
- | title | string | - | Chart title |
49
- | axisXTitle | string | - | X-axis title |
50
- | axisYTitle | string | - | Y-axis title |
51
- | theme | string | 'default' | Color theme |
52
- | style | object | - | Chart style configuration |
53
-
54
- ### Data Structure
55
-
56
- ```ts
57
- type ColumnDataItem = {
58
- category: string; // Category name
59
- value: number; // Numeric value
60
- group?: string; // Optional group name for grouped or stacked charts
61
- };
62
- ```
63
-
64
- ### Style Options
65
-
66
- | Property | Type | Default | Description |
67
- | --------------- | -------- | ------- | ------------------------------------------- |
68
- | backgroundColor | string | - | Background color of the chart |
69
- | palette | string[] | - | Array of colors for the chart color palette |
70
-
71
- ## Examples
72
-
73
- ### Basic Column Chart
74
-
75
- ```ts
76
- column.render({
77
- data: [
78
- { category: '第一产业', value: 7200.0 },
79
- { category: '第二产业', value: 36600.0 },
80
- { category: '第三产业', value: 41000.0 },
81
- ],
82
- axisXTitle: 'title',
83
- axisYTitle: 'industrial',
84
- });
85
- ```
86
-
87
- ### Grouped Column Chart
88
-
89
- ```ts
90
- column.render({
91
- data: [
92
- { category: '北京', value: 825.6, group: '油车' },
93
- { category: '北京', value: 60.2, group: '新能源汽车' },
94
- { category: '上海', value: 450, group: '油车' },
95
- { category: '上海', value: 95, group: '新能源汽车' },
96
- { category: '深圳', value: 506, group: '油车' },
97
- { category: '深圳', value: 76.7, group: '新能源汽车' },
98
- ],
99
- group: true,
100
- title: '油车与新能源汽车售卖量',
101
- axisXTitle: '城市',
102
- axisYTitle: '售卖量 (万辆)',
103
- });
104
- ```
105
-
106
- ### Stacked Column Chart
107
-
108
- ```ts
109
- column.render({
110
- data: [
111
- { category: '北京', value: 825.6, group: '油车' },
112
- { category: '北京', value: 60.2, group: '新能源汽车' },
113
- { category: '上海', value: 450, group: '油车' },
114
- { category: '上海', value: 95, group: '新能源汽车' },
115
- { category: '深圳', value: 506, group: '油车' },
116
- { category: '深圳', value: 76.7, group: '新能源汽车' },
117
- ],
118
- stack: true,
119
- title: '油车与新能源汽车售卖量',
120
- axisXTitle: '城市',
121
- axisYTitle: '售卖量 (万辆)',
122
- });
123
- ```
124
-
125
- ### With Theme
126
-
127
- ```ts
128
- column.render({
129
- data: [
130
- { category: '2015 年', value: 80 },
131
- { category: '2016 年', value: 140 },
132
- { category: '2017 年', value: 220 },
133
- ],
134
- theme: 'dark',
135
- title: '海底捞公司外卖收入',
136
- });
137
- ```
138
-
139
- ### With Custom Styles
140
-
141
- ```ts
142
- column.render({
143
- data: [
144
- { category: '2015 年', value: 80 },
145
- { category: '2016 年', value: 140 },
146
- { category: '2017 年', value: 220 },
147
- ],
148
- style: {
149
- palette: ['#FF6B6B', '#4ECDC4', '#45B7D1'],
150
- backgroundColor: '#F5F5F5',
151
- },
152
- });
153
- ```
154
-
155
- ## Methods
156
-
157
- - `render(config: ColumnConfig): void` - Render or update the chart
158
- - `destroy(): void` - Destroy the chart instance and clean up resources
@@ -1,185 +0,0 @@
1
- import { Chart } from '@antv/g2';
2
- import type { VisualizationOptions } from '../../types';
3
- import { getBackgroundColor, getThemeColors, getThemeObject } from '../../util/theme';
4
-
5
- /**
6
- * ColumnDataItem is the type for each data item in the column chart.
7
- */
8
- export type ColumnDataItem = {
9
- category: string;
10
- value: number;
11
- group?: string;
12
- };
13
-
14
- /**
15
- * ColumnConfig defines the configuration for rendering the column chart.
16
- */
17
- export interface ColumnConfig {
18
- type?: 'column';
19
- data: ColumnDataItem[];
20
- group?: boolean;
21
- stack?: boolean;
22
- title?: string;
23
- axisXTitle?: string;
24
- axisYTitle?: string;
25
- theme?: 'default' | 'academy' | 'dark';
26
- style?: {
27
- backgroundColor?: string;
28
- palette?: string[];
29
- };
30
- }
31
-
32
- /**
33
- * ColumnInstance represents a column chart instance with render and destroy methods.
34
- */
35
- export interface ColumnInstance {
36
- render: (config: ColumnConfig) => void;
37
- destroy: () => void;
38
- }
39
-
40
- /**
41
- * Column chart component using G2 5.0.
42
- *
43
- * @example
44
- * ```ts
45
- * const column = Column({
46
- * container: '#container',
47
- * width: 600,
48
- * height: 400,
49
- * });
50
- *
51
- * column.render({
52
- * type: 'column',
53
- * data: [
54
- * { category: '2015 年', value: 80 },
55
- * { category: '2016 年', value: 140 },
56
- * { category: '2017 年', value: 220 },
57
- * ],
58
- * title: '海底捞公司外卖收入',
59
- * axisXTitle: '年份',
60
- * axisYTitle: '金额 (百万元)',
61
- * });
62
- *
63
- * column.destroy();
64
- * ```
65
- */
66
- export const Column = (options: VisualizationOptions): ColumnInstance => {
67
- const { container, width, height, theme: chartTheme = 'default' } = options;
68
- let chart: Chart | null = null;
69
-
70
- /**
71
- * Render the column chart with the given configuration.
72
- */
73
- const render = (config: ColumnConfig): void => {
74
- const {
75
- data = [],
76
- theme = chartTheme,
77
- title,
78
- axisXTitle,
79
- axisYTitle,
80
- group = false,
81
- stack = false,
82
- style = {},
83
- } = config;
84
-
85
- // Clean up previous chart if exists
86
- if (chart) {
87
- chart.destroy();
88
- }
89
-
90
- const hasGroupField = data.length > 0 && data[0]?.group !== undefined;
91
- const colors = style.palette || getThemeColors(theme);
92
- const backgroundColor = style.backgroundColor || getBackgroundColor(theme);
93
-
94
- // Create chart
95
- chart = new Chart({
96
- container,
97
- width,
98
- height,
99
- autoFit: true,
100
- });
101
-
102
- // Configure chart encode and transform based on group/stack
103
- let encode: any = {};
104
- let transform: any = [];
105
- let radiusStyle: any = {};
106
-
107
- // Set radius style for default theme
108
- if (theme === 'default') {
109
- radiusStyle = { radiusTopLeft: 4, radiusTopRight: 4 };
110
- }
111
-
112
- // Configure transforms based on group/stack flags
113
- if (hasGroupField && group) {
114
- transform = [{ type: 'dodgeX' }];
115
- }
116
-
117
- if (hasGroupField && stack) {
118
- transform = [{ type: 'stackY' }];
119
- }
120
-
121
- // Configure encode based on whether data has group field
122
- if (hasGroupField) {
123
- encode = { x: 'category', y: 'value', color: 'group' };
124
- } else {
125
- encode = { x: 'category', y: 'value', color: 'category' };
126
- }
127
-
128
- // Configure scale
129
- const scaleConfig: any = {
130
- y: { nice: true },
131
- ...(style.palette?.length ? { color: { range: colors } } : {}),
132
- };
133
-
134
- // Configure chart options
135
- // Note: Using 'any' type due to G2's complex type system with transformations
136
- // This is consistent with how G2 5.0 is used elsewhere in the codebase
137
- const chartOptions: any = {
138
- type: 'interval',
139
- data,
140
- title: title ?? '',
141
- encode,
142
- transform,
143
- scale: scaleConfig,
144
- axis: {
145
- x: { title: axisXTitle || false },
146
- y: { title: axisYTitle || false },
147
- },
148
- legend: hasGroupField ? { color: { position: 'top' } } : false,
149
- tooltip: {
150
- items: [
151
- (d: any) => ({
152
- name: axisYTitle || d.category,
153
- value: d.value,
154
- }),
155
- ],
156
- },
157
- style: {
158
- ...radiusStyle,
159
- columnWidthRatio: 0.8,
160
- },
161
- viewStyle: {
162
- viewFill: backgroundColor,
163
- },
164
- theme: getThemeObject(theme),
165
- };
166
-
167
- chart.options(chartOptions);
168
- chart.render();
169
- };
170
-
171
- /**
172
- * Destroy the chart instance and clean up resources.
173
- */
174
- const destroy = (): void => {
175
- if (chart) {
176
- chart.destroy();
177
- chart = null;
178
- }
179
- };
180
-
181
- return {
182
- render,
183
- destroy,
184
- };
185
- };