Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

fix(bullet): 子弹图 添加单数值range/measures 、 多 target 数据修改兼容 #3231

Merged
merged 6 commits into from
Jun 6, 2022
84 changes: 84 additions & 0 deletions __tests__/unit/plots/bullet/data-spec.ts
Original file line number Diff line number Diff line change
Expand Up @@ -48,6 +48,90 @@ describe('bullet*data*transfrom', () => {
expect(ds).toEqual(transDS);
});

it('data*moretarget', () => {
const bulletData = [{ title: '数学', ranges: [30, 50, 100], measures: [20], target: [90, 85, 66] }];
// 校验数据转换
const { ds } = transformData({
data: bulletData,
measureField: 'measures',
rangeField: 'ranges',
targetField: 'target',
xField: 'title',
});

// 转化为的数据应该为
const transDS = [
{
title: '数学',
ranges: 30,
rKey: 'ranges_0',
},
{
title: '数学',
ranges: 20,
rKey: 'ranges_1',
},
{
title: '数学',
ranges: 50,
rKey: 'ranges_2',
},
{
title: '数学',
measures: 20,
mKey: 'measures', // 只有一个数据
},
{
title: '数学',
target: 66,
tKey: 'target_0',
},
{
title: '数学',
target: 85,
tKey: 'target_1',
},
{
title: '数学',
target: 90,
tKey: 'target_2',
},
];
expect(ds).toEqual(transDS);
});

it('data*one', () => {
const bulletData = [{ title: '数学', ranges: 100, measures: 20, target: 90 }];
// 校验数据转换
const { ds } = transformData({
data: bulletData,
measureField: 'measures',
rangeField: 'ranges',
targetField: 'target',
xField: 'title',
});

// 转化为的数据应该为
const transDS = [
{
title: '数学',
ranges: 100,
rKey: 'ranges_0',
},
{
title: '数学',
measures: 20,
mKey: 'measures', // 只有一个数据
},
{
title: '数学',
target: 90,
tKey: 'target',
},
];
expect(ds).toEqual(transDS);
});

it('data*transfrom*modify', () => {
const bulletData = [{ title: 'antv', subTitle: 'g2', count: [30, 50, 100, 150], measures: [20, 30], target: 85 }];
// 校验数据转换
Expand Down
38 changes: 29 additions & 9 deletions src/plots/bullet/utils.ts
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,18 @@ type TransformData = {
max: number;
ds: any[];
};

/**
* 获取分类字段 key 值 一个分类值的时候, 返回非索引 key 值,在 tooltip 不做索引区分
* @param values 数据量
* @param field 指标字段
* @param index 索引
* @returns string
*/
function getSeriesFieldKey(values: number[], field: string, index: number): string {
return values.length > 1 ? `${field}_${index}` : `${field}`;
}

/**
* bullet 处理数据
* @param options
Expand All @@ -15,29 +27,37 @@ export function transformData(options: BulletOptions): TransformData {
const scales: number[] = [];
data.forEach((item: any, index: number) => {
// 构建 title * range
item[rangeField].sort((a: number, b: number) => a - b);
item[rangeField].forEach((d: number, i: number) => {
const range = i === 0 ? d : item[rangeField][i] - item[rangeField][i - 1];
const rangeValues = [item[rangeField]].flat();
rangeValues.sort((a: number, b: number) => a - b);
rangeValues.forEach((d: number, i: number) => {
const range = i === 0 ? d : rangeValues[i] - rangeValues[i - 1];
ds.push({
rKey: `${rangeField}_${i}`,
[xField]: xField ? item[xField] : String(index), // 没有xField就用索引
[rangeField]: range,
});
});

// 构建 title * measure
item[measureField].forEach((d: number, i: number) => {
const measureValues = [item[measureField]].flat();
measureValues.forEach((d: number, i: number) => {
ds.push({
mKey: item[measureField].length > 1 ? `${measureField}_${i}` : `${measureField}`, // 一个数据就不带索引了
mKey: getSeriesFieldKey(measureValues, measureField, i),
[xField]: xField ? item[xField] : String(index),
[measureField]: d,
});
});

// 构建 title * target
ds.push({
tKey: `${targetField}`,
[xField]: xField ? item[xField] : String(index),
[targetField]: item[targetField],
const targetValues = [item[targetField]].flat();
targetValues.forEach((d: number, i: number) => {
ds.push({
tKey: getSeriesFieldKey(targetValues, targetField, i),
[xField]: xField ? item[xField] : String(index),
[targetField]: d,
});
});

// 为了取最大值和最小值,先存储
scales.push(item[rangeField], item[measureField], item[targetField]);
});
Expand Down