@agions/taroviz 1.5.0 → 1.6.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 +4 -4
- package/dist/cjs/index.js +1 -1
- package/dist/esm/index.js +810 -10
- package/package.json +1 -1
- package/src/charts/boxplot/__tests__/index.test.tsx +130 -0
- package/src/charts/boxplot/index.tsx +18 -0
- package/src/charts/boxplot/types.ts +46 -0
- package/src/charts/index.ts +5 -1
- package/src/charts/parallel/__tests__/index.test.tsx +164 -0
- package/src/charts/parallel/index.tsx +18 -0
- package/src/charts/parallel/types.ts +73 -0
- package/src/editor/EnhancedThemeEditor.tsx +624 -0
- package/src/index.ts +14 -9
package/package.json
CHANGED
|
@@ -0,0 +1,130 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @jest-environment jsdom
|
|
3
|
+
*/
|
|
4
|
+
import React from 'react';
|
|
5
|
+
import { render } from '@testing-library/react';
|
|
6
|
+
import '@testing-library/jest-dom';
|
|
7
|
+
import BoxplotChart from '../index';
|
|
8
|
+
|
|
9
|
+
// Mock ECharts and adapters
|
|
10
|
+
jest.mock('echarts/core', () => ({
|
|
11
|
+
use: jest.fn(),
|
|
12
|
+
init: jest.fn(() => ({
|
|
13
|
+
setOption: jest.fn(),
|
|
14
|
+
showLoading: jest.fn(),
|
|
15
|
+
hideLoading: jest.fn(),
|
|
16
|
+
on: jest.fn(),
|
|
17
|
+
off: jest.fn(),
|
|
18
|
+
dispose: jest.fn(),
|
|
19
|
+
resize: jest.fn(),
|
|
20
|
+
})),
|
|
21
|
+
getInstanceByDom: jest.fn(),
|
|
22
|
+
}));
|
|
23
|
+
|
|
24
|
+
// Mock ECharts components
|
|
25
|
+
jest.mock('echarts/components', () => ({
|
|
26
|
+
GridComponent: jest.fn(),
|
|
27
|
+
TooltipComponent: jest.fn(),
|
|
28
|
+
TitleComponent: jest.fn(),
|
|
29
|
+
LegendComponent: jest.fn(),
|
|
30
|
+
}));
|
|
31
|
+
|
|
32
|
+
// Mock BaseChartWrapper
|
|
33
|
+
jest.mock('../../common/BaseChartWrapper', () => ({
|
|
34
|
+
__esModule: true,
|
|
35
|
+
default: (props: any) => (
|
|
36
|
+
<div
|
|
37
|
+
data-testid="boxplot-chart"
|
|
38
|
+
className={`taroviz-boxplot ${props.className || ''}`}
|
|
39
|
+
style={{ width: props.width || '100%', height: props.height || 300, ...props.style }}
|
|
40
|
+
>
|
|
41
|
+
<div data-testid="chart-option">{JSON.stringify(props.option)}</div>
|
|
42
|
+
</div>
|
|
43
|
+
),
|
|
44
|
+
}));
|
|
45
|
+
|
|
46
|
+
describe('BoxplotChart', () => {
|
|
47
|
+
const basicOption = {
|
|
48
|
+
title: { text: '箱线图测试' },
|
|
49
|
+
xAxis: { type: 'category' as const, data: ['A', 'B', 'C'] },
|
|
50
|
+
yAxis: { type: 'value' as const },
|
|
51
|
+
series: [{
|
|
52
|
+
type: 'boxplot' as const,
|
|
53
|
+
data: [
|
|
54
|
+
[850, 940, 980, 1050, 1130],
|
|
55
|
+
[920, 1000, 1050, 1150, 1200],
|
|
56
|
+
[780, 850, 920, 1050, 1150],
|
|
57
|
+
],
|
|
58
|
+
}],
|
|
59
|
+
};
|
|
60
|
+
|
|
61
|
+
describe('Basic Rendering', () => {
|
|
62
|
+
it('should render without crashing', () => {
|
|
63
|
+
const { getByTestId } = render(<BoxplotChart option={basicOption} />);
|
|
64
|
+
expect(getByTestId('boxplot-chart')).toBeInTheDocument();
|
|
65
|
+
});
|
|
66
|
+
|
|
67
|
+
it('should render with custom width and height', () => {
|
|
68
|
+
const { getByTestId } = render(<BoxplotChart option={basicOption} width={600} height={500} />);
|
|
69
|
+
expect(getByTestId('boxplot-chart')).toBeInTheDocument();
|
|
70
|
+
});
|
|
71
|
+
|
|
72
|
+
it('should have correct display name', () => {
|
|
73
|
+
expect(BoxplotChart.displayName).toBe('BoxplotChart');
|
|
74
|
+
});
|
|
75
|
+
|
|
76
|
+
it('should pass option to wrapper', () => {
|
|
77
|
+
const { getByTestId } = render(<BoxplotChart option={basicOption} />);
|
|
78
|
+
expect(getByTestId('chart-option')).toHaveTextContent('箱线图测试');
|
|
79
|
+
});
|
|
80
|
+
});
|
|
81
|
+
|
|
82
|
+
describe('Props', () => {
|
|
83
|
+
it('should accept className prop', () => {
|
|
84
|
+
const { getByTestId } = render(<BoxplotChart option={basicOption} className="test-class" />);
|
|
85
|
+
expect(getByTestId('boxplot-chart')).toHaveClass('test-class');
|
|
86
|
+
});
|
|
87
|
+
|
|
88
|
+
it('should accept style prop', () => {
|
|
89
|
+
const { getByTestId } = render(<BoxplotChart option={basicOption} style={{ padding: '10px' }} />);
|
|
90
|
+
expect(getByTestId('boxplot-chart')).toBeInTheDocument();
|
|
91
|
+
});
|
|
92
|
+
|
|
93
|
+
it('should accept loading prop', () => {
|
|
94
|
+
const { getByTestId } = render(<BoxplotChart option={basicOption} loading={true} />);
|
|
95
|
+
expect(getByTestId('boxplot-chart')).toBeInTheDocument();
|
|
96
|
+
});
|
|
97
|
+
|
|
98
|
+
it('should accept theme prop', () => {
|
|
99
|
+
const { getByTestId } = render(<BoxplotChart option={basicOption} theme="dark" />);
|
|
100
|
+
expect(getByTestId('boxplot-chart')).toBeInTheDocument();
|
|
101
|
+
});
|
|
102
|
+
});
|
|
103
|
+
|
|
104
|
+
describe('Chart Options', () => {
|
|
105
|
+
it('should render with multiple data series', () => {
|
|
106
|
+
const multiOption = {
|
|
107
|
+
...basicOption,
|
|
108
|
+
series: [
|
|
109
|
+
{ type: 'boxplot' as const, name: '2024', data: [[850, 940, 980, 1050, 1130]] },
|
|
110
|
+
{ type: 'boxplot' as const, name: '2025', data: [[920, 1000, 1050, 1150, 1200]] },
|
|
111
|
+
],
|
|
112
|
+
};
|
|
113
|
+
const { getByTestId } = render(<BoxplotChart option={multiOption} />);
|
|
114
|
+
expect(getByTestId('boxplot-chart')).toBeInTheDocument();
|
|
115
|
+
});
|
|
116
|
+
|
|
117
|
+
it('should render with custom itemStyle', () => {
|
|
118
|
+
const optionWithStyle = {
|
|
119
|
+
...basicOption,
|
|
120
|
+
series: [{
|
|
121
|
+
type: 'boxplot' as const,
|
|
122
|
+
data: [[850, 940, 980, 1050, 1130]],
|
|
123
|
+
itemStyle: { color: '#1890ff', borderColor: '#000' },
|
|
124
|
+
}],
|
|
125
|
+
};
|
|
126
|
+
const { getByTestId } = render(<BoxplotChart option={optionWithStyle} />);
|
|
127
|
+
expect(getByTestId('boxplot-chart')).toBeInTheDocument();
|
|
128
|
+
});
|
|
129
|
+
});
|
|
130
|
+
});
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* 箱线图组件
|
|
3
|
+
* 用于展示数据的分布情况,包括最小值、Q1、中位数、Q3、最大值
|
|
4
|
+
*/
|
|
5
|
+
import React, { memo } from 'react';
|
|
6
|
+
import BaseChartWrapper from '../common/BaseChartWrapper';
|
|
7
|
+
import { BoxplotChartProps } from './types';
|
|
8
|
+
|
|
9
|
+
const BoxplotChart: React.FC<BoxplotChartProps> = memo((props) => (
|
|
10
|
+
<BaseChartWrapper {...props} chartType="boxplot" />
|
|
11
|
+
));
|
|
12
|
+
|
|
13
|
+
BoxplotChart.displayName = 'BoxplotChart';
|
|
14
|
+
|
|
15
|
+
export default BoxplotChart;
|
|
16
|
+
|
|
17
|
+
// 导出类型
|
|
18
|
+
export type { BoxplotChartProps, BoxplotOption, BoxplotSeriesItem } from './types';
|
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* 箱线图类型定义
|
|
3
|
+
*/
|
|
4
|
+
|
|
5
|
+
export type BoxplotChartProps = {
|
|
6
|
+
option?: BoxplotOption;
|
|
7
|
+
width?: string | number;
|
|
8
|
+
height?: string | number;
|
|
9
|
+
className?: string;
|
|
10
|
+
style?: React.CSSProperties;
|
|
11
|
+
onEvents?: Record<string, (params: any) => void>;
|
|
12
|
+
loading?: boolean;
|
|
13
|
+
loadingOption?: any;
|
|
14
|
+
theme?: string;
|
|
15
|
+
onChartReady?: (chart: any) => void;
|
|
16
|
+
opts?: {
|
|
17
|
+
devicePixelRatio?: number;
|
|
18
|
+
renderer?: 'canvas' | 'svg';
|
|
19
|
+
useDirtyRect?: boolean;
|
|
20
|
+
};
|
|
21
|
+
};
|
|
22
|
+
|
|
23
|
+
export interface BoxplotOption {
|
|
24
|
+
title?: any;
|
|
25
|
+
legend?: any;
|
|
26
|
+
grid?: any;
|
|
27
|
+
xAxis?: any;
|
|
28
|
+
yAxis?: any;
|
|
29
|
+
tooltip?: any;
|
|
30
|
+
series: BoxplotSeriesItem[];
|
|
31
|
+
dataset?: any;
|
|
32
|
+
color?: string[];
|
|
33
|
+
backgroundColor?: any;
|
|
34
|
+
textStyle?: any;
|
|
35
|
+
[key: string]: any;
|
|
36
|
+
}
|
|
37
|
+
|
|
38
|
+
export interface BoxplotSeriesItem {
|
|
39
|
+
type: 'boxplot';
|
|
40
|
+
name?: string;
|
|
41
|
+
data?: any[];
|
|
42
|
+
itemStyle?: any;
|
|
43
|
+
emphasis?: any;
|
|
44
|
+
dimensions?: string[];
|
|
45
|
+
encode?: any;
|
|
46
|
+
}
|
package/src/charts/index.ts
CHANGED
|
@@ -22,10 +22,14 @@ export { default as GraphChart } from './graph';
|
|
|
22
22
|
export { default as CandlestickChart } from './candlestick';
|
|
23
23
|
export { default as WordCloudChart } from './wordcloud';
|
|
24
24
|
|
|
25
|
+
// 导出 v1.6.0 新增图表组件
|
|
26
|
+
export { default as BoxplotChart } from './boxplot';
|
|
27
|
+
export { default as ParallelChart } from './parallel';
|
|
28
|
+
|
|
25
29
|
// 导出类型定义
|
|
26
30
|
export * from './types';
|
|
27
31
|
|
|
28
32
|
/**
|
|
29
33
|
* 版本信息
|
|
30
34
|
*/
|
|
31
|
-
export const version = '1.
|
|
35
|
+
export const version = '1.6.0';
|
|
@@ -0,0 +1,164 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @jest-environment jsdom
|
|
3
|
+
*/
|
|
4
|
+
import React from 'react';
|
|
5
|
+
import { render, screen } from '@testing-library/react';
|
|
6
|
+
import '@testing-library/jest-dom';
|
|
7
|
+
import ParallelChart from '../index';
|
|
8
|
+
|
|
9
|
+
// Mock ECharts and adapters
|
|
10
|
+
jest.mock('echarts/core', () => ({
|
|
11
|
+
use: jest.fn(),
|
|
12
|
+
init: jest.fn(() => ({
|
|
13
|
+
setOption: jest.fn(),
|
|
14
|
+
showLoading: jest.fn(),
|
|
15
|
+
hideLoading: jest.fn(),
|
|
16
|
+
on: jest.fn(),
|
|
17
|
+
off: jest.fn(),
|
|
18
|
+
dispose: jest.fn(),
|
|
19
|
+
resize: jest.fn(),
|
|
20
|
+
})),
|
|
21
|
+
getInstanceByDom: jest.fn(),
|
|
22
|
+
}));
|
|
23
|
+
|
|
24
|
+
// Mock ECharts components
|
|
25
|
+
jest.mock('echarts/components', () => ({
|
|
26
|
+
GridComponent: jest.fn(),
|
|
27
|
+
TooltipComponent: jest.fn(),
|
|
28
|
+
TitleComponent: jest.fn(),
|
|
29
|
+
LegendComponent: jest.fn(),
|
|
30
|
+
}));
|
|
31
|
+
|
|
32
|
+
// Mock BaseChartWrapper
|
|
33
|
+
jest.mock('../../common/BaseChartWrapper', () => ({
|
|
34
|
+
__esModule: true,
|
|
35
|
+
default: (props: any) => (
|
|
36
|
+
<div
|
|
37
|
+
data-testid="parallel-chart"
|
|
38
|
+
className={`taroviz-parallel ${props.className || ''}`}
|
|
39
|
+
style={{ width: props.width || '100%', height: props.height || 300, ...props.style }}
|
|
40
|
+
>
|
|
41
|
+
<div data-testid="chart-option">{JSON.stringify(props.option)}</div>
|
|
42
|
+
</div>
|
|
43
|
+
),
|
|
44
|
+
}));
|
|
45
|
+
|
|
46
|
+
describe('ParallelChart', () => {
|
|
47
|
+
const basicOption = {
|
|
48
|
+
title: { text: '平行坐标图测试' },
|
|
49
|
+
parallel: {
|
|
50
|
+
left: '5%',
|
|
51
|
+
right: '10%',
|
|
52
|
+
bottom: '10%',
|
|
53
|
+
top: '20%',
|
|
54
|
+
height: '50%',
|
|
55
|
+
},
|
|
56
|
+
parallelAxisDefault: {
|
|
57
|
+
type: 'value' as const,
|
|
58
|
+
name: '指标',
|
|
59
|
+
},
|
|
60
|
+
series: [{
|
|
61
|
+
type: 'parallel' as const,
|
|
62
|
+
lineStyle: { width: 2, opacity: 0.5 },
|
|
63
|
+
data: [
|
|
64
|
+
[1, 55, 9, 56, 0.46, 2, 35],
|
|
65
|
+
[2, 25, 11, 21, 0.65, 2, 33],
|
|
66
|
+
[3, 56, 7, 63, 0.92, 3, 45],
|
|
67
|
+
],
|
|
68
|
+
}],
|
|
69
|
+
};
|
|
70
|
+
|
|
71
|
+
describe('Basic Rendering', () => {
|
|
72
|
+
it('should render without crashing', () => {
|
|
73
|
+
render(<ParallelChart option={basicOption} />);
|
|
74
|
+
expect(screen.getByTestId('parallel-chart')).toBeInTheDocument();
|
|
75
|
+
});
|
|
76
|
+
|
|
77
|
+
it('should render with custom width and height', () => {
|
|
78
|
+
render(<ParallelChart option={basicOption} width={600} height={500} />);
|
|
79
|
+
expect(screen.getByTestId('parallel-chart')).toBeInTheDocument();
|
|
80
|
+
});
|
|
81
|
+
|
|
82
|
+
it('should have correct display name', () => {
|
|
83
|
+
expect(ParallelChart.displayName).toBe('ParallelChart');
|
|
84
|
+
});
|
|
85
|
+
|
|
86
|
+
it('should pass option to wrapper', () => {
|
|
87
|
+
render(<ParallelChart option={basicOption} />);
|
|
88
|
+
expect(screen.getByTestId('chart-option')).toHaveTextContent('平行坐标图测试');
|
|
89
|
+
});
|
|
90
|
+
});
|
|
91
|
+
|
|
92
|
+
describe('Props', () => {
|
|
93
|
+
it('should accept className prop', () => {
|
|
94
|
+
render(<ParallelChart option={basicOption} className="test-class" />);
|
|
95
|
+
expect(screen.getByTestId('parallel-chart')).toHaveClass('test-class');
|
|
96
|
+
});
|
|
97
|
+
|
|
98
|
+
it('should accept style prop', () => {
|
|
99
|
+
const style = { padding: '10px' };
|
|
100
|
+
render(<ParallelChart option={basicOption} style={style} />);
|
|
101
|
+
expect(screen.getByTestId('parallel-chart')).toBeInTheDocument();
|
|
102
|
+
});
|
|
103
|
+
|
|
104
|
+
it('should accept loading prop', () => {
|
|
105
|
+
render(<ParallelChart option={basicOption} loading={true} />);
|
|
106
|
+
expect(screen.getByTestId('parallel-chart')).toBeInTheDocument();
|
|
107
|
+
});
|
|
108
|
+
|
|
109
|
+
it('should accept theme prop', () => {
|
|
110
|
+
render(<ParallelChart option={basicOption} theme="dark" />);
|
|
111
|
+
expect(screen.getByTestId('parallel-chart')).toBeInTheDocument();
|
|
112
|
+
});
|
|
113
|
+
});
|
|
114
|
+
|
|
115
|
+
describe('Chart Options', () => {
|
|
116
|
+
it('should render with expandable axis', () => {
|
|
117
|
+
const expandableOption = {
|
|
118
|
+
...basicOption,
|
|
119
|
+
parallel: {
|
|
120
|
+
...basicOption.parallel,
|
|
121
|
+
axisExpandable: true,
|
|
122
|
+
axisExpandCenter: 3,
|
|
123
|
+
axisExpandCount: 3,
|
|
124
|
+
},
|
|
125
|
+
};
|
|
126
|
+
render(<ParallelChart option={expandableOption} />);
|
|
127
|
+
expect(screen.getByTestId('parallel-chart')).toBeInTheDocument();
|
|
128
|
+
});
|
|
129
|
+
|
|
130
|
+
it('should render with custom lineStyle', () => {
|
|
131
|
+
const customLineOption = {
|
|
132
|
+
...basicOption,
|
|
133
|
+
series: [{
|
|
134
|
+
type: 'parallel' as const,
|
|
135
|
+
lineStyle: { width: 3, color: '#1890ff', opacity: 0.8 },
|
|
136
|
+
data: [[1, 55, 9, 56, 0.46, 2, 35]],
|
|
137
|
+
}],
|
|
138
|
+
};
|
|
139
|
+
render(<ParallelChart option={customLineOption} />);
|
|
140
|
+
expect(screen.getByTestId('parallel-chart')).toBeInTheDocument();
|
|
141
|
+
});
|
|
142
|
+
|
|
143
|
+
it('should render with category axis', () => {
|
|
144
|
+
const categoryOption = {
|
|
145
|
+
title: { text: '分类轴测试' },
|
|
146
|
+
parallel: { left: '5%', right: '10%', bottom: '10%', top: '20%' },
|
|
147
|
+
parallelAxisDefault: {
|
|
148
|
+
type: 'category' as const,
|
|
149
|
+
data: ['A', 'B', 'C', 'D', 'E'],
|
|
150
|
+
name: '分类',
|
|
151
|
+
},
|
|
152
|
+
series: [{
|
|
153
|
+
type: 'parallel' as const,
|
|
154
|
+
data: [
|
|
155
|
+
['A', 55, 9, 56, 0.46, 2, 35],
|
|
156
|
+
['B', 25, 11, 21, 0.65, 2, 33],
|
|
157
|
+
],
|
|
158
|
+
}],
|
|
159
|
+
};
|
|
160
|
+
render(<ParallelChart option={categoryOption} />);
|
|
161
|
+
expect(screen.getByTestId('parallel-chart')).toBeInTheDocument();
|
|
162
|
+
});
|
|
163
|
+
});
|
|
164
|
+
});
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* 平行坐标图组件
|
|
3
|
+
* 用于展示高维数据各维度之间的关系
|
|
4
|
+
*/
|
|
5
|
+
import React, { memo } from 'react';
|
|
6
|
+
import BaseChartWrapper from '../common/BaseChartWrapper';
|
|
7
|
+
import { ParallelChartProps } from './types';
|
|
8
|
+
|
|
9
|
+
const ParallelChart: React.FC<ParallelChartProps> = memo((props) => (
|
|
10
|
+
<BaseChartWrapper {...props} chartType="parallel" />
|
|
11
|
+
));
|
|
12
|
+
|
|
13
|
+
ParallelChart.displayName = 'ParallelChart';
|
|
14
|
+
|
|
15
|
+
export default ParallelChart;
|
|
16
|
+
|
|
17
|
+
// 导出类型
|
|
18
|
+
export type { ParallelChartProps, ParallelOption, ParallelAxisSetting } from './types';
|
|
@@ -0,0 +1,73 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* 平行坐标图类型定义
|
|
3
|
+
*/
|
|
4
|
+
|
|
5
|
+
export type ParallelChartProps = {
|
|
6
|
+
option?: ParallelOption;
|
|
7
|
+
width?: string | number;
|
|
8
|
+
height?: string | number;
|
|
9
|
+
className?: string;
|
|
10
|
+
style?: React.CSSProperties;
|
|
11
|
+
onEvents?: Record<string, (params: any) => void>;
|
|
12
|
+
loading?: boolean;
|
|
13
|
+
loadingOption?: any;
|
|
14
|
+
theme?: string;
|
|
15
|
+
onChartReady?: (chart: any) => void;
|
|
16
|
+
opts?: {
|
|
17
|
+
devicePixelRatio?: number;
|
|
18
|
+
renderer?: 'canvas' | 'svg';
|
|
19
|
+
};
|
|
20
|
+
};
|
|
21
|
+
|
|
22
|
+
export interface ParallelOption {
|
|
23
|
+
title?: any;
|
|
24
|
+
legend?: any;
|
|
25
|
+
parallel?: ParallelAxisSetting;
|
|
26
|
+
parallelAxisDefault?: ParallelAxisItem;
|
|
27
|
+
grid?: any;
|
|
28
|
+
tooltip?: any;
|
|
29
|
+
series: ParallelSeriesItem[];
|
|
30
|
+
dataset?: any;
|
|
31
|
+
color?: string[];
|
|
32
|
+
backgroundColor?: any;
|
|
33
|
+
textStyle?: any;
|
|
34
|
+
[key: string]: any;
|
|
35
|
+
}
|
|
36
|
+
|
|
37
|
+
export interface ParallelAxisSetting {
|
|
38
|
+
left?: number | string;
|
|
39
|
+
right?: number | string;
|
|
40
|
+
top?: number | string;
|
|
41
|
+
bottom?: number | string;
|
|
42
|
+
width?: number | string;
|
|
43
|
+
height?: number | string;
|
|
44
|
+
axisExpandable?: boolean;
|
|
45
|
+
axisExpandCenter?: number;
|
|
46
|
+
axisExpandCount?: number;
|
|
47
|
+
axisExpandWidth?: number;
|
|
48
|
+
z?: number;
|
|
49
|
+
}
|
|
50
|
+
|
|
51
|
+
export interface ParallelAxisItem {
|
|
52
|
+
type?: 'value' | 'category';
|
|
53
|
+
name?: string;
|
|
54
|
+
nameLocation?: 'start' | 'middle' | 'center' | 'end';
|
|
55
|
+
nameTextStyle?: any;
|
|
56
|
+
nameGap?: number;
|
|
57
|
+
silent?: boolean;
|
|
58
|
+
data?: any[];
|
|
59
|
+
dimension?: number;
|
|
60
|
+
parallelIndex?: number;
|
|
61
|
+
}
|
|
62
|
+
|
|
63
|
+
export interface ParallelSeriesItem {
|
|
64
|
+
type: 'parallel';
|
|
65
|
+
name?: string;
|
|
66
|
+
data?: any[];
|
|
67
|
+
lineStyle?: any;
|
|
68
|
+
emphasis?: any;
|
|
69
|
+
smooth?: boolean | number;
|
|
70
|
+
symbol?: string;
|
|
71
|
+
symbolSize?: number;
|
|
72
|
+
itemStyle?: any;
|
|
73
|
+
}
|