Skip to content

Commit fe11d2f

Browse files
authored
fix: data normalization with alignment (#1365)
fixes multi series charts rendering fixes #1235
1 parent 0223b1f commit fe11d2f

File tree

6 files changed

+113
-20
lines changed

6 files changed

+113
-20
lines changed

src/axes/FixedScaleAxis.ts

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -24,9 +24,9 @@ export class FixedScaleAxis extends Axis {
2424
const divisor = options.divisor || 1;
2525
const ticks = (
2626
options.ticks ||
27-
times(divisor).map(
28-
(_value, index) =>
29-
highLow.low + ((highLow.high - highLow.low) / divisor) * index
27+
times(
28+
divisor,
29+
index => highLow.low + ((highLow.high - highLow.low) / divisor) * index
3030
)
3131
).sort((a, b) => Number(a) - Number(b));
3232
const range = {

src/core/data/normalize.spec.ts

Lines changed: 86 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -14,9 +14,20 @@ describe('Core', () => {
1414
};
1515

1616
expect(normalizeData(data).series).toEqual([
17-
[1, 0, 3, 4, 5, 6],
18-
[1, 0, 3, 4, 5, 6, 7, 8],
19-
[1, 0, 3]
17+
[1, 0, 3, 4, 5, 6, undefined, undefined, undefined, undefined],
18+
[1, 0, 3, 4, 5, 6, 7, 8, undefined, undefined],
19+
[
20+
1,
21+
0,
22+
3,
23+
undefined,
24+
undefined,
25+
undefined,
26+
undefined,
27+
undefined,
28+
undefined,
29+
undefined
30+
]
2031
]);
2132
});
2233

@@ -47,9 +58,20 @@ describe('Core', () => {
4758
};
4859

4960
expect(normalizeData(data).series).toEqual([
50-
[1, 0, 3, 4, 5, 6],
51-
[1, 0, 3, 4, 5, 6, 7, 8],
52-
[1, 0, 3]
61+
[1, 0, 3, 4, 5, 6, undefined, undefined, undefined, undefined],
62+
[1, 0, 3, 4, 5, 6, 7, 8, undefined, undefined],
63+
[
64+
1,
65+
0,
66+
3,
67+
undefined,
68+
undefined,
69+
undefined,
70+
undefined,
71+
undefined,
72+
undefined,
73+
undefined
74+
]
5375
]);
5476
});
5577

@@ -64,9 +86,31 @@ describe('Core', () => {
6486
};
6587

6688
expect(normalizeData(data).series).toEqual([
67-
[undefined, undefined, undefined, 4, 5, 6],
68-
[1, undefined, 3, undefined, 5, 6, 7, 8],
69-
[1, 0, undefined]
89+
[
90+
undefined,
91+
undefined,
92+
undefined,
93+
4,
94+
5,
95+
6,
96+
undefined,
97+
undefined,
98+
undefined,
99+
undefined
100+
],
101+
[1, undefined, 3, undefined, 5, 6, 7, 8, undefined, undefined],
102+
[
103+
1,
104+
0,
105+
undefined,
106+
undefined,
107+
undefined,
108+
undefined,
109+
undefined,
110+
undefined,
111+
undefined,
112+
undefined
113+
]
70114
]);
71115
});
72116

@@ -140,6 +184,39 @@ describe('Core', () => {
140184

141185
expect(normalizeData(data).series).toEqual([[0, 1, 2, 3]]);
142186
});
187+
188+
it('should align series data by holes', () => {
189+
const data = {
190+
series: [
191+
[1, 2, 3, 4],
192+
[1, 2, 3],
193+
[1, 2]
194+
]
195+
};
196+
197+
expect(normalizeData(data).series).toEqual([
198+
[1, 2, 3, 4],
199+
[1, 2, 3, undefined],
200+
[1, 2, undefined, undefined]
201+
]);
202+
});
203+
204+
it('should align series data with lables by holes', () => {
205+
const data = {
206+
labels: ['a', 'b', 'c', 'd', 'e', 'f'],
207+
series: [
208+
[1, 2, 3, 4],
209+
[1, 2, 3],
210+
[1, 2]
211+
]
212+
};
213+
214+
expect(normalizeData(data).series).toEqual([
215+
[1, 2, 3, 4, undefined, undefined],
216+
[1, 2, 3, undefined, undefined, undefined],
217+
[1, 2, undefined, undefined, undefined, undefined]
218+
]);
219+
});
143220
});
144221
});
145222
});

src/core/data/normalize.ts

Lines changed: 11 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -53,24 +53,31 @@ export function normalizeData(
5353
) {
5454
let labelCount: number;
5555
const normalized: NormalizedData = {
56-
labels: [],
56+
labels: (data.labels || []).slice(),
5757
series: normalizeSeries(data.series, multi, distributed)
5858
};
59+
const inputLabelCount = normalized.labels.length;
5960

6061
// If all elements of the normalized data array are arrays we're dealing with
6162
// multi series data and we need to find the largest series if they are un-even
6263
if (isArrayOfArrays(normalized.series)) {
6364
// Getting the series with the the most elements
64-
labelCount = Math.max(...normalized.series.map(series => series.length));
65+
labelCount = Math.max(
66+
inputLabelCount,
67+
...normalized.series.map(series => series.length)
68+
);
69+
70+
normalized.series.forEach(series => {
71+
series.push(...times(Math.max(0, labelCount - series.length)));
72+
});
6573
} else {
6674
// We're dealing with Pie data so we just take the normalized array length
6775
labelCount = normalized.series.length;
6876
}
6977

70-
normalized.labels = (data.labels || []).slice();
7178
// Padding the labels to labelCount with empty strings
7279
normalized.labels.push(
73-
...times(Math.max(0, labelCount - normalized.labels.length)).map(() => '')
80+
...times(Math.max(0, labelCount - inputLabelCount), () => '')
7481
);
7582

7683
if (reverse) {

src/utils/functional.ts

Lines changed: 13 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -8,8 +8,17 @@ export const noop = <T>(n: T) => n;
88
/**
99
* Functional style helper to produce array with given length initialized with undefined values
1010
*/
11-
export const times = <T = unknown>(length: number): T[] =>
12-
Array.from({ length });
11+
export function times(length: number): undefined[];
12+
export function times<T = unknown>(
13+
length: number,
14+
filler: (index: number) => T
15+
): T[];
16+
export function times<T = unknown>(
17+
length: number,
18+
filler?: (index: number) => T
19+
) {
20+
return Array.from({ length }, filler ? (_, i) => filler(i) : () => void 0);
21+
}
1322

1423
/**
1524
* Sum helper to be used in reduce functions
@@ -32,6 +41,6 @@ export const sum = (previous: number, current: number) =>
3241
* ```
3342
*/
3443
export const serialMap = <T, K>(array: T[][], callback: (...args: T[]) => K) =>
35-
times(Math.max(...array.map(element => element.length))).map(
36-
(_inner, index) => callback(...array.map(element => element[index]))
44+
times(Math.max(...array.map(element => element.length)), index =>
45+
callback(...array.map(element => element[index]))
3746
);
6 Bytes
Loading
-17 Bytes
Loading

0 commit comments

Comments
 (0)