Skip to content

Commit

Permalink
feat: v2增强子弹图 (#1566)
Browse files Browse the repository at this point in the history
* fix: 修复之前v2-bullet合并问题

* feat: 增加支持垂直方向的子弹图
  • Loading branch information
arcsin1 committed Sep 14, 2020
1 parent b8e6a4b commit 37e0c31
Show file tree
Hide file tree
Showing 11 changed files with 186 additions and 23 deletions.
2 changes: 1 addition & 1 deletion __tests__/unit/plots/bullet/axis-spec.ts
Expand Up @@ -31,7 +31,7 @@ describe('axis bullet', () => {
const rangeGeometry = bullet.chart.geometries[0];
expect(rangeGeometry.getAdjust('stack')).toMatchObject({
xField: 'title',
yField: 'range',
yField: 'ranges',
});
expect(rangeGeometry.getAttribute('color').values).toEqual(rangeColors);

Expand Down
22 changes: 11 additions & 11 deletions __tests__/unit/plots/bullet/index-spec.ts
Expand Up @@ -2,7 +2,7 @@ import { Bullet } from '../../../../src';
import { bulletData, bulletDatas } from '../../../data/bullet';
import { createDiv } from '../../../utils/dom';

describe.skip('bullet', () => {
describe('bullet', () => {
it('default', () => {
const bullet = new Bullet(createDiv('basic bullet'), {
width: 400,
Expand All @@ -23,7 +23,7 @@ describe.skip('bullet', () => {
expect(rangeGeometry.getAttribute('size').values[0]).toEqual(30);
expect(rangeGeometry.getAdjust('stack')).toMatchObject({
xField: 'title',
yField: 'range',
yField: 'ranges',
});
expect(rangeGeometry.getYScale().max).toEqual(100);
expect(rangeGeometry.getYScale().min).toEqual(0);
Expand Down Expand Up @@ -61,11 +61,11 @@ describe.skip('bullet', () => {

expect(rangeGeometry.getAttribute('size').values[0]).toEqual(30);
expect(rangeGeometry.getAdjust('stack')).toMatchObject({
yField: 'range',
yField: 'ranges',
});

expect(measureGeometry.getAdjust('stack')).toMatchObject({
yField: 'measure',
yField: 'measures',
});
expect(measureGeometry.getYScale().max).toEqual(100);
expect(measureGeometry.getYScale().min).toEqual(0);
Expand Down Expand Up @@ -94,7 +94,7 @@ describe.skip('bullet', () => {
expect(measureGeometry.getAttribute('size').values[0]).toEqual(20);
expect(measureGeometry.getAdjust('stack')).toMatchObject({
xField: 'title',
yField: 'measure',
yField: 'measures',
});
expect(measureGeometry.getAttribute('color').values).toEqual('#ff0000');
});
Expand Down Expand Up @@ -148,7 +148,7 @@ describe.skip('bullet', () => {
expect(rangeGeometry.getAttribute('size').values[0]).toEqual(30);
expect(rangeGeometry.getAdjust('stack')).toMatchObject({
xField: 'title',
yField: 'range',
yField: 'ranges',
});
expect(rangeGeometry.getAttribute('color').values).toEqual(rangeColors);
});
Expand Down Expand Up @@ -176,7 +176,7 @@ describe.skip('bullet', () => {
const measureGeometry = chart.geometries[1];
expect(measureGeometry.getAdjust('stack')).toMatchObject({
xField: 'title',
yField: 'measure',
yField: 'measures',
});
expect(measureGeometry.getAttribute('color').values).toEqual(measureColors);
});
Expand Down Expand Up @@ -208,14 +208,14 @@ describe.skip('bullet', () => {
expect(rangeGeometry.getAttribute('size').values[0]).toEqual(rangeSize);
expect(rangeGeometry.getAdjust('stack')).toMatchObject({
xField: 'title',
yField: 'range',
yField: 'ranges',
});

const measureGeometry = chart.geometries[1];
expect(measureGeometry.getAttribute('size').values[0]).toEqual(measureSize);
expect(measureGeometry.getAdjust('stack')).toMatchObject({
xField: 'title',
yField: 'measure',
yField: 'measures',
});
});

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

const measureGeometry = chart.geometries[1];
expect(measureGeometry.getAttribute('size').values[0]).toEqual(measureSize);
expect(measureGeometry.getAdjust('stack')).toMatchObject({
xField: 'title',
yField: 'measure',
yField: 'measures',
});

const targetGeometry = chart.geometries[2];
Expand Down
2 changes: 1 addition & 1 deletion __tests__/unit/plots/bullet/label-spec.ts
Expand Up @@ -26,7 +26,7 @@ describe('bullet*label', () => {
const measureGeometry = chart.geometries[1];
expect(measureGeometry.getAdjust('stack')).toMatchObject({
xField: 'title',
yField: 'measure',
yField: 'measures',
});
// @ts-ignore
expect(measureGeometry.labelOption.cfg.position).toEqual('middle');
Expand Down
72 changes: 72 additions & 0 deletions __tests__/unit/plots/bullet/layout-spec.ts
@@ -0,0 +1,72 @@
import { Bullet } from '../../../../src';
import { bulletDatas } from '../../../data/bullet';
import { createDiv } from '../../../utils/dom';

describe('bullet*label', () => {
it('layout*default*horizontal', () => {
const bullet = new Bullet(createDiv('layout*default*horizontal bullet'), {
width: 400,
height: 400,
data: bulletDatas,
measureField: 'measures',
rangeField: 'ranges',
targetField: 'target',
xField: 'title',
});

bullet.render();

const chart = bullet.chart;
const [rangeGeometry, measureGeometry, targetGeometry] = chart.geometries;
expect(rangeGeometry.getAdjust('stack')).toMatchObject({
xField: 'title',
yField: 'ranges',
});
expect(measureGeometry.getAdjust('stack')).toMatchObject({
xField: 'title',
yField: 'measures',
});
// @ts-ignore 默认水平的时候会转换坐标轴
expect(chart.getCoordinate().isTransposed).toBe(true);
const shapeArr = [];
const elements = targetGeometry.elements;
elements.forEach((ele) => {
shapeArr.push(ele.getModel().shape);
});
expect(shapeArr).toContain('line');
});

it('layout vertical', () => {
const bullet = new Bullet(createDiv('layout*vertical bullet'), {
width: 400,
height: 400,
data: bulletDatas,
measureField: 'measures',
rangeField: 'ranges',
targetField: 'target',
xField: 'title',
layout: 'vertical',
});

bullet.render();

const chart = bullet.chart;
const [rangeGeometry, measureGeometry, targetGeometry] = chart.geometries;
expect(rangeGeometry.getAdjust('stack')).toMatchObject({
xField: 'title',
yField: 'ranges',
});
expect(measureGeometry.getAdjust('stack')).toMatchObject({
xField: 'title',
yField: 'measures',
});
// @ts-ignore 垂直的时候不会转换坐标轴
expect(chart.getCoordinate().isTransposed).toBe(false);
const shapeArr = [];
const elements = targetGeometry.elements;
elements.forEach((ele) => {
shapeArr.push(ele.getModel().shape);
});
expect(shapeArr).toContain('hyphen');
});
});
14 changes: 11 additions & 3 deletions examples/bullet/basic/API.en.md
Expand Up @@ -18,7 +18,7 @@ title: API

默认配置: 无

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

### meta

Expand Down Expand Up @@ -88,6 +88,14 @@ bulletPlot.render();

默认配置: 无

### layout

**可选**, 'horizontal' | 'vertical'

功能描述: 表示子弹图方向。

默认配置: 'horizontal'

## 图形样式

bulletStyle ✨
Expand All @@ -96,8 +104,8 @@ bulletStyle ✨

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

| 细分配置 | 类型 | 功能描述 |
| -------- | ---------- | ------------ |
| 细分配置 | 类型 | 功能描述 |
| -------- | ------------ | ------------ |
| range | _BasicStyle_ | 区间背景样式 |
| measure | _BasicStyle_ | 实际值样式 |
| target | _BasicStyle_ | 目标值样式 |
Expand Down
8 changes: 8 additions & 0 deletions examples/bullet/basic/API.zh.md
Expand Up @@ -88,6 +88,14 @@ bulletPlot.render();

默认配置: 无

### layout

**可选**, 'horizontal' | 'vertical'

功能描述: 表示子弹图方向。

默认配置: 'horizontal'

## 图形样式

bulletStyle ✨
Expand Down
49 changes: 49 additions & 0 deletions examples/bullet/basic/demo/layout.ts
@@ -0,0 +1,49 @@
import { Bullet } from '@antv/g2plot';

const data = [
{
title: '满意度',
ranges: [100],
measures: [80],
target: 85,
},
];

// @TODO 差一张垂直方向的缩略图
const bulletPlot = new Bullet('container', {
data,
measureField: 'measures',
rangeField: 'ranges',
targetField: 'target',
xField: 'title',
xAxis: {
line: null,
},
yAxis: false,
layout: 'vertical',
label: {
position: 'middle',
style: {
fill: '#fff',
},
},
// 自定义 legend
legend: {
custom: true,
position: 'bottom',
items: [
{
value: '实际值',
name: '实际值',
marker: { symbol: 'square', style: { fill: '#5B8FF9', r: 5 } },
},
{
value: '目标值',
name: '目标值',
marker: { symbol: 'line', style: { stroke: '#5B8FF9', r: 5 } },
},
],
},
});

bulletPlot.render();
10 changes: 9 additions & 1 deletion examples/bullet/basic/demo/meta.json
Expand Up @@ -7,7 +7,15 @@
{
"filename": "basic.ts",
"title": {
"zh": "基础子弹图",
"zh": "基础水平方向子弹图",
"en": "basic Bullet chart"
},
"screenshot": "https://gw.alipayobjects.com/mdn/rms_d314dd/afts/img/A*Vk43S5pvUJcAAAAAAAAAAABkARQnAQ"
},
{
"filename": "layout.ts",
"title": {
"zh": "基础垂直方向子弹图",
"en": "basic Bullet chart"
},
"screenshot": "https://gw.alipayobjects.com/mdn/rms_d314dd/afts/img/A*Vk43S5pvUJcAAAAAAAAAAABkARQnAQ"
Expand Down
26 changes: 20 additions & 6 deletions src/plots/bullet/adaptor.ts
Expand Up @@ -12,7 +12,7 @@ import { transformData } from './utils';
*/
function field(params: Params<BulletOptions>): Params<BulletOptions> {
const { chart, options } = params;
const { bulletStyle, targetField, rangeField, measureField, xField } = options;
const { bulletStyle, targetField, rangeField, measureField, xField, layout } = options;
const { range, measure, target } = bulletStyle;
// 处理数据
const { min, max, ds } = transformData(options);
Expand All @@ -31,11 +31,15 @@ function field(params: Params<BulletOptions>): Params<BulletOptions> {
},
});
chart.data(ds);
chart.coordinate().transpose();
chart.axis(`${rangeField}`, false);
chart.axis(`${targetField}`, false);

const rangeGeometry = chart.interval().position('title*range').adjust('stack').color('index').tooltip(false);
const rangeGeometry = chart
.interval()
.position(`${xField}*${rangeField}`)
.adjust('stack')
.color('index')
.tooltip(false);

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

const measureGeometry = chart.interval().position('title*measure').label('measure').adjust('stack').color('index');
const measureGeometry = chart
.interval()
.position(`${xField}*${measureField}`)
.label('measure')
.adjust('stack')
.color('index');

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

const targetGeometry = chart.point().position('title*target').shape('line');

const targetGeometry = chart.point().position(`${xField}*${targetField}`).shape('hyphen');
if (isNumber(target.size)) {
targetGeometry.size(target.size / 2); // 是半径
}
if (target.color) {
targetGeometry.color('index', target.color);
}

// 水平的时候,要转换坐标轴和换图形为 line
if (layout === 'horizontal') {
chart.coordinate().transpose();
targetGeometry.shape('line');
}

return params;
}

Expand Down
1 change: 1 addition & 0 deletions src/plots/bullet/index.ts
Expand Up @@ -22,6 +22,7 @@ export class Bullet extends Plot<BulletOptions> {
label: {
position: 'right',
},
layout: 'horizontal',
legend: false,
bulletStyle: {
target: {
Expand Down
3 changes: 3 additions & 0 deletions src/plots/bullet/types.ts
Expand Up @@ -29,4 +29,7 @@ export interface BulletOptions extends Options {
target?: BasicStyle;
range?: BasicStyle;
};

/** layout 方向选择*/
layout?: 'horizontal' | 'vertical';
}

0 comments on commit 37e0c31

Please sign in to comment.