Skip to content

Commit a392a8b

Browse files
authored
fix(issue-3160): 修复饼图使用连续型图例,标签无法展示 (#3366)
* fix(issue-3160): 修复饼图使用连续型图例,标签无法展示 color 字段为 linear 类型时,不会存入 groupScales,导致获取 label-id 不唯一 closed: #3160 * fix(spider): 修复 get 获取属性值,会对 dot 进行解析 * test: 补充 bugs 单测 * fix: 修改 cr 建议,不需要重新生成
1 parent 11d9718 commit a392a8b

4 files changed

Lines changed: 124 additions & 3 deletions

File tree

src/geometry/base.ts

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1188,7 +1188,11 @@ export default class Geometry extends Base {
11881188
id = `${xVal}-${yVal}`;
11891189
}
11901190

1191-
const groupScales = this.groupScales;
1191+
let groupScales = this.groupScales;
1192+
if (isEmpty(groupScales)) {
1193+
groupScales = get(this.getAttribute('color'), 'scales', []);
1194+
}
1195+
11921196
for (let index = 0, length = groupScales.length; index < length; index++) {
11931197
const groupScale = groupScales[index];
11941198
const field = groupScale.field;

src/geometry/label/layout/pie/spider.ts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -112,7 +112,7 @@ export function pieSpiderLabelLayout(items: LabelItem[], labels: IGroup[], shape
112112

113113
// step 1: adjust items to spider
114114
each(items, (item) => {
115-
const label = get(labelsMap, item.id);
115+
const label = get(labelsMap, [item.id]);
116116
if (!label) {
117117
return;
118118
}
@@ -177,7 +177,7 @@ export function pieSpiderLabelLayout(items: LabelItem[], labels: IGroup[], shape
177177
const inRight = key === RIGHT_HALF_KEY;
178178

179179
each(half, (item) => {
180-
const label: IGroup = get(labelsMap, item && item.id);
180+
const label: IGroup = get(labelsMap, item && [item.id]);
181181
if (!label) {
182182
return;
183183
}

tests/bugs/3160-spec.ts

Lines changed: 62 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,62 @@
1+
import { Chart } from '../../src';
2+
import { createDiv, removeDom } from '../util/dom';
3+
4+
describe('#3160', () => {
5+
const div = createDiv();
6+
const chart = new Chart({
7+
container: div, // 指定图表容器 ID
8+
height: 300, // 指定图表高度
9+
autoFit: true,
10+
});
11+
chart.coordinate('theta');
12+
13+
const data = [
14+
{ type: '1', item: 1, value: 0.1 },
15+
{ type: '2', item: 4, value: 0.4 },
16+
{ type: '1.3', item: 2, value: 0.2 },
17+
{ type: '2.5', item: 3, value: 0.3 },
18+
];
19+
chart.data(data);
20+
21+
chart
22+
.interval()
23+
.position('value')
24+
.color('type')
25+
.label('type', { layout: { type: 'pie-spider' } })
26+
.adjust('stack');
27+
28+
chart.render();
29+
30+
it('mapping color to linear scale, label render normal', () => {
31+
const labels = chart.geometries[0].labelsContainer.getChildren();
32+
expect(labels.length).toBe(4);
33+
});
34+
35+
it('spider label, render normal', () => {
36+
chart.clear();
37+
chart
38+
.interval()
39+
.position('value')
40+
.color('type')
41+
.label('type', { layout: { type: 'pie-spider' } })
42+
.adjust('stack');
43+
chart.render();
44+
45+
const labels = chart.geometries[0].labelsContainer.getChildren();
46+
47+
const label1 = labels.find((l) => l.get('id') === `1-${data[0].type}`);
48+
const label2 = labels.find((l) => l.get('id') === `1-${data[1].type}`);
49+
const label3 = labels.find((l) => l.get('id') === `1-${data[2].type}`);
50+
const label4 = labels.find((l) => l.get('id') === `1-${data[3].type}`);
51+
52+
// @ts-ignore
53+
expect(label1.getChildren()[0].getCanvasBBox().minX).toEqual(label2.getChildren()[0].getCanvasBBox().minX);
54+
// @ts-ignore
55+
expect(label3.getChildren()[0].getCanvasBBox().maxX).toEqual(label4.getChildren()[0].getCanvasBBox().maxX);
56+
});
57+
58+
afterAll(() => {
59+
chart.destroy();
60+
removeDom(div);
61+
});
62+
});

tests/unit/geometry/label/layout/pie-spider-spec.ts

Lines changed: 55 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -95,6 +95,61 @@ describe('pie-spider-label layout', () => {
9595
expect(label1.getBBox().y + label1.getBBox().height / 2).toEqual(center.y);
9696
});
9797

98+
it('异常情况', () => {
99+
chart.clear();
100+
101+
let data = [
102+
{ item: '事例一', count: 35 },
103+
{ item: '事例二', count: 25 },
104+
{ item: '事例三', count: 20 },
105+
{ item: '事例四', count: 20 },
106+
{ item: '事例五', count: 20 },
107+
];
108+
chart.data(data);
109+
110+
chart.coordinate({
111+
type: 'theta',
112+
cfg: {
113+
radius: 0.5,
114+
},
115+
});
116+
117+
chart
118+
.interval()
119+
.adjust('stack')
120+
.position('count')
121+
.color('item')
122+
.label('item', {
123+
layout: { type: 'pie-spider' },
124+
});
125+
126+
chart.render();
127+
let labels = chart.geometries[0].labelsContainer.getChildren();
128+
expect(labels.length).toBe(5);
129+
130+
let label1 = labels.find((l) => l.get('id') === `1-${data[0].item}`);
131+
let label2 = labels.find((l) => l.get('id') === `1-${data[1].item}`);
132+
133+
// @ts-ignore
134+
expect(label1.getChildren()[0].getCanvasBBox().minX).toEqual(label2.getChildren()[0].getCanvasBBox().minX);
135+
136+
data = [
137+
{ item: '事例.一', count: 35 },
138+
{ item: '事例.二', count: 25 },
139+
{ item: '事例三', count: 20 },
140+
{ item: '事例四', count: 20 },
141+
{ item: '事例五', count: 20 },
142+
];
143+
chart.changeData(data);
144+
145+
labels = chart.geometries[0].labelsContainer.getChildren();
146+
147+
label1 = labels.find((l) => l.get('id') === `1-${data[0].item}`);
148+
label2 = labels.find((l) => l.get('id') === `1-${data[1].item}`);
149+
// @ts-ignore
150+
expect(label1.getChildren()[0].getCanvasBBox().minX).toEqual(label2.getChildren()[0].getCanvasBBox().minX);
151+
});
152+
98153
afterAll(() => {
99154
chart.destroy();
100155
removeDom(div);

0 commit comments

Comments
 (0)