From 7be1f63af3449a2ba220f228ba21187e87ce2467 Mon Sep 17 00:00:00 2001 From: Marco Vettorello Date: Fri, 3 Apr 2020 19:06:00 +0200 Subject: [PATCH] fix: stack as percentage with 0 or null values (#618) This commit fix a regression related to the rendering of stacked area/bar charts where Y values are 0 or null and the stack is configured as percentage fix #617 --- ...th-zeros-visually-looks-correct-1-snap.png | Bin 0 -> 35148 bytes .../rendering/rendering.areas.test.ts | 112 ++++++++ .../utils/stacked_series_utils.test.ts | 25 +- .../xy_chart/utils/stacked_series_utils.ts | 37 ++- stories/area/8_stacked_percentage_zeros.tsx | 242 ++++++++++++++++++ stories/area/area.stories.tsx | 1 + 6 files changed, 405 insertions(+), 12 deletions(-) create mode 100644 integration/tests/__image_snapshots__/all-test-ts-baseline-visual-tests-for-all-stories-area-chart-stacked-percentage-with-zeros-visually-looks-correct-1-snap.png create mode 100644 stories/area/8_stacked_percentage_zeros.tsx diff --git a/integration/tests/__image_snapshots__/all-test-ts-baseline-visual-tests-for-all-stories-area-chart-stacked-percentage-with-zeros-visually-looks-correct-1-snap.png b/integration/tests/__image_snapshots__/all-test-ts-baseline-visual-tests-for-all-stories-area-chart-stacked-percentage-with-zeros-visually-looks-correct-1-snap.png new file mode 100644 index 0000000000000000000000000000000000000000..d53744abdfe288054c74a5bc8c79119f8960d6a0 GIT binary patch literal 35148 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 z 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 E0FPXn+a literal 0 HcmV?d00001 diff --git a/src/chart_types/xy_chart/rendering/rendering.areas.test.ts b/src/chart_types/xy_chart/rendering/rendering.areas.test.ts index 21e072e9e3..b49cd2daa4 100644 --- a/src/chart_types/xy_chart/rendering/rendering.areas.test.ts +++ b/src/chart_types/xy_chart/rendering/rendering.areas.test.ts @@ -26,6 +26,7 @@ import { computeSeriesDomains } from '../state/utils'; import { renderArea } from './rendering'; import { ChartTypes } from '../..'; import { SpecTypes } from '../../../specs/settings'; +import { MockSeriesSpec } from '../../../mocks/specs'; const SPEC_ID = 'spec_1'; const GROUP_ID = 'group_1'; @@ -1081,4 +1082,115 @@ describe('Rendering points - areas', () => { expect((zeroValueIndexdGeometry[0] as PointGeometry).radius).toBe(0); }); }); + it('Stacked areas with 0 values', () => { + const pointSeriesSpec1: AreaSeriesSpec = MockSeriesSpec.area({ + id: 'spec_1', + data: [ + [1546300800000, 0], + [1546387200000, 5], + ], + xAccessor: 0, + yAccessors: [1], + xScaleType: ScaleType.Time, + yScaleType: ScaleType.Linear, + stackAccessors: [0], + stackAsPercentage: true, + }); + const pointSeriesSpec2: AreaSeriesSpec = MockSeriesSpec.area({ + id: 'spec_2', + data: [ + [1546300800000, 0], + [1546387200000, 2], + ], + xAccessor: 0, + yAccessors: [1], + xScaleType: ScaleType.Time, + yScaleType: ScaleType.Linear, + stackAccessors: [0], + stackAsPercentage: true, + }); + const pointSeriesDomains = computeSeriesDomains([pointSeriesSpec1, pointSeriesSpec2]); + expect(pointSeriesDomains.formattedDataSeries.stacked[0].dataSeries[0].data).toEqual([ + { + datum: [1546300800000, 0], + initialY0: null, + initialY1: null, + x: 1546300800000, + y0: null, + y1: null, + }, + { + datum: [1546387200000, 5], + initialY0: null, + initialY1: 0.7142857142857143, + x: 1546387200000, + y0: null, + y1: 0.7142857142857143, + }, + ]); + }); + it('Stacked areas with null values', () => { + const pointSeriesSpec1: AreaSeriesSpec = MockSeriesSpec.area({ + id: 'spec_1', + data: [ + [1546300800000, null], + [1546387200000, 5], + ], + xAccessor: 0, + yAccessors: [1], + xScaleType: ScaleType.Time, + yScaleType: ScaleType.Linear, + stackAccessors: [0], + }); + const pointSeriesSpec2: AreaSeriesSpec = MockSeriesSpec.area({ + id: 'spec_2', + data: [ + [1546300800000, 3], + [1546387200000, null], + ], + xAccessor: 0, + yAccessors: [1], + xScaleType: ScaleType.Time, + yScaleType: ScaleType.Linear, + stackAccessors: [0], + }); + const pointSeriesDomains = computeSeriesDomains([pointSeriesSpec1, pointSeriesSpec2]); + expect(pointSeriesDomains.formattedDataSeries.stacked[0].dataSeries[0].data).toEqual([ + { + datum: [1546300800000, null], + initialY0: null, + initialY1: null, + x: 1546300800000, + y0: null, + y1: null, + }, + { + datum: [1546387200000, 5], + initialY0: null, + initialY1: 5, + x: 1546387200000, + y0: null, + y1: 5, + }, + ]); + + expect(pointSeriesDomains.formattedDataSeries.stacked[0].dataSeries[1].data).toEqual([ + { + datum: [1546300800000, 3], + initialY0: null, + initialY1: 3, + x: 1546300800000, + y0: null, + y1: 3, + }, + { + datum: [1546387200000, null], + initialY0: null, + initialY1: null, + x: 1546387200000, + y0: null, + y1: null, + }, + ]); + }); }); diff --git a/src/chart_types/xy_chart/utils/stacked_series_utils.test.ts b/src/chart_types/xy_chart/utils/stacked_series_utils.test.ts index 0d0a75d836..d8d39344b2 100644 --- a/src/chart_types/xy_chart/utils/stacked_series_utils.test.ts +++ b/src/chart_types/xy_chart/utils/stacked_series_utils.test.ts @@ -17,7 +17,13 @@ * under the License. */ import { RawDataSeries } from './series'; -import { computeYStackedMapValues, formatStackedDataSeriesValues, getYValueStackMap } from './stacked_series_utils'; +import { + computeYStackedMapValues, + formatStackedDataSeriesValues, + getYValueStackMap, + getStackedFormattedSeriesDatum, + StackedValues, +} from './stacked_series_utils'; import { ScaleType } from '../../../scales'; describe('Stacked Series Utils', () => { @@ -439,4 +445,21 @@ describe('Stacked Series Utils', () => { }); }); }); + test('Correctly handle 0 values on percentage stack', () => { + const stackedValues: Map = new Map(); + stackedValues.set(1, { + values: [0, 0, 0], + percent: [null, null, null], + total: 0, + }); + const formattedDatum = getStackedFormattedSeriesDatum({ x: 1, y1: 0 }, stackedValues, 0, false, true); + expect(formattedDatum).toEqual({ + datum: undefined, + initialY0: null, + initialY1: null, + x: 1, + y0: null, + y1: null, + }); + }); }); diff --git a/src/chart_types/xy_chart/utils/stacked_series_utils.ts b/src/chart_types/xy_chart/utils/stacked_series_utils.ts index 37cb66a407..9a81594406 100644 --- a/src/chart_types/xy_chart/utils/stacked_series_utils.ts +++ b/src/chart_types/xy_chart/utils/stacked_series_utils.ts @@ -19,9 +19,10 @@ import { DataSeries, DataSeriesDatum, RawDataSeries, RawDataSeriesDatum, FilledValues } from './series'; import { ScaleType } from '../../../scales'; -interface StackedValues { +/** @internal */ +export interface StackedValues { values: number[]; - percent: number[]; + percent: Array; total: number; } @@ -103,6 +104,9 @@ export function computeYStackedMapValues( }, ); const percent = stackArray.values.map((value) => { + if (stackArray.total === 0) { + return null; + } return value / stackArray.total; }); stackedValues.set(xValue, { @@ -124,7 +128,6 @@ export function formatStackedDataSeriesValues( ): DataSeries[] { const yValueStackMap = getYValueStackMap(dataseries, xValues); const stackedValues = computeYStackedMapValues(yValueStackMap, scaleToExtent); - const stackedDataSeries: DataSeries[] = dataseries.map((ds, seriesIndex) => { const newData: DataSeriesDatum[] = []; const missingXValues = new Set([...xValues]); @@ -169,11 +172,11 @@ export function formatStackedDataSeriesValues( data: newData, }; }); - return stackedDataSeries; } -function getStackedFormattedSeriesDatum( +/** @internal */ +export function getStackedFormattedSeriesDatum( data: RawDataSeriesDatum, stackedValues: Map, seriesIndex: number, @@ -187,12 +190,19 @@ function getStackedFormattedSeriesDatum( return; } let y1: number | null = null; + let y0: number | null | undefined = null; if (isPercentageMode) { - y1 = data.y1 != null ? data.y1 / stack.total : null; + if (data.y1 != null && stack.total !== 0) { + y1 = data.y1 / stack.total; + } + if (data.y0 != null && stack.total !== 0) { + y0 = data.y0 / stack.total; + } } else { y1 = data.y1; + y0 = data.y0; } - const y0 = isPercentageMode && data.y0 != null ? data.y0 / stack.total : data.y0; + let computedY0: number | null; if (scaleToExtent) { computedY0 = y0 ? y0 : y1; @@ -216,11 +226,16 @@ function getStackedFormattedSeriesDatum( let stackedY1: number | null = null; let stackedY0: number | null = null; if (isPercentageMode) { - stackedY1 = y1 !== null ? stackY + y1 : null; - stackedY0 = y0 != null ? stackY + y0 : stackY; + stackedY1 = y1 !== null && stackY != null ? stackY + y1 : null; + stackedY0 = y0 != null && stackY != null ? stackY + y0 : stackY; } else { - stackedY1 = y1 !== null ? stackY + y1 : null; - stackedY0 = y0 != null ? stackY + y0 : stackY; + if (stackY == null) { + stackedY1 = y1 !== null ? y1 : null; + stackedY0 = y0 != null ? y0 : stackY; + } else { + stackedY1 = y1 !== null ? stackY + y1 : null; + stackedY0 = y0 != null ? stackY + y0 : stackY; + } // configure null y0 if y1 is null // it's semantically correct to say y0 is null if y1 is null if (stackedY1 === null) { diff --git a/stories/area/8_stacked_percentage_zeros.tsx b/stories/area/8_stacked_percentage_zeros.tsx new file mode 100644 index 0000000000..e52c234277 --- /dev/null +++ b/stories/area/8_stacked_percentage_zeros.tsx @@ -0,0 +1,242 @@ +/* + * Licensed to Elasticsearch B.V. under one or more contributor + * license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright + * ownership. Elasticsearch B.V. licenses this file to you under + * the Apache License, Version 2.0 (the "License"); you may + * not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. */ + +import React from 'react'; +import { AreaSeries, Axis, Chart, Position, ScaleType, Settings, niceTimeFormatter } from '../../src'; + +export const example = () => { + return ( + + + + `${Number(d * 100).toFixed(0)} %`} + /> + + + + + + ); +}; + +const DATA = [ + { + id: '61ca57f1-469d-11e7-af02-69e470af7417:200', + label: '200', + color: 'rgb(115, 216, 255)', + data: [ + [1585234800000, 10], + [1585249200000, 6], + [1585263600000, 2], + [1585278000000, 5], + [1585292400000, 70], + [1585306800000, 84], + [1585321200000, 32], + [1585335600000, 3], + [1585350000000, 2], + [1585364400000, 18], + [1585378800000, 66], + [1585393200000, 82], + [1585407600000, 32], + [1585422000000, 4], + [1585436400000, 1], + [1585447200000, 9], + [1585461600000, 58], + [1585476000000, 70], + [1585490400000, 58], + [1585504800000, 9], + [1585519200000, 0], + [1585533600000, 10], + [1585548000000, 46], + [1585562400000, 95], + [1585576800000, 43], + [1585591200000, 10], + [1585605600000, 1], + [1585620000000, 8], + [1585634400000, 56], + [1585648800000, 88], + [1585663200000, 50], + [1585677600000, 7], + [1585692000000, 1], + [1585706400000, 9], + [1585720800000, 59], + [1585735200000, 83], + [1585749600000, 46], + [1585764000000, 7], + [1585778400000, 2], + [1585792800000, 12], + [1585807200000, 44], + [1585821600000, 84], + [1585836000000, 41], + ], + seriesId: '61ca57f1-469d-11e7-af02-69e470af7417', + stack: 'percent', + lines: { show: true, fill: 0.5, lineWidth: 2, steps: false }, + points: { show: false, radius: 1, lineWidth: 5 }, + bars: { show: false, fill: 0.5, lineWidth: 2 }, + }, + { + id: '61ca57f1-469d-11e7-af02-69e470af7417:404', + label: '404', + color: 'rgb(0, 157, 217)', + data: [ + [1585234800000, 0], + [1585249200000, 0], + [1585263600000, 0], + [1585278000000, 1], + [1585292400000, 6], + [1585306800000, 8], + [1585321200000, 3], + [1585335600000, 0], + [1585350000000, 1], + [1585364400000, 1], + [1585378800000, 2], + [1585393200000, 3], + [1585407600000, 1], + [1585422000000, 0], + [1585436400000, 0], + [1585447200000, 1], + [1585461600000, 0], + [1585476000000, 6], + [1585490400000, 3], + [1585504800000, 0], + [1585519200000, 0], + [1585533600000, 1], + [1585548000000, 4], + [1585562400000, 6], + [1585576800000, 1], + [1585591200000, 0], + [1585605600000, 1], + [1585620000000, 0], + [1585634400000, 1], + [1585648800000, 6], + [1585663200000, 4], + [1585677600000, 0], + [1585692000000, 0], + [1585706400000, 0], + [1585720800000, 1], + [1585735200000, 8], + [1585749600000, 2], + [1585764000000, 0], + [1585778400000, 0], + [1585792800000, 0], + [1585807200000, 1], + [1585821600000, 6], + [1585836000000, 3], + ], + seriesId: '61ca57f1-469d-11e7-af02-69e470af7417', + stack: 'percent', + lines: { show: true, fill: 0.5, lineWidth: 2, steps: false }, + points: { show: false, radius: 1, lineWidth: 5 }, + bars: { show: false, fill: 0.5, lineWidth: 2 }, + }, + { + id: '61ca57f1-469d-11e7-af02-69e470af7417:503', + label: '503', + color: 'rgb(0, 46, 64)', + data: [ + [1585234800000, 0], + [1585249200000, 0], + [1585263600000, 0], + [1585278000000, 1], + [1585292400000, 2], + [1585306800000, 3], + [1585321200000, 3], + [1585335600000, 0], + [1585350000000, 0], + [1585364400000, 0], + [1585378800000, 2], + [1585393200000, 2], + [1585407600000, 2], + [1585422000000, 0], + [1585436400000, 0], + [1585447200000, 0], + [1585461600000, 1], + [1585476000000, 3], + [1585490400000, 2], + [1585504800000, 0], + [1585519200000, 0], + [1585533600000, 0], + [1585548000000, 2], + [1585562400000, 1], + [1585576800000, 3], + [1585591200000, 0], + [1585605600000, 0], + [1585620000000, 0], + [1585634400000, 1], + [1585648800000, 1], + [1585663200000, 1], + [1585677600000, 0], + [1585692000000, 0], + [1585706400000, 0], + [1585720800000, 1], + [1585735200000, 3], + [1585749600000, 1], + [1585764000000, 1], + [1585778400000, 0], + [1585792800000, 0], + [1585807200000, 2], + [1585821600000, 1], + [1585836000000, 3], + ], + seriesId: '61ca57f1-469d-11e7-af02-69e470af7417', + stack: 'percent', + lines: { show: true, fill: 0.5, lineWidth: 2, steps: false }, + points: { show: false, radius: 1, lineWidth: 5 }, + bars: { show: false, fill: 0.5, lineWidth: 2 }, + }, +]; diff --git a/stories/area/area.stories.tsx b/stories/area/area.stories.tsx index 762d7b43a1..6debf19144 100644 --- a/stories/area/area.stories.tsx +++ b/stories/area/area.stories.tsx @@ -33,6 +33,7 @@ export { example as with4Axes } from './5_with_4_axes'; export { example as withAxisAndLegend } from './6_with_axis_and_legend'; export { example as stacked } from './7_stacked'; export { example as stackedPercentage } from './8_stacked_percentage'; +export { example as stackedPercentageWithZeros } from './8_stacked_percentage_zeros'; export { example as stackedSeparateSpecs } from './9_stacked_separate_specs'; export { example as stackedSameNaming } from './10_stacked_same_naming'; export { example as bandArea } from './13_band_area';