Skip to content

Commit 45808e3

Browse files
liuzhenyingaiyin.lzy
and
aiyin.lzy
authored
feat: treemap init (#2023)
* feat: treemap init * feat: 补充文档 * feat: 去除 treemap seriesfield 属性 * feat: 补充测试用例 Co-authored-by: aiyin.lzy <[email protected]>
1 parent db09fa4 commit 45808e3

33 files changed

+6243
-29
lines changed

__tests__/data/treemap-nest.ts

+5,477
Large diffs are not rendered by default.

__tests__/data/treemap.ts

+25
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,25 @@
1+
export const TREEMAP = {
2+
name: 'root',
3+
children: [
4+
{ name: '分类 1', value: 560 },
5+
{ name: '分类 2', value: 500 },
6+
{ name: '分类 3', value: 150 },
7+
{ name: '分类 4', value: 140 },
8+
{ name: '分类 5', value: 115 },
9+
{ name: '分类 6', value: 95 },
10+
{ name: '分类 7', value: 90 },
11+
{ name: '分类 8', value: 75 },
12+
{ name: '分类 9', value: 98 },
13+
{ name: '分类 10', value: 60 },
14+
{ name: '分类 11', value: 45 },
15+
{ name: '分类 12', value: 40 },
16+
{ name: '分类 13', value: 40 },
17+
{ name: '分类 14', value: 35 },
18+
{ name: '分类 15', value: 40 },
19+
{ name: '分类 16', value: 40 },
20+
{ name: '分类 17', value: 40 },
21+
{ name: '分类 18', value: 30 },
22+
{ name: '分类 19', value: 28 },
23+
{ name: '分类 20', value: 16 },
24+
],
25+
};
+19
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,19 @@
1+
import { Treemap } from '../../../../src';
2+
import { createDiv } from '../../../utils/dom';
3+
import { TREEMAP } from '../../../data/treemap';
4+
5+
describe('treemap axis', () => {
6+
it('treemap axis', () => {
7+
const treemapPlot = new Treemap(createDiv(), {
8+
data: TREEMAP,
9+
colorField: 'name',
10+
});
11+
12+
treemapPlot.render();
13+
14+
// @ts-ignore
15+
expect(treemapPlot.chart.getController('axis').option).toBeFalsy();
16+
17+
treemapPlot.destroy();
18+
});
19+
});
+63
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,63 @@
1+
import { Treemap } from '../../../../src';
2+
import { createDiv } from '../../../utils/dom';
3+
import { TREEMAP } from '../../../data/treemap';
4+
5+
const color = [
6+
'#5B8FF9',
7+
'#CDDDFD',
8+
'#5AD8A6',
9+
'#CDF3E4',
10+
'#5D7092',
11+
'#CED4DE',
12+
'#F6BD16',
13+
'#FCEBB9',
14+
'#6F5EF9',
15+
'#D3CEFD',
16+
'#6DC8EC',
17+
'#D3EEF9',
18+
'#945FB9',
19+
'#DECFEA',
20+
'#FF9845',
21+
'#FFE0C7',
22+
'#1E9493',
23+
'#BBDEDE',
24+
'#FF99C3',
25+
'#FFE0ED',
26+
];
27+
28+
describe('treemap basic', () => {
29+
it('basic treemap', () => {
30+
const treemapPlot = new Treemap(createDiv(), {
31+
data: TREEMAP,
32+
colorField: 'name',
33+
color,
34+
});
35+
36+
treemapPlot.render();
37+
38+
const geometry = treemapPlot.chart.geometries[0];
39+
expect(geometry.type).toBe('polygon');
40+
41+
// label
42+
// @ts-ignore
43+
expect(geometry.attributeOption.color.fields).toEqual(['name']);
44+
45+
// @ts-ignore
46+
expect(geometry.attributeOption.color.values).toEqual(color);
47+
48+
// label
49+
// @ts-ignore
50+
expect(geometry.labelOption.fields).toEqual(['name']);
51+
52+
// position
53+
const positionFields = geometry.getAttribute('position').getFields();
54+
expect(geometry.elements.length).toBe(geometry.data.length);
55+
expect(positionFields).toHaveLength(2);
56+
expect(positionFields).toEqual(['x', 'y']);
57+
58+
// @ts-ignore
59+
// expect(treemapPlot.chart.getController('axis').option).toBeFalsy();
60+
61+
treemapPlot.destroy();
62+
});
63+
});
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,48 @@
1+
import { Treemap } from '../../../../src';
2+
import { createDiv } from '../../../utils/dom';
3+
import { TREEMAP } from '../../../data/treemap';
4+
5+
describe('treemap legend', () => {
6+
let treemapPlot;
7+
8+
const options = {
9+
data: TREEMAP,
10+
colorField: 'name',
11+
};
12+
13+
beforeAll(() => {
14+
treemapPlot = new Treemap(createDiv(''), options);
15+
treemapPlot.render();
16+
});
17+
18+
afterAll(() => {
19+
treemapPlot.destroy();
20+
});
21+
22+
it('treemap legend default', () => {
23+
const legendComponent = treemapPlot.chart.getController('legend').getComponents()[0];
24+
25+
expect(legendComponent.direction).toBe('bottom');
26+
expect(legendComponent.component.cfg.items.length).toBe(TREEMAP.children.length);
27+
});
28+
29+
it('treemap legend custom', () => {
30+
treemapPlot.update({
31+
...options,
32+
legend: {
33+
position: 'top',
34+
},
35+
});
36+
37+
expect(treemapPlot.chart.getController('legend').getComponents()[0].direction).toBe('top');
38+
});
39+
40+
it('treemap legend false', () => {
41+
treemapPlot.update({
42+
...options,
43+
legend: false,
44+
});
45+
46+
expect(treemapPlot.chart.getController('legend').getComponents().length).toBe(0);
47+
});
48+
});
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,55 @@
1+
import { Treemap } from '../../../../src';
2+
import { createDiv } from '../../../utils/dom';
3+
import { TREEMAP } from '../../../data/treemap';
4+
import { TREEMAP_CHILDREN } from '../../../data/treemap-nest';
5+
6+
describe('treemap tooltip', () => {
7+
let treemapPlot;
8+
9+
const options = {
10+
data: TREEMAP,
11+
colorField: 'name',
12+
};
13+
14+
beforeAll(() => {
15+
treemapPlot = new Treemap(createDiv(''), options);
16+
treemapPlot.render();
17+
});
18+
19+
afterAll(() => {
20+
treemapPlot.destroy();
21+
});
22+
23+
it('treemap tooltip default', () => {
24+
const tooltipOption = treemapPlot.chart.options.tooltip;
25+
expect(tooltipOption.showMarkers).toBe(false);
26+
expect(tooltipOption.showTitle).toBe(false);
27+
expect(tooltipOption.fields).toEqual(['name', 'value', 'name']);
28+
expect(tooltipOption.formatter(TREEMAP.children[0])).toEqual({ name: '分类 1', value: 560 });
29+
});
30+
31+
it('treemap tooltip custom', () => {
32+
treemapPlot.update({
33+
data: TREEMAP_CHILDREN,
34+
colorField: 'brand',
35+
tooltip: {
36+
showTitle: true,
37+
title: 'test',
38+
},
39+
});
40+
41+
const customTooltipOption = treemapPlot.chart.options.tooltip;
42+
43+
expect(customTooltipOption.showTitle).toBe(true);
44+
expect(customTooltipOption.title).toBe('test');
45+
});
46+
47+
it('treemap tooltip false', () => {
48+
treemapPlot.update({
49+
tooltip: false,
50+
});
51+
52+
expect(treemapPlot.chart.options.tooltip).toBe(false);
53+
expect(treemapPlot.chart.getComponents().find((co) => co.type === 'tooltip')).toBe(undefined);
54+
});
55+
});
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,54 @@
1+
import { Treemap } from '../../../../src';
2+
import { createDiv } from '../../../utils/dom';
3+
import { TREEMAP_CHILDREN } from '../../../data/treemap-nest';
4+
5+
const color = [
6+
'#5B8FF9',
7+
'#CDDDFD',
8+
'#5AD8A6',
9+
'#CDF3E4',
10+
'#5D7092',
11+
'#CED4DE',
12+
'#F6BD16',
13+
'#FCEBB9',
14+
'#6F5EF9',
15+
'#D3CEFD',
16+
'#6DC8EC',
17+
'#D3EEF9',
18+
];
19+
20+
describe('treemap nest', () => {
21+
it('basic treemap', () => {
22+
const treemapPlot = new Treemap(createDiv(), {
23+
data: TREEMAP_CHILDREN,
24+
colorField: 'brand',
25+
color,
26+
label: {
27+
fields: ['name'],
28+
},
29+
});
30+
31+
treemapPlot.render();
32+
33+
const geometry = treemapPlot.chart.geometries[0];
34+
expect(geometry.type).toBe('polygon');
35+
36+
// @ts-ignore
37+
expect(geometry.attributeOption.color.fields).toEqual(['brand']);
38+
// @ts-ignore
39+
expect(geometry.attributeOption.color.values).toEqual(color);
40+
const positionFields = geometry.getAttribute('position').getFields();
41+
expect(geometry.elements.length).toBe(geometry.data.length);
42+
expect(positionFields).toHaveLength(2);
43+
expect(positionFields).toEqual(['x', 'y']);
44+
45+
// @ts-ignore
46+
expect(treemapPlot.chart.getController('axis').option).toBeFalsy();
47+
// @ts-ignore
48+
expect(geometry.labelOption.cfg.layout.type).toBe('limit-in-shape');
49+
// @ts-ignore
50+
expect(geometry.labelOption.fields).toEqual(['name']);
51+
52+
treemapPlot.destroy();
53+
});
54+
});
+94
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,94 @@
1+
import { transformData } from '../../../../src/plots/treemap/utils';
2+
3+
const data1 = {
4+
name: 'root',
5+
children: [
6+
{
7+
name: '分类 1',
8+
value: 100,
9+
},
10+
{
11+
name: '分类 2',
12+
value: 50,
13+
},
14+
{
15+
name: '分类 3',
16+
value: 50,
17+
},
18+
],
19+
};
20+
21+
const data2 = {
22+
name: 'root',
23+
children: [
24+
{
25+
name: '三星',
26+
children: [
27+
{
28+
name: '三星1',
29+
value: 100,
30+
},
31+
{
32+
name: '三星2',
33+
value: 50,
34+
},
35+
],
36+
},
37+
{
38+
name: '小米',
39+
children: [
40+
{
41+
name: '小米1',
42+
value: 10,
43+
},
44+
{
45+
name: '小米2',
46+
value: 20,
47+
},
48+
],
49+
},
50+
],
51+
};
52+
53+
describe('treemap transformData', () => {
54+
it('transformData, basic treemap', () => {
55+
const data = transformData({
56+
data: data1,
57+
colorField: 'name',
58+
});
59+
60+
const areaArr = data.map((dt) => {
61+
const w = dt.x[1] - dt.x[0];
62+
const h = dt.y[1] - dt.y[2];
63+
return Number((w * h).toFixed(3));
64+
});
65+
66+
expect(data.length).toBe(3);
67+
expect(areaArr[1] / areaArr[0]).toEqual(data1.children[1].value / data1.children[0].value);
68+
expect(areaArr[2] / areaArr[1]).toEqual(data1.children[2].value / data1.children[1].value);
69+
});
70+
71+
it('transformData, nest treemap', () => {
72+
const data = transformData({
73+
data: data2,
74+
colorField: 'name',
75+
});
76+
77+
const areaArr = data.map((dt) => {
78+
const w = dt.x[1] - dt.x[0];
79+
const h = dt.y[1] - dt.y[2];
80+
return Number((w * h).toFixed(3));
81+
});
82+
83+
expect(data.length).toBe(4);
84+
expect((areaArr[1] / areaArr[0]).toFixed(1)).toEqual(
85+
(data2.children[0].children[1].value / data2.children[0].children[0].value).toFixed(1)
86+
);
87+
expect((areaArr[3] / areaArr[2]).toFixed(1)).toEqual(
88+
(data2.children[1].children[1].value / data2.children[1].children[0].value).toFixed(1)
89+
);
90+
expect((areaArr[3] / areaArr[1]).toFixed(1)).toEqual(
91+
(data2.children[1].children[1].value / data2.children[0].children[1].value).toFixed(1)
92+
);
93+
});
94+
});

__tests__/unit/plots/sunburst/hierarchy/partition-spec.ts renamed to __tests__/unit/utils/hierarchy/partition-spec.ts

+1-1
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
import { partition } from '../../../../../src/plots/sunburst/hierarchy/partition';
1+
import { partition } from '../../../../src/utils/hierarchy/partition';
22

33
describe('hierarchy/partition', () => {
44
it('partition', () => {

__tests__/unit/plots/sunburst/hierarchy/util-spec.ts renamed to __tests__/unit/utils/hierarchy/util-spec.ts

+1-1
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
import { getField, getAllNodes } from '../../../../../src/plots/sunburst/hierarchy/util';
1+
import { getField, getAllNodes } from '../../../../src/utils/hierarchy/util';
22

33
describe('hierarchy/util', () => {
44
it('getField', () => {

0 commit comments

Comments
 (0)