@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.
- package/README.md +223 -47
- package/README.zh-CN.md +227 -51
- package/dist/cjs/gpt-vis/index.d.ts +8 -1
- package/dist/cjs/gpt-vis/index.js +43 -20
- package/dist/cjs/index.d.ts +15 -2
- package/dist/cjs/index.js +22 -2
- package/dist/cjs/syntax/parser.d.ts +17 -2
- package/dist/cjs/syntax/parser.js +151 -38
- package/dist/cjs/util/container.d.ts +5 -0
- package/dist/cjs/util/container.js +43 -0
- package/dist/cjs/util/theme.d.ts +5 -0
- package/dist/cjs/util/theme.js +9 -2
- package/dist/cjs/vis/area/index.js +2 -1
- package/dist/cjs/vis/bar/index.js +5 -4
- package/dist/cjs/vis/boxplot/index.js +7 -2
- package/dist/cjs/vis/column/index.js +5 -4
- package/dist/cjs/vis/dual-axes/index.js +3 -3
- package/dist/cjs/vis/fishbone-diagram/index.d.ts +35 -0
- package/dist/cjs/vis/fishbone-diagram/index.js +191 -0
- package/dist/cjs/vis/flow-diagram/index.d.ts +27 -0
- package/dist/cjs/vis/flow-diagram/index.js +287 -0
- package/dist/cjs/vis/funnel/index.js +2 -1
- package/dist/cjs/vis/histogram/index.js +3 -7
- package/dist/cjs/vis/indented-tree/index.d.ts +40 -0
- package/dist/cjs/vis/indented-tree/index.js +385 -0
- package/dist/cjs/vis/line/index.js +2 -1
- package/dist/cjs/vis/liquid/index.js +2 -1
- package/dist/cjs/vis/mindmap/index.d.ts +32 -0
- package/dist/cjs/vis/mindmap/index.js +222 -0
- package/dist/cjs/vis/network-graph/index.d.ts +59 -0
- package/dist/cjs/vis/network-graph/index.js +175 -0
- package/dist/cjs/vis/organization-chart/index.d.ts +64 -0
- package/dist/cjs/vis/organization-chart/index.js +200 -0
- package/dist/cjs/vis/pie/index.js +3 -3
- package/dist/cjs/vis/radar/index.d.ts +1 -0
- package/dist/cjs/vis/radar/index.js +10 -9
- package/dist/cjs/vis/sankey/index.js +2 -1
- package/dist/cjs/vis/scatter/index.d.ts +2 -0
- package/dist/cjs/vis/scatter/index.js +9 -4
- package/dist/cjs/vis/summary/index.js +17 -3
- package/dist/cjs/vis/table/index.d.ts +1 -0
- package/dist/cjs/vis/table/index.js +37 -1
- package/dist/cjs/vis/treemap/index.js +2 -1
- package/dist/cjs/vis/venn/index.d.ts +2 -1
- package/dist/cjs/vis/venn/index.js +18 -3
- package/dist/cjs/vis/violin/index.js +2 -1
- package/dist/cjs/vis/waterfall/index.d.ts +6 -9
- package/dist/cjs/vis/waterfall/index.js +29 -6
- package/dist/cjs/vis/word-cloud/index.js +2 -1
- package/dist/cjs/vis-wrapper/icons.js +2 -2
- package/dist/cjs/vis-wrapper/index.d.ts +1 -0
- package/dist/cjs/vis-wrapper/index.js +27 -16
- package/dist/cjs/vis-wrapper/styles.d.ts +1 -1
- package/dist/cjs/vis-wrapper/styles.js +8 -1
- package/dist/esm/gpt-vis/index.d.ts +8 -1
- package/dist/esm/gpt-vis/index.js +47 -26
- package/dist/esm/index.d.ts +15 -2
- package/dist/esm/index.js +7 -1
- package/dist/esm/syntax/parser.d.ts +17 -2
- package/dist/esm/syntax/parser.js +248 -90
- package/dist/esm/util/container.d.ts +5 -0
- package/dist/esm/util/container.js +20 -0
- package/dist/esm/util/theme.d.ts +5 -0
- package/dist/esm/util/theme.js +9 -0
- package/dist/esm/vis/area/index.js +3 -2
- package/dist/esm/vis/bar/index.js +7 -6
- package/dist/esm/vis/boxplot/index.js +17 -4
- package/dist/esm/vis/column/index.js +7 -6
- package/dist/esm/vis/dual-axes/index.js +13 -5
- package/dist/esm/vis/fishbone-diagram/index.d.ts +35 -0
- package/dist/esm/vis/fishbone-diagram/index.js +219 -0
- package/dist/esm/vis/flow-diagram/index.d.ts +27 -0
- package/dist/esm/vis/flow-diagram/index.js +349 -0
- package/dist/esm/vis/funnel/index.js +3 -2
- package/dist/esm/vis/histogram/index.js +6 -7
- package/dist/esm/vis/indented-tree/index.d.ts +40 -0
- package/dist/esm/vis/indented-tree/index.js +569 -0
- package/dist/esm/vis/line/index.js +3 -2
- package/dist/esm/vis/liquid/index.js +3 -2
- package/dist/esm/vis/mindmap/index.d.ts +32 -0
- package/dist/esm/vis/mindmap/index.js +316 -0
- package/dist/esm/vis/network-graph/index.d.ts +59 -0
- package/dist/esm/vis/network-graph/index.js +242 -0
- package/dist/esm/vis/organization-chart/index.d.ts +64 -0
- package/dist/esm/vis/organization-chart/index.js +271 -0
- package/dist/esm/vis/pie/index.js +4 -8
- package/dist/esm/vis/radar/index.d.ts +1 -0
- package/dist/esm/vis/radar/index.js +20 -4
- package/dist/esm/vis/sankey/index.js +3 -2
- package/dist/esm/vis/scatter/index.d.ts +2 -0
- package/dist/esm/vis/scatter/index.js +15 -4
- package/dist/esm/vis/summary/index.js +25 -4
- package/dist/esm/vis/table/index.d.ts +1 -0
- package/dist/esm/vis/table/index.js +9 -2
- package/dist/esm/vis/treemap/index.js +3 -2
- package/dist/esm/vis/venn/index.d.ts +2 -1
- package/dist/esm/vis/venn/index.js +29 -4
- package/dist/esm/vis/violin/index.js +3 -2
- package/dist/esm/vis/waterfall/index.d.ts +6 -9
- package/dist/esm/vis/waterfall/index.js +33 -13
- package/dist/esm/vis/word-cloud/index.js +3 -2
- package/dist/esm/vis-wrapper/icons.js +2 -2
- package/dist/esm/vis-wrapper/index.d.ts +1 -0
- package/dist/esm/vis-wrapper/index.js +15 -10
- package/dist/esm/vis-wrapper/styles.d.ts +1 -1
- package/dist/esm/vis-wrapper/styles.js +1 -1
- package/dist/umd/index.min.js +1 -1
- package/package.json +17 -21
- package/src/gpt-vis/index.ts +0 -283
- package/src/index.ts +0 -44
- package/src/readme.md +0 -37
- package/src/syntax/index.ts +0 -2
- package/src/syntax/parser.ts +0 -411
- package/src/types/index.ts +0 -29
- package/src/util/theme.ts +0 -167
- package/src/vis/area/README.md +0 -143
- package/src/vis/area/index.ts +0 -212
- package/src/vis/bar/README.md +0 -158
- package/src/vis/bar/index.ts +0 -186
- package/src/vis/boxplot/README.md +0 -168
- package/src/vis/boxplot/index.ts +0 -162
- package/src/vis/column/README.md +0 -158
- package/src/vis/column/index.ts +0 -185
- package/src/vis/dual-axes/README.md +0 -191
- package/src/vis/dual-axes/index.ts +0 -218
- package/src/vis/funnel/README.md +0 -143
- package/src/vis/funnel/index.ts +0 -238
- package/src/vis/histogram/README.md +0 -130
- package/src/vis/histogram/index.ts +0 -153
- package/src/vis/line/README.md +0 -138
- package/src/vis/line/index.ts +0 -159
- package/src/vis/liquid/README.md +0 -150
- package/src/vis/liquid/index.ts +0 -130
- package/src/vis/pie/README.md +0 -127
- package/src/vis/pie/index.ts +0 -163
- package/src/vis/radar/README.md +0 -184
- package/src/vis/radar/index.ts +0 -214
- package/src/vis/sankey/README.md +0 -144
- package/src/vis/sankey/index.ts +0 -144
- package/src/vis/scatter/README.md +0 -145
- package/src/vis/scatter/index.ts +0 -147
- package/src/vis/summary/README.md +0 -272
- package/src/vis/summary/index.ts +0 -91
- package/src/vis/table/README.md +0 -174
- package/src/vis/table/index.ts +0 -241
- package/src/vis/treemap/README.md +0 -199
- package/src/vis/treemap/index.ts +0 -167
- package/src/vis/venn/README.md +0 -153
- package/src/vis/venn/index.ts +0 -149
- package/src/vis/violin/README.md +0 -168
- package/src/vis/violin/index.ts +0 -216
- package/src/vis/waterfall/README.md +0 -178
- package/src/vis/waterfall/index.ts +0 -258
- package/src/vis/word-cloud/README.md +0 -137
- package/src/vis/word-cloud/index.ts +0 -137
- package/src/vis-wrapper/README.md +0 -159
- package/src/vis-wrapper/icons.ts +0 -35
- package/src/vis-wrapper/index.ts +0 -276
- package/src/vis-wrapper/styles.ts +0 -195
|
@@ -1,191 +0,0 @@
|
|
|
1
|
-
# DualAxes
|
|
2
|
-
|
|
3
|
-
A dual-axes chart component that combines column and line charts for visualizing two different data series with different scales, built with G2 5.0.
|
|
4
|
-
|
|
5
|
-
## Usage
|
|
6
|
-
|
|
7
|
-
```ts
|
|
8
|
-
import { DualAxes } from '@antv/gpt-vis/ai';
|
|
9
|
-
|
|
10
|
-
const dualAxes = DualAxes({
|
|
11
|
-
container: '#container',
|
|
12
|
-
width: 600,
|
|
13
|
-
height: 400,
|
|
14
|
-
});
|
|
15
|
-
|
|
16
|
-
dualAxes.render({
|
|
17
|
-
categories: ['2018', '2019', '2020', '2021', '2022'],
|
|
18
|
-
series: [
|
|
19
|
-
{
|
|
20
|
-
type: 'column',
|
|
21
|
-
data: [91.9, 99.1, 101.6, 114.4, 121],
|
|
22
|
-
axisYTitle: 'Sales',
|
|
23
|
-
},
|
|
24
|
-
{
|
|
25
|
-
type: 'line',
|
|
26
|
-
data: [0.055, 0.06, 0.062, 0.07, 0.075],
|
|
27
|
-
axisYTitle: 'Profit Rate',
|
|
28
|
-
},
|
|
29
|
-
],
|
|
30
|
-
});
|
|
31
|
-
|
|
32
|
-
dualAxes.destroy();
|
|
33
|
-
```
|
|
34
|
-
|
|
35
|
-
## Configuration
|
|
36
|
-
|
|
37
|
-
### Constructor Options (DualAxesOptions)
|
|
38
|
-
|
|
39
|
-
| Property | Type | Default | Description |
|
|
40
|
-
| --------- | --------------------- | ------- | ----------------------------- |
|
|
41
|
-
| container | string \| HTMLElement | - | Container element or selector |
|
|
42
|
-
| width | number | 640 | Chart width in pixels |
|
|
43
|
-
| height | number | 480 | Chart height in pixels |
|
|
44
|
-
|
|
45
|
-
### Render Config (DualAxesConfig)
|
|
46
|
-
|
|
47
|
-
| Property | Type | Default | Description |
|
|
48
|
-
| ---------- | ------ | ----------- | ---------------------------- |
|
|
49
|
-
| type | string | 'dual-axes' | Chart type |
|
|
50
|
-
| categories | Array | - | X-axis categories (required) |
|
|
51
|
-
| series | Array | - | Series data array (required) |
|
|
52
|
-
| title | string | - | Chart title |
|
|
53
|
-
| axisXTitle | string | - | X-axis title |
|
|
54
|
-
| theme | string | 'default' | Color theme |
|
|
55
|
-
| style | object | - | Chart style configuration |
|
|
56
|
-
|
|
57
|
-
### Series Data Structure
|
|
58
|
-
|
|
59
|
-
```ts
|
|
60
|
-
type DualAxesSeriesItem = {
|
|
61
|
-
type: 'line' | 'column'; // Series type
|
|
62
|
-
data: number[]; // Data values
|
|
63
|
-
axisYTitle?: string; // Y-axis title for this series
|
|
64
|
-
};
|
|
65
|
-
```
|
|
66
|
-
|
|
67
|
-
### Style Options
|
|
68
|
-
|
|
69
|
-
```ts
|
|
70
|
-
style?: {
|
|
71
|
-
backgroundColor?: string; // Background color
|
|
72
|
-
palette?: string[]; // Color palette
|
|
73
|
-
startAtZero?: boolean; // Whether Y-axis starts at zero
|
|
74
|
-
}
|
|
75
|
-
```
|
|
76
|
-
|
|
77
|
-
## Examples
|
|
78
|
-
|
|
79
|
-
### Basic Dual-Axes Chart
|
|
80
|
-
|
|
81
|
-
```ts
|
|
82
|
-
dualAxes.render({
|
|
83
|
-
categories: ['2018', '2019', '2020', '2021', '2022'],
|
|
84
|
-
series: [
|
|
85
|
-
{
|
|
86
|
-
type: 'column',
|
|
87
|
-
data: [91.9, 99.1, 101.6, 114.4, 121],
|
|
88
|
-
axisYTitle: 'Sales',
|
|
89
|
-
},
|
|
90
|
-
{
|
|
91
|
-
type: 'line',
|
|
92
|
-
data: [0.055, 0.06, 0.062, 0.07, 0.075],
|
|
93
|
-
axisYTitle: 'Profit Rate',
|
|
94
|
-
},
|
|
95
|
-
],
|
|
96
|
-
});
|
|
97
|
-
```
|
|
98
|
-
|
|
99
|
-
### With Title and X-Axis Label
|
|
100
|
-
|
|
101
|
-
```ts
|
|
102
|
-
dualAxes.render({
|
|
103
|
-
categories: ['2018', '2019', '2020', '2021', '2022'],
|
|
104
|
-
title: '2018-2022 Sales and Profit Rate',
|
|
105
|
-
axisXTitle: 'Year',
|
|
106
|
-
series: [
|
|
107
|
-
{
|
|
108
|
-
type: 'column',
|
|
109
|
-
data: [91.9, 99.1, 101.6, 114.4, 121],
|
|
110
|
-
axisYTitle: 'Sales',
|
|
111
|
-
},
|
|
112
|
-
{
|
|
113
|
-
type: 'line',
|
|
114
|
-
data: [0.055, 0.06, 0.062, 0.07, 0.075],
|
|
115
|
-
axisYTitle: 'Profit Rate',
|
|
116
|
-
},
|
|
117
|
-
],
|
|
118
|
-
});
|
|
119
|
-
```
|
|
120
|
-
|
|
121
|
-
### With Academy Theme
|
|
122
|
-
|
|
123
|
-
```ts
|
|
124
|
-
dualAxes.render({
|
|
125
|
-
categories: ['2020', '2021', '2022'],
|
|
126
|
-
series: [
|
|
127
|
-
{
|
|
128
|
-
type: 'column',
|
|
129
|
-
data: [500, 600, 700],
|
|
130
|
-
axisYTitle: 'Revenue',
|
|
131
|
-
},
|
|
132
|
-
{
|
|
133
|
-
type: 'line',
|
|
134
|
-
data: [10, 12, 15],
|
|
135
|
-
axisYTitle: 'Growth Rate',
|
|
136
|
-
},
|
|
137
|
-
],
|
|
138
|
-
theme: 'academy',
|
|
139
|
-
});
|
|
140
|
-
```
|
|
141
|
-
|
|
142
|
-
### With Custom Styles
|
|
143
|
-
|
|
144
|
-
```ts
|
|
145
|
-
dualAxes.render({
|
|
146
|
-
categories: ['Jan', 'Feb', 'Mar', 'Apr', 'May'],
|
|
147
|
-
series: [
|
|
148
|
-
{
|
|
149
|
-
type: 'column',
|
|
150
|
-
data: [120, 150, 180, 210, 240],
|
|
151
|
-
axisYTitle: 'Sales',
|
|
152
|
-
},
|
|
153
|
-
{
|
|
154
|
-
type: 'line',
|
|
155
|
-
data: [8, 10, 12, 15, 18],
|
|
156
|
-
axisYTitle: 'Growth',
|
|
157
|
-
},
|
|
158
|
-
],
|
|
159
|
-
style: {
|
|
160
|
-
palette: ['#5B8FF9', '#61DDAA'],
|
|
161
|
-
backgroundColor: '#F8F9FA',
|
|
162
|
-
startAtZero: true,
|
|
163
|
-
},
|
|
164
|
-
});
|
|
165
|
-
```
|
|
166
|
-
|
|
167
|
-
### Dark Theme
|
|
168
|
-
|
|
169
|
-
```ts
|
|
170
|
-
dualAxes.render({
|
|
171
|
-
categories: ['Q1', 'Q2', 'Q3', 'Q4'],
|
|
172
|
-
series: [
|
|
173
|
-
{
|
|
174
|
-
type: 'column',
|
|
175
|
-
data: [100, 120, 140, 160],
|
|
176
|
-
axisYTitle: 'Revenue',
|
|
177
|
-
},
|
|
178
|
-
{
|
|
179
|
-
type: 'line',
|
|
180
|
-
data: [5, 6, 7, 8],
|
|
181
|
-
axisYTitle: 'Profit',
|
|
182
|
-
},
|
|
183
|
-
],
|
|
184
|
-
theme: 'dark',
|
|
185
|
-
});
|
|
186
|
-
```
|
|
187
|
-
|
|
188
|
-
## Methods
|
|
189
|
-
|
|
190
|
-
- `render(config: DualAxesConfig): void` - Render or update the chart
|
|
191
|
-
- `destroy(): void` - Destroy the chart instance and clean up resources
|
|
@@ -1,218 +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
|
-
* DualAxesSeriesItem defines a single series in the dual-axes chart.
|
|
7
|
-
*/
|
|
8
|
-
export type DualAxesSeriesItem = {
|
|
9
|
-
type: 'line' | 'column';
|
|
10
|
-
data: number[];
|
|
11
|
-
axisYTitle?: string;
|
|
12
|
-
};
|
|
13
|
-
|
|
14
|
-
/**
|
|
15
|
-
* DualAxesConfig defines the configuration for rendering the dual-axes chart.
|
|
16
|
-
*/
|
|
17
|
-
export interface DualAxesConfig {
|
|
18
|
-
type?: 'dual-axes';
|
|
19
|
-
categories: string[];
|
|
20
|
-
series: DualAxesSeriesItem[];
|
|
21
|
-
title?: string;
|
|
22
|
-
axisXTitle?: string;
|
|
23
|
-
theme?: 'default' | 'academy' | 'dark';
|
|
24
|
-
style?: {
|
|
25
|
-
backgroundColor?: string;
|
|
26
|
-
palette?: string[];
|
|
27
|
-
startAtZero?: boolean;
|
|
28
|
-
};
|
|
29
|
-
}
|
|
30
|
-
|
|
31
|
-
/**
|
|
32
|
-
* DualAxesInstance represents a dual-axes chart instance with render and destroy methods.
|
|
33
|
-
*/
|
|
34
|
-
export interface DualAxesInstance {
|
|
35
|
-
render: (config: DualAxesConfig) => void;
|
|
36
|
-
destroy: () => void;
|
|
37
|
-
}
|
|
38
|
-
|
|
39
|
-
/**
|
|
40
|
-
* Transform series data to G2 format.
|
|
41
|
-
* Combines multiple series into a single data array with categories.
|
|
42
|
-
*/
|
|
43
|
-
function transformData(series: DualAxesSeriesItem[], categories: string[]) {
|
|
44
|
-
return categories.map((category, index) => {
|
|
45
|
-
const dataPoint: any = { category };
|
|
46
|
-
series.forEach((s, i) => {
|
|
47
|
-
const yField = s.axisYTitle || `value_${i + 1}`;
|
|
48
|
-
dataPoint[yField] = s.data[index];
|
|
49
|
-
});
|
|
50
|
-
return dataPoint;
|
|
51
|
-
});
|
|
52
|
-
}
|
|
53
|
-
|
|
54
|
-
/**
|
|
55
|
-
* DualAxes chart component using G2 5.0.
|
|
56
|
-
*
|
|
57
|
-
* @example
|
|
58
|
-
* ```ts
|
|
59
|
-
* const dualAxes = DualAxes({
|
|
60
|
-
* container: '#container',
|
|
61
|
-
* width: 600,
|
|
62
|
-
* height: 400,
|
|
63
|
-
* });
|
|
64
|
-
*
|
|
65
|
-
* dualAxes.render({
|
|
66
|
-
* type: 'dual-axes',
|
|
67
|
-
* categories: ['2018', '2019', '2020', '2021', '2022'],
|
|
68
|
-
* series: [
|
|
69
|
-
* {
|
|
70
|
-
* type: 'column',
|
|
71
|
-
* data: [91.9, 99.1, 101.6, 114.4, 121],
|
|
72
|
-
* axisYTitle: '销售额',
|
|
73
|
-
* },
|
|
74
|
-
* {
|
|
75
|
-
* type: 'line',
|
|
76
|
-
* data: [0.055, 0.06, 0.062, 0.07, 0.075],
|
|
77
|
-
* axisYTitle: '利润率',
|
|
78
|
-
* },
|
|
79
|
-
* ],
|
|
80
|
-
* });
|
|
81
|
-
*
|
|
82
|
-
* dualAxes.destroy();
|
|
83
|
-
* ```
|
|
84
|
-
*/
|
|
85
|
-
export const DualAxes = (options: VisualizationOptions): DualAxesInstance => {
|
|
86
|
-
const { container, width, height, theme: chartTheme = 'default' } = options;
|
|
87
|
-
let chart: Chart | null = null;
|
|
88
|
-
|
|
89
|
-
/**
|
|
90
|
-
* Render the dual-axes chart with the given configuration.
|
|
91
|
-
*/
|
|
92
|
-
const render = (config: DualAxesConfig): void => {
|
|
93
|
-
const { categories, series, theme = chartTheme, title, axisXTitle, style = {} } = config;
|
|
94
|
-
|
|
95
|
-
// Clean up previous chart if exists
|
|
96
|
-
if (chart) {
|
|
97
|
-
chart.destroy();
|
|
98
|
-
}
|
|
99
|
-
|
|
100
|
-
const { startAtZero = false } = style;
|
|
101
|
-
const colors = style.palette || getThemeColors(theme);
|
|
102
|
-
const backgroundColor = style.backgroundColor || getBackgroundColor(theme);
|
|
103
|
-
|
|
104
|
-
// Transform data
|
|
105
|
-
const data = transformData(series, categories);
|
|
106
|
-
|
|
107
|
-
// Create chart
|
|
108
|
-
chart = new Chart({
|
|
109
|
-
container,
|
|
110
|
-
width,
|
|
111
|
-
height,
|
|
112
|
-
autoFit: true,
|
|
113
|
-
});
|
|
114
|
-
|
|
115
|
-
// Sort series: column first, then line (line rendered last appears on top)
|
|
116
|
-
const sortedSeries = [...series].sort((a, b) => {
|
|
117
|
-
const order = ['column', 'line'];
|
|
118
|
-
return order.indexOf(a.type) - order.indexOf(b.type);
|
|
119
|
-
});
|
|
120
|
-
|
|
121
|
-
// Create children configurations for each series
|
|
122
|
-
const children = sortedSeries.map((item, index) => {
|
|
123
|
-
const yField = item.axisYTitle || `value_${index + 1}`;
|
|
124
|
-
const color = colors[index % colors.length];
|
|
125
|
-
|
|
126
|
-
if (item.type === 'column') {
|
|
127
|
-
return {
|
|
128
|
-
type: 'interval',
|
|
129
|
-
encode: {
|
|
130
|
-
x: 'category',
|
|
131
|
-
y: yField,
|
|
132
|
-
color: () => yField,
|
|
133
|
-
},
|
|
134
|
-
scale: {
|
|
135
|
-
y: { nice: true, zero: startAtZero },
|
|
136
|
-
color: { range: [color] },
|
|
137
|
-
},
|
|
138
|
-
axis: {
|
|
139
|
-
y: { title: item.axisYTitle || '' },
|
|
140
|
-
},
|
|
141
|
-
style: {
|
|
142
|
-
columnWidthRatio: 0.8,
|
|
143
|
-
radiusTopLeft: 4,
|
|
144
|
-
radiusTopRight: 4,
|
|
145
|
-
},
|
|
146
|
-
};
|
|
147
|
-
} else {
|
|
148
|
-
// line type
|
|
149
|
-
return {
|
|
150
|
-
type: 'line',
|
|
151
|
-
encode: {
|
|
152
|
-
x: 'category',
|
|
153
|
-
y: yField,
|
|
154
|
-
shape: 'smooth',
|
|
155
|
-
color: () => yField,
|
|
156
|
-
},
|
|
157
|
-
scale: {
|
|
158
|
-
y: { independent: true, zero: startAtZero },
|
|
159
|
-
color: { range: [color] },
|
|
160
|
-
},
|
|
161
|
-
axis: {
|
|
162
|
-
y: { position: 'right', title: item.axisYTitle || '' },
|
|
163
|
-
},
|
|
164
|
-
style: {
|
|
165
|
-
lineWidth: 2,
|
|
166
|
-
},
|
|
167
|
-
};
|
|
168
|
-
}
|
|
169
|
-
});
|
|
170
|
-
|
|
171
|
-
// Configure chart options
|
|
172
|
-
// Note: Using 'any' type due to G2's complex type system with transformations
|
|
173
|
-
// This is consistent with how G2 5.0 is used elsewhere in the codebase
|
|
174
|
-
const chartOptions: any = {
|
|
175
|
-
type: 'view',
|
|
176
|
-
data,
|
|
177
|
-
title: title ?? '',
|
|
178
|
-
children,
|
|
179
|
-
axis: {
|
|
180
|
-
x: { title: axisXTitle || false },
|
|
181
|
-
},
|
|
182
|
-
scale: {
|
|
183
|
-
y: { nice: true },
|
|
184
|
-
},
|
|
185
|
-
legend: {
|
|
186
|
-
color: {
|
|
187
|
-
position: 'top',
|
|
188
|
-
itemMarker: (v: string, index: number) => {
|
|
189
|
-
const seriesItem = series[index];
|
|
190
|
-
return seriesItem?.type === 'line' ? 'smooth' : 'rect';
|
|
191
|
-
},
|
|
192
|
-
},
|
|
193
|
-
},
|
|
194
|
-
viewStyle: {
|
|
195
|
-
viewFill: backgroundColor,
|
|
196
|
-
},
|
|
197
|
-
theme: getThemeObject(theme),
|
|
198
|
-
};
|
|
199
|
-
|
|
200
|
-
chart.options(chartOptions);
|
|
201
|
-
chart.render();
|
|
202
|
-
};
|
|
203
|
-
|
|
204
|
-
/**
|
|
205
|
-
* Destroy the chart instance and clean up resources.
|
|
206
|
-
*/
|
|
207
|
-
const destroy = (): void => {
|
|
208
|
-
if (chart) {
|
|
209
|
-
chart.destroy();
|
|
210
|
-
chart = null;
|
|
211
|
-
}
|
|
212
|
-
};
|
|
213
|
-
|
|
214
|
-
return {
|
|
215
|
-
render,
|
|
216
|
-
destroy,
|
|
217
|
-
};
|
|
218
|
-
};
|
package/src/vis/funnel/README.md
DELETED
|
@@ -1,143 +0,0 @@
|
|
|
1
|
-
# Funnel
|
|
2
|
-
|
|
3
|
-
A funnel chart component for displaying multi-stage data flow and conversion rates, built with G2 5.0. Ideal for analyzing sales processes, user conversion, and activity participation.
|
|
4
|
-
|
|
5
|
-
## Usage
|
|
6
|
-
|
|
7
|
-
```ts
|
|
8
|
-
import { Funnel } from '@antv/gpt-vis/ai';
|
|
9
|
-
|
|
10
|
-
const funnel = Funnel({
|
|
11
|
-
container: '#container',
|
|
12
|
-
width: 600,
|
|
13
|
-
height: 400,
|
|
14
|
-
});
|
|
15
|
-
|
|
16
|
-
funnel.render({
|
|
17
|
-
data: [
|
|
18
|
-
{ category: '访问', value: 1000 },
|
|
19
|
-
{ category: '咨询', value: 600 },
|
|
20
|
-
{ category: '下单', value: 300 },
|
|
21
|
-
{ category: '成交', value: 120 },
|
|
22
|
-
],
|
|
23
|
-
});
|
|
24
|
-
|
|
25
|
-
funnel.destroy();
|
|
26
|
-
```
|
|
27
|
-
|
|
28
|
-
## Configuration
|
|
29
|
-
|
|
30
|
-
### Constructor Options (FunnelOptions)
|
|
31
|
-
|
|
32
|
-
| Property | Type | Default | Description |
|
|
33
|
-
| --------- | --------------------- | ------- | ----------------------------- |
|
|
34
|
-
| container | string \| HTMLElement | - | Container element or selector |
|
|
35
|
-
| width | number | 640 | Chart width in pixels |
|
|
36
|
-
| height | number | 480 | Chart height in pixels |
|
|
37
|
-
|
|
38
|
-
### Render Config (FunnelConfig)
|
|
39
|
-
|
|
40
|
-
| Property | Type | Default | Description |
|
|
41
|
-
| -------- | -------------------------------- | --------- | ------------------------- |
|
|
42
|
-
| data | FunnelDataItem[] | - | Chart data array |
|
|
43
|
-
| theme | 'default' \| 'academy' \| 'dark' | 'default' | Color theme |
|
|
44
|
-
| title | string | - | Chart title |
|
|
45
|
-
| style | object | - | Chart style configuration |
|
|
46
|
-
|
|
47
|
-
### FunnelDataItem
|
|
48
|
-
|
|
49
|
-
```ts
|
|
50
|
-
type FunnelDataItem = {
|
|
51
|
-
category: string; // Stage name
|
|
52
|
-
value: number; // Stage value
|
|
53
|
-
};
|
|
54
|
-
```
|
|
55
|
-
|
|
56
|
-
### Style Options
|
|
57
|
-
|
|
58
|
-
```ts
|
|
59
|
-
style?: {
|
|
60
|
-
backgroundColor?: string; // Background color
|
|
61
|
-
palette?: string[]; // Color palette
|
|
62
|
-
}
|
|
63
|
-
```
|
|
64
|
-
|
|
65
|
-
## Examples
|
|
66
|
-
|
|
67
|
-
### Basic Funnel Chart
|
|
68
|
-
|
|
69
|
-
```ts
|
|
70
|
-
funnel.render({
|
|
71
|
-
data: [
|
|
72
|
-
{ category: '访问', value: 1000 },
|
|
73
|
-
{ category: '咨询', value: 600 },
|
|
74
|
-
{ category: '下单', value: 300 },
|
|
75
|
-
{ category: '成交', value: 120 },
|
|
76
|
-
],
|
|
77
|
-
});
|
|
78
|
-
```
|
|
79
|
-
|
|
80
|
-
### With Title
|
|
81
|
-
|
|
82
|
-
```ts
|
|
83
|
-
funnel.render({
|
|
84
|
-
data: [
|
|
85
|
-
{ category: '访问', value: 1000 },
|
|
86
|
-
{ category: '咨询', value: 600 },
|
|
87
|
-
{ category: '下单', value: 300 },
|
|
88
|
-
{ category: '成交', value: 120 },
|
|
89
|
-
],
|
|
90
|
-
title: '销售漏斗',
|
|
91
|
-
});
|
|
92
|
-
```
|
|
93
|
-
|
|
94
|
-
### Academy Theme
|
|
95
|
-
|
|
96
|
-
```ts
|
|
97
|
-
funnel.render({
|
|
98
|
-
data: [
|
|
99
|
-
{ category: '注册', value: 800 },
|
|
100
|
-
{ category: '激活', value: 500 },
|
|
101
|
-
{ category: '付费', value: 200 },
|
|
102
|
-
],
|
|
103
|
-
theme: 'academy',
|
|
104
|
-
title: '用户转化流程',
|
|
105
|
-
});
|
|
106
|
-
```
|
|
107
|
-
|
|
108
|
-
### Dark Theme
|
|
109
|
-
|
|
110
|
-
```ts
|
|
111
|
-
funnel.render({
|
|
112
|
-
data: [
|
|
113
|
-
{ category: '访问', value: 1000 },
|
|
114
|
-
{ category: '咨询', value: 600 },
|
|
115
|
-
{ category: '下单', value: 300 },
|
|
116
|
-
{ category: '成交', value: 120 },
|
|
117
|
-
],
|
|
118
|
-
theme: 'dark',
|
|
119
|
-
});
|
|
120
|
-
```
|
|
121
|
-
|
|
122
|
-
### Custom Styles
|
|
123
|
-
|
|
124
|
-
```ts
|
|
125
|
-
// Custom colors
|
|
126
|
-
funnel.render({
|
|
127
|
-
data: [
|
|
128
|
-
{ category: '报名', value: 1500 },
|
|
129
|
-
{ category: '签到', value: 900 },
|
|
130
|
-
{ category: '参与', value: 700 },
|
|
131
|
-
],
|
|
132
|
-
title: '活动参与漏斗',
|
|
133
|
-
style: {
|
|
134
|
-
palette: ['#FF7F50', '#87CEFA', '#32CD32'],
|
|
135
|
-
backgroundColor: '#FFF8DC',
|
|
136
|
-
},
|
|
137
|
-
});
|
|
138
|
-
```
|
|
139
|
-
|
|
140
|
-
## Methods
|
|
141
|
-
|
|
142
|
-
- `render(config: FunnelConfig): void` - Render or update the chart
|
|
143
|
-
- `destroy(): void` - Destroy the chart instance and clean up resources
|