Skip to content

Commit 37e0c31

Browse files
authored
feat: v2增强子弹图 (#1566)
* fix: 修复之前v2-bullet合并问题 * feat: 增加支持垂直方向的子弹图
1 parent b8e6a4b commit 37e0c31

File tree

11 files changed

+186
-23
lines changed

11 files changed

+186
-23
lines changed

__tests__/unit/plots/bullet/axis-spec.ts

+1-1
Original file line numberDiff line numberDiff line change
@@ -31,7 +31,7 @@ describe('axis bullet', () => {
3131
const rangeGeometry = bullet.chart.geometries[0];
3232
expect(rangeGeometry.getAdjust('stack')).toMatchObject({
3333
xField: 'title',
34-
yField: 'range',
34+
yField: 'ranges',
3535
});
3636
expect(rangeGeometry.getAttribute('color').values).toEqual(rangeColors);
3737

__tests__/unit/plots/bullet/index-spec.ts

+11-11
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@ import { Bullet } from '../../../../src';
22
import { bulletData, bulletDatas } from '../../../data/bullet';
33
import { createDiv } from '../../../utils/dom';
44

5-
describe.skip('bullet', () => {
5+
describe('bullet', () => {
66
it('default', () => {
77
const bullet = new Bullet(createDiv('basic bullet'), {
88
width: 400,
@@ -23,7 +23,7 @@ describe.skip('bullet', () => {
2323
expect(rangeGeometry.getAttribute('size').values[0]).toEqual(30);
2424
expect(rangeGeometry.getAdjust('stack')).toMatchObject({
2525
xField: 'title',
26-
yField: 'range',
26+
yField: 'ranges',
2727
});
2828
expect(rangeGeometry.getYScale().max).toEqual(100);
2929
expect(rangeGeometry.getYScale().min).toEqual(0);
@@ -61,11 +61,11 @@ describe.skip('bullet', () => {
6161

6262
expect(rangeGeometry.getAttribute('size').values[0]).toEqual(30);
6363
expect(rangeGeometry.getAdjust('stack')).toMatchObject({
64-
yField: 'range',
64+
yField: 'ranges',
6565
});
6666

6767
expect(measureGeometry.getAdjust('stack')).toMatchObject({
68-
yField: 'measure',
68+
yField: 'measures',
6969
});
7070
expect(measureGeometry.getYScale().max).toEqual(100);
7171
expect(measureGeometry.getYScale().min).toEqual(0);
@@ -94,7 +94,7 @@ describe.skip('bullet', () => {
9494
expect(measureGeometry.getAttribute('size').values[0]).toEqual(20);
9595
expect(measureGeometry.getAdjust('stack')).toMatchObject({
9696
xField: 'title',
97-
yField: 'measure',
97+
yField: 'measures',
9898
});
9999
expect(measureGeometry.getAttribute('color').values).toEqual('#ff0000');
100100
});
@@ -148,7 +148,7 @@ describe.skip('bullet', () => {
148148
expect(rangeGeometry.getAttribute('size').values[0]).toEqual(30);
149149
expect(rangeGeometry.getAdjust('stack')).toMatchObject({
150150
xField: 'title',
151-
yField: 'range',
151+
yField: 'ranges',
152152
});
153153
expect(rangeGeometry.getAttribute('color').values).toEqual(rangeColors);
154154
});
@@ -176,7 +176,7 @@ describe.skip('bullet', () => {
176176
const measureGeometry = chart.geometries[1];
177177
expect(measureGeometry.getAdjust('stack')).toMatchObject({
178178
xField: 'title',
179-
yField: 'measure',
179+
yField: 'measures',
180180
});
181181
expect(measureGeometry.getAttribute('color').values).toEqual(measureColors);
182182
});
@@ -208,14 +208,14 @@ describe.skip('bullet', () => {
208208
expect(rangeGeometry.getAttribute('size').values[0]).toEqual(rangeSize);
209209
expect(rangeGeometry.getAdjust('stack')).toMatchObject({
210210
xField: 'title',
211-
yField: 'range',
211+
yField: 'ranges',
212212
});
213213

214214
const measureGeometry = chart.geometries[1];
215215
expect(measureGeometry.getAttribute('size').values[0]).toEqual(measureSize);
216216
expect(measureGeometry.getAdjust('stack')).toMatchObject({
217217
xField: 'title',
218-
yField: 'measure',
218+
yField: 'measures',
219219
});
220220
});
221221

@@ -250,14 +250,14 @@ describe.skip('bullet', () => {
250250
expect(rangeGeometry.getAttribute('size').values[0]).toEqual(rangeSize);
251251
expect(rangeGeometry.getAdjust('stack')).toMatchObject({
252252
xField: 'title',
253-
yField: 'range',
253+
yField: 'ranges',
254254
});
255255

256256
const measureGeometry = chart.geometries[1];
257257
expect(measureGeometry.getAttribute('size').values[0]).toEqual(measureSize);
258258
expect(measureGeometry.getAdjust('stack')).toMatchObject({
259259
xField: 'title',
260-
yField: 'measure',
260+
yField: 'measures',
261261
});
262262

263263
const targetGeometry = chart.geometries[2];

__tests__/unit/plots/bullet/label-spec.ts

+1-1
Original file line numberDiff line numberDiff line change
@@ -26,7 +26,7 @@ describe('bullet*label', () => {
2626
const measureGeometry = chart.geometries[1];
2727
expect(measureGeometry.getAdjust('stack')).toMatchObject({
2828
xField: 'title',
29-
yField: 'measure',
29+
yField: 'measures',
3030
});
3131
// @ts-ignore
3232
expect(measureGeometry.labelOption.cfg.position).toEqual('middle');
+72
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,72 @@
1+
import { Bullet } from '../../../../src';
2+
import { bulletDatas } from '../../../data/bullet';
3+
import { createDiv } from '../../../utils/dom';
4+
5+
describe('bullet*label', () => {
6+
it('layout*default*horizontal', () => {
7+
const bullet = new Bullet(createDiv('layout*default*horizontal bullet'), {
8+
width: 400,
9+
height: 400,
10+
data: bulletDatas,
11+
measureField: 'measures',
12+
rangeField: 'ranges',
13+
targetField: 'target',
14+
xField: 'title',
15+
});
16+
17+
bullet.render();
18+
19+
const chart = bullet.chart;
20+
const [rangeGeometry, measureGeometry, targetGeometry] = chart.geometries;
21+
expect(rangeGeometry.getAdjust('stack')).toMatchObject({
22+
xField: 'title',
23+
yField: 'ranges',
24+
});
25+
expect(measureGeometry.getAdjust('stack')).toMatchObject({
26+
xField: 'title',
27+
yField: 'measures',
28+
});
29+
// @ts-ignore 默认水平的时候会转换坐标轴
30+
expect(chart.getCoordinate().isTransposed).toBe(true);
31+
const shapeArr = [];
32+
const elements = targetGeometry.elements;
33+
elements.forEach((ele) => {
34+
shapeArr.push(ele.getModel().shape);
35+
});
36+
expect(shapeArr).toContain('line');
37+
});
38+
39+
it('layout vertical', () => {
40+
const bullet = new Bullet(createDiv('layout*vertical bullet'), {
41+
width: 400,
42+
height: 400,
43+
data: bulletDatas,
44+
measureField: 'measures',
45+
rangeField: 'ranges',
46+
targetField: 'target',
47+
xField: 'title',
48+
layout: 'vertical',
49+
});
50+
51+
bullet.render();
52+
53+
const chart = bullet.chart;
54+
const [rangeGeometry, measureGeometry, targetGeometry] = chart.geometries;
55+
expect(rangeGeometry.getAdjust('stack')).toMatchObject({
56+
xField: 'title',
57+
yField: 'ranges',
58+
});
59+
expect(measureGeometry.getAdjust('stack')).toMatchObject({
60+
xField: 'title',
61+
yField: 'measures',
62+
});
63+
// @ts-ignore 垂直的时候不会转换坐标轴
64+
expect(chart.getCoordinate().isTransposed).toBe(false);
65+
const shapeArr = [];
66+
const elements = targetGeometry.elements;
67+
elements.forEach((ele) => {
68+
shapeArr.push(ele.getModel().shape);
69+
});
70+
expect(shapeArr).toContain('hyphen');
71+
});
72+
});

examples/bullet/basic/API.en.md

+11-3
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,7 @@ title: API
1818

1919
默认配置: 无
2020

21-
数据源为对象集合,例如:`[{title: '满意度', ranges: [100], measures: [80], target: 85}]`
21+
数据源为对象集合,例如:`[{title: '满意度', ranges: [50,100], measures: [80], target: 85}]`
2222

2323
### meta
2424

@@ -88,6 +88,14 @@ bulletPlot.render();
8888

8989
默认配置: 无
9090

91+
### layout
92+
93+
**可选**, 'horizontal' | 'vertical'
94+
95+
功能描述: 表示子弹图方向。
96+
97+
默认配置: 'horizontal'
98+
9199
## 图形样式
92100

93101
bulletStyle ✨
@@ -96,8 +104,8 @@ bulletStyle ✨
96104

97105
功能描述: 设置子弹图样式。
98106

99-
| 细分配置 | 类型 | 功能描述 |
100-
| -------- | ---------- | ------------ |
107+
| 细分配置 | 类型 | 功能描述 |
108+
| -------- | ------------ | ------------ |
101109
| range | _BasicStyle_ | 区间背景样式 |
102110
| measure | _BasicStyle_ | 实际值样式 |
103111
| target | _BasicStyle_ | 目标值样式 |

examples/bullet/basic/API.zh.md

+8
Original file line numberDiff line numberDiff line change
@@ -88,6 +88,14 @@ bulletPlot.render();
8888

8989
默认配置: 无
9090

91+
### layout
92+
93+
**可选**, 'horizontal' | 'vertical'
94+
95+
功能描述: 表示子弹图方向。
96+
97+
默认配置: 'horizontal'
98+
9199
## 图形样式
92100

93101
bulletStyle ✨

examples/bullet/basic/demo/layout.ts

+49
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,49 @@
1+
import { Bullet } from '@antv/g2plot';
2+
3+
const data = [
4+
{
5+
title: '满意度',
6+
ranges: [100],
7+
measures: [80],
8+
target: 85,
9+
},
10+
];
11+
12+
// @TODO 差一张垂直方向的缩略图
13+
const bulletPlot = new Bullet('container', {
14+
data,
15+
measureField: 'measures',
16+
rangeField: 'ranges',
17+
targetField: 'target',
18+
xField: 'title',
19+
xAxis: {
20+
line: null,
21+
},
22+
yAxis: false,
23+
layout: 'vertical',
24+
label: {
25+
position: 'middle',
26+
style: {
27+
fill: '#fff',
28+
},
29+
},
30+
// 自定义 legend
31+
legend: {
32+
custom: true,
33+
position: 'bottom',
34+
items: [
35+
{
36+
value: '实际值',
37+
name: '实际值',
38+
marker: { symbol: 'square', style: { fill: '#5B8FF9', r: 5 } },
39+
},
40+
{
41+
value: '目标值',
42+
name: '目标值',
43+
marker: { symbol: 'line', style: { stroke: '#5B8FF9', r: 5 } },
44+
},
45+
],
46+
},
47+
});
48+
49+
bulletPlot.render();

examples/bullet/basic/demo/meta.json

+9-1
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,15 @@
77
{
88
"filename": "basic.ts",
99
"title": {
10-
"zh": "基础子弹图",
10+
"zh": "基础水平方向子弹图",
11+
"en": "basic Bullet chart"
12+
},
13+
"screenshot": "https://gw.alipayobjects.com/mdn/rms_d314dd/afts/img/A*Vk43S5pvUJcAAAAAAAAAAABkARQnAQ"
14+
},
15+
{
16+
"filename": "layout.ts",
17+
"title": {
18+
"zh": "基础垂直方向子弹图",
1119
"en": "basic Bullet chart"
1220
},
1321
"screenshot": "https://gw.alipayobjects.com/mdn/rms_d314dd/afts/img/A*Vk43S5pvUJcAAAAAAAAAAABkARQnAQ"

src/plots/bullet/adaptor.ts

+20-6
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,7 @@ import { transformData } from './utils';
1212
*/
1313
function field(params: Params<BulletOptions>): Params<BulletOptions> {
1414
const { chart, options } = params;
15-
const { bulletStyle, targetField, rangeField, measureField, xField } = options;
15+
const { bulletStyle, targetField, rangeField, measureField, xField, layout } = options;
1616
const { range, measure, target } = bulletStyle;
1717
// 处理数据
1818
const { min, max, ds } = transformData(options);
@@ -31,11 +31,15 @@ function field(params: Params<BulletOptions>): Params<BulletOptions> {
3131
},
3232
});
3333
chart.data(ds);
34-
chart.coordinate().transpose();
3534
chart.axis(`${rangeField}`, false);
3635
chart.axis(`${targetField}`, false);
3736

38-
const rangeGeometry = chart.interval().position('title*range').adjust('stack').color('index').tooltip(false);
37+
const rangeGeometry = chart
38+
.interval()
39+
.position(`${xField}*${rangeField}`)
40+
.adjust('stack')
41+
.color('index')
42+
.tooltip(false);
3943

4044
if (isNumber(range.size)) {
4145
rangeGeometry.size(range.size);
@@ -45,7 +49,12 @@ function field(params: Params<BulletOptions>): Params<BulletOptions> {
4549
rangeGeometry.color('index', range.color);
4650
}
4751

48-
const measureGeometry = chart.interval().position('title*measure').label('measure').adjust('stack').color('index');
52+
const measureGeometry = chart
53+
.interval()
54+
.position(`${xField}*${measureField}`)
55+
.label('measure')
56+
.adjust('stack')
57+
.color('index');
4958

5059
if (isNumber(measure.size)) {
5160
measureGeometry.size(measure.size);
@@ -55,15 +64,20 @@ function field(params: Params<BulletOptions>): Params<BulletOptions> {
5564
measureGeometry.color('index', measure.color);
5665
}
5766

58-
const targetGeometry = chart.point().position('title*target').shape('line');
59-
67+
const targetGeometry = chart.point().position(`${xField}*${targetField}`).shape('hyphen');
6068
if (isNumber(target.size)) {
6169
targetGeometry.size(target.size / 2); // 是半径
6270
}
6371
if (target.color) {
6472
targetGeometry.color('index', target.color);
6573
}
6674

75+
// 水平的时候,要转换坐标轴和换图形为 line
76+
if (layout === 'horizontal') {
77+
chart.coordinate().transpose();
78+
targetGeometry.shape('line');
79+
}
80+
6781
return params;
6882
}
6983

src/plots/bullet/index.ts

+1
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,7 @@ export class Bullet extends Plot<BulletOptions> {
2222
label: {
2323
position: 'right',
2424
},
25+
layout: 'horizontal',
2526
legend: false,
2627
bulletStyle: {
2728
target: {

src/plots/bullet/types.ts

+3
Original file line numberDiff line numberDiff line change
@@ -29,4 +29,7 @@ export interface BulletOptions extends Options {
2929
target?: BasicStyle;
3030
range?: BasicStyle;
3131
};
32+
33+
/** layout 方向选择*/
34+
layout?: 'horizontal' | 'vertical';
3235
}

0 commit comments

Comments
 (0)