Skip to content

Commit b9de931

Browse files
authored
feat(v2/pie): 饼图字段配置错误处理 (#1321)
* fix(v2/pie): 饼图、环图字段配置错误 可正常绘制 angleField 对应的数据为number类型或为空时,正常显示,其他进行筛选过滤,从而避免触发 out of memory * refactor(v2/pie): 修改 cr 建议 * feat(v2/pie): 处理不合法数据
1 parent f7b334b commit b9de931

File tree

2 files changed

+108
-4
lines changed

2 files changed

+108
-4
lines changed

__tests__/bugs/issue-1245-spec.ts

+98
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,98 @@
1+
import { Pie } from '../../src';
2+
import { createDiv } from '.././utils/dom';
3+
4+
describe('donut plot', () => {
5+
test('angleField & colorField 配置交换, 不会触发 out-of-memory, 但是坐标为 NaN', () => {
6+
const data = [
7+
{
8+
type: '分类一',
9+
value: 27,
10+
},
11+
{
12+
type: '分类二',
13+
value: 25,
14+
},
15+
{
16+
type: '分类三',
17+
value: 18,
18+
},
19+
{
20+
type: '分类四',
21+
value: 15,
22+
},
23+
{
24+
type: '分类五',
25+
value: 10,
26+
},
27+
{
28+
type: '其它',
29+
value: 5,
30+
},
31+
];
32+
33+
const donutPlot = new Pie(createDiv(), {
34+
width: 640,
35+
height: 400,
36+
radius: 0.8,
37+
innerRadius: 0.64,
38+
padding: 'auto',
39+
data,
40+
angleField: 'type',
41+
colorField: 'value',
42+
});
43+
44+
donutPlot.render();
45+
46+
expect(donutPlot).toBeDefined();
47+
expect(donutPlot.chart.geometries[0].elements.length).toBe(0);
48+
});
49+
50+
test('value 数据出现字母或其他不合法情况,不会触发 out-of-memory', () => {
51+
const data = [
52+
{
53+
type: '分类一',
54+
value: 27,
55+
},
56+
{
57+
type: '分类二',
58+
value: 25,
59+
},
60+
{
61+
type: '分类三',
62+
value: 18,
63+
},
64+
{
65+
type: '分类四',
66+
value: 15,
67+
},
68+
{
69+
type: '分类五',
70+
value: 10,
71+
},
72+
{
73+
type: '其它',
74+
value: '11a',
75+
},
76+
];
77+
78+
const piePlot = new Pie(createDiv(), {
79+
width: 640,
80+
height: 400,
81+
radius: 0.8,
82+
padding: 'auto',
83+
data,
84+
angleField: 'value',
85+
colorField: 'type',
86+
});
87+
88+
piePlot.render();
89+
expect(piePlot).toBeDefined();
90+
expect(piePlot.chart.geometries[0].elements.length).toBe(data.length - 1);
91+
92+
piePlot.update({
93+
...piePlot.options,
94+
data: data.map((d, idx) => (idx !== 0 ? { ...d, value: null } : d)),
95+
});
96+
expect(piePlot.chart.geometries[0].elements.length).toBe(data.length);
97+
});
98+
});

src/plots/pie/adaptor.ts

+10-4
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
import { deepMix, each, every, get, isFunction } from '@antv/util';
1+
import { deepMix, each, every, get, isFunction, filter, isNil } from '@antv/util';
22
import { Params } from '../../core/adaptor';
33
import { tooltip, interaction, animation, theme } from '../../common/adaptor';
44
import { flow } from '../../utils';
@@ -16,14 +16,20 @@ function field(params: Params<PieOptions>): Params<PieOptions> {
1616

1717
const geometry = chart.interval();
1818

19-
const allZero = every(data, (d) => d[angleField] === 0);
19+
// 处理不合法的数据
20+
const processData = filter(data, (d) => typeof d[angleField] === 'number' || isNil(d[angleField]));
21+
if (processData.length !== data.length) {
22+
console.error('Please check whether there exists illegal data');
23+
}
24+
25+
const allZero = every(processData, (d) => d[angleField] === 0);
2026
if (allZero) {
2127
// 数据全 0 处理,调整 position 映射
2228
const percentageField = '$$percentage$$';
23-
chart.data(data.map((d) => ({ ...d, [percentageField]: 1 / data.length })));
29+
chart.data(processData.map((d) => ({ ...d, [percentageField]: 1 / processData.length })));
2430
geometry.position(`1*${percentageField}`).adjust({ type: 'stack' }).tooltip(`${colorField}*${angleField}`);
2531
} else {
26-
chart.data(data);
32+
chart.data(processData);
2733
geometry.position(`1*${angleField}`).adjust({ type: 'stack' });
2834
}
2935

0 commit comments

Comments
 (0)