From 1ca9649807685508816ccf20036ace95a8509fc2 Mon Sep 17 00:00:00 2001 From: Evert Timberg Date: Wed, 30 Dec 2020 18:06:39 -0500 Subject: [PATCH 01/22] Create a new hook to enable data decimation The `beforeElementUpdate` hook can be used to decimate data. The chart elements will not be created until after this hook has fired ensuring that if decimation occurs, only the needed elements will be created. --- src/core/core.controller.js | 7 ++++++- src/core/core.datasetController.js | 27 +++++++++++---------------- types/index.esm.d.ts | 12 ++++++++++-- 3 files changed, 27 insertions(+), 19 deletions(-) diff --git a/src/core/core.controller.js b/src/core/core.controller.js index 3a143bf60a2..54d8e680672 100644 --- a/src/core/core.controller.js +++ b/src/core/core.controller.js @@ -466,9 +466,14 @@ class Chart { // Make sure dataset controllers are updated and new controllers are reset const newControllers = me.buildOrUpdateControllers(); + me.notifyPlugins('beforeElementUpdate'); + // Make sure all dataset controllers have correct meta data counts for (i = 0, ilen = me.data.datasets.length; i < ilen; i++) { - me.getDatasetMeta(i).controller.buildOrUpdateElements(); + const {controller} = me.getDatasetMeta(i); + // New controllers will be reset after the layout pass, so we only want to modify + // elements added to new datasets + controller.buildOrUpdateElements(!animsDisabled && newControllers.indexOf(controller) === -1); } me._updateLayout(); diff --git a/src/core/core.datasetController.js b/src/core/core.datasetController.js index 9aec58bbb46..efe536e0659 100644 --- a/src/core/core.datasetController.js +++ b/src/core/core.datasetController.js @@ -349,19 +349,12 @@ export default class DatasetController { me._dataCheck(); - const data = me._data; - const metaData = meta.data = new Array(data.length); - - for (let i = 0, ilen = data.length; i < ilen; ++i) { - metaData[i] = new me.dataElementType(); - } - if (me.datasetElementType) { meta.dataset = new me.datasetElementType(); } } - buildOrUpdateElements() { + buildOrUpdateElements(resetNewElements) { const me = this; const meta = me._cachedMeta; const dataset = me.getDataset(); @@ -382,7 +375,7 @@ export default class DatasetController { // Re-sync meta data in case the user replaced the data array or if we missed // any updates and so make sure that we handle number of datapoints changing. - me._resyncElements(); + me._resyncElements(resetNewElements); // if stack changed, update stack values for the whole dataset if (stackChanged) { @@ -402,7 +395,7 @@ export default class DatasetController { me.getDataset(), ], { merger(key, target, source) { - if (key !== 'data') { + if (key !== 'data' && key.charAt(0) !== '_') { _merger(key, target, source); } } @@ -422,9 +415,9 @@ export default class DatasetController { let sorted = true; let i, parsed, cur, prev; - if (start > 0) { + if (start > 0 || (start === 0 && count < data.length)) { sorted = meta._sorted; - prev = meta._parsed[start - 1]; + prev = start > 0 ? meta._parsed[start - 1] : undefined; } if (me._parsing === false) { @@ -971,13 +964,13 @@ export default class DatasetController { /** * @private */ - _resyncElements() { + _resyncElements(resetNewElements) { const me = this; const numMeta = me._cachedMeta.data.length; const numData = me._data.length; if (numData > numMeta) { - me._insertElements(numMeta, numData - numMeta); + me._insertElements(numMeta, numData - numMeta, resetNewElements); } else if (numData < numMeta) { me._removeElements(numData, numMeta - numData); } @@ -988,7 +981,7 @@ export default class DatasetController { /** * @private */ - _insertElements(start, count) { + _insertElements(start, count, resetNewElements = true) { const me = this; const elements = new Array(count); const meta = me._cachedMeta; @@ -1005,7 +998,9 @@ export default class DatasetController { } me.parse(start, count); - me.updateElements(data, start, count, 'reset'); + if (resetNewElements) { + me.updateElements(data, start, count, 'reset'); + } } updateElements(element, start, count, mode) {} // eslint-disable-line no-unused-vars diff --git a/types/index.esm.d.ts b/types/index.esm.d.ts index f78955e0131..2a8bbe225c6 100644 --- a/types/index.esm.d.ts +++ b/types/index.esm.d.ts @@ -539,7 +539,7 @@ export class DatasetController extends ExtendedPlugin { * @param {object} options - The plugin options. * @returns {boolean} `false` to cancel the chart update. */ - beforeUpdate?(chart: Chart, args: { mode: UpdateMode }, options: O): boolean | void; + beforeUpdate?(chart: Chart, args: { mode: UpdateMode }, options: O): boolean | void; + /** + * @desc Called during the update process, before any chart elements have been created. + * This can be used for data decimation by changing the data array inside a dataset. + * @param {Chart} chart - The chart instance. + * @param {object} args - The call arguments. + * @param {object} options - The plugin options. + */ + beforeElementUpdate?(chart: Chart, args: {}, options: O): void; /** * @desc Called after `chart` has been updated and before rendering. Note that this * hook will not be called if the chart update has been previously cancelled. From 58b99e3a473ae4bf1f364dd09f96dcf3bcb91038 Mon Sep 17 00:00:00 2001 From: Evert Timberg Date: Wed, 30 Dec 2020 19:18:34 -0500 Subject: [PATCH 02/22] Address code review feedback --- src/core/core.controller.js | 3 ++- src/core/core.datasetController.js | 3 +++ types/index.esm.d.ts | 18 +++++++++--------- 3 files changed, 14 insertions(+), 10 deletions(-) diff --git a/src/core/core.controller.js b/src/core/core.controller.js index 54d8e680672..db8918cb56b 100644 --- a/src/core/core.controller.js +++ b/src/core/core.controller.js @@ -471,9 +471,10 @@ class Chart { // Make sure all dataset controllers have correct meta data counts for (i = 0, ilen = me.data.datasets.length; i < ilen; i++) { const {controller} = me.getDatasetMeta(i); + const reset = !animsDisabled && newControllers.indexOf(controller) === -1; // New controllers will be reset after the layout pass, so we only want to modify // elements added to new datasets - controller.buildOrUpdateElements(!animsDisabled && newControllers.indexOf(controller) === -1); + controller.buildOrUpdateElements(reset); } me._updateLayout(); diff --git a/src/core/core.datasetController.js b/src/core/core.datasetController.js index efe536e0659..773fa3433da 100644 --- a/src/core/core.datasetController.js +++ b/src/core/core.datasetController.js @@ -395,6 +395,9 @@ export default class DatasetController { me.getDataset(), ], { merger(key, target, source) { + // Cloning the data is expensive and unnecessary. + // Additionally, plugins may add dataset level fields that should + // not be cloned. We identify those via an underscore prefix if (key !== 'data' && key.charAt(0) !== '_') { _merger(key, target, source); } diff --git a/types/index.esm.d.ts b/types/index.esm.d.ts index 2a8bbe225c6..2dac6e13dd9 100644 --- a/types/index.esm.d.ts +++ b/types/index.esm.d.ts @@ -780,14 +780,6 @@ export interface Plugin extends ExtendedPlugin { * @returns {boolean} `false` to cancel the chart update. */ beforeUpdate?(chart: Chart, args: { mode: UpdateMode }, options: O): boolean | void; - /** - * @desc Called during the update process, before any chart elements have been created. - * This can be used for data decimation by changing the data array inside a dataset. - * @param {Chart} chart - The chart instance. - * @param {object} args - The call arguments. - * @param {object} options - The plugin options. - */ - beforeElementUpdate?(chart: Chart, args: {}, options: O): void; /** * @desc Called after `chart` has been updated and before rendering. Note that this * hook will not be called if the chart update has been previously cancelled. @@ -796,7 +788,15 @@ export interface Plugin extends ExtendedPlugin { * @param {UpdateMode} args.mode - The update mode * @param {object} options - The plugin options. */ - afterUpdate?(chart: Chart, args: { mode: UpdateMode }, options: O): void; + afterUpdate?(chart: Chart, args: { mode: UpdateMode }, options: O): void; + /** + * @desc Called during the update process, before any chart elements have been created. + * This can be used for data decimation by changing the data array inside a dataset. + * @param {Chart} chart - The chart instance. + * @param {object} args - The call arguments. + * @param {object} options - The plugin options. + */ + beforeElementUpdate?(chart: Chart, args: {}, options: O): void; /** * @desc Called during chart reset * @param {Chart} chart - The chart instance. From 51f00c6a4243331c3d22dd342134369b18c1969d Mon Sep 17 00:00:00 2001 From: Evert Timberg Date: Thu, 31 Dec 2020 10:21:39 -0500 Subject: [PATCH 03/22] Rename hook to beforeElementsUpdate --- src/core/core.controller.js | 2 +- types/index.esm.d.ts | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/core/core.controller.js b/src/core/core.controller.js index db8918cb56b..9fae07125d6 100644 --- a/src/core/core.controller.js +++ b/src/core/core.controller.js @@ -466,7 +466,7 @@ class Chart { // Make sure dataset controllers are updated and new controllers are reset const newControllers = me.buildOrUpdateControllers(); - me.notifyPlugins('beforeElementUpdate'); + me.notifyPlugins('beforeElementsUpdate'); // Make sure all dataset controllers have correct meta data counts for (i = 0, ilen = me.data.datasets.length; i < ilen; i++) { diff --git a/types/index.esm.d.ts b/types/index.esm.d.ts index 2dac6e13dd9..02698e6bc77 100644 --- a/types/index.esm.d.ts +++ b/types/index.esm.d.ts @@ -796,7 +796,7 @@ export interface Plugin extends ExtendedPlugin { * @param {object} args - The call arguments. * @param {object} options - The plugin options. */ - beforeElementUpdate?(chart: Chart, args: {}, options: O): void; + beforeElementsUpdate?(chart: Chart, args: {}, options: O): void; /** * @desc Called during chart reset * @param {Chart} chart - The chart instance. From c71b6f71454f872c88b283b8ce7fd0eb275deacc Mon Sep 17 00:00:00 2001 From: Evert Timberg Date: Thu, 31 Dec 2020 10:27:09 -0500 Subject: [PATCH 04/22] Simplify parsing logic --- src/core/core.datasetController.js | 9 +++------ 1 file changed, 3 insertions(+), 6 deletions(-) diff --git a/src/core/core.datasetController.js b/src/core/core.datasetController.js index 773fa3433da..6cc65deaa3f 100644 --- a/src/core/core.datasetController.js +++ b/src/core/core.datasetController.js @@ -415,13 +415,10 @@ export default class DatasetController { const {_cachedMeta: meta, _data: data} = me; const {iScale, _stacked} = meta; const iAxis = iScale.axis; - let sorted = true; - let i, parsed, cur, prev; - if (start > 0 || (start === 0 && count < data.length)) { - sorted = meta._sorted; - prev = start > 0 ? meta._parsed[start - 1] : undefined; - } + let sorted = start === 0 && count === data.length ? true : meta._sorted; + let prev = start > 0 && meta._parsed[start - 1]; + let i, cur, parsed; if (me._parsing === false) { meta._parsed = data; From 987ef8bf89b7ff710dfa29a5e29c069ef7538027 Mon Sep 17 00:00:00 2001 From: Evert Timberg Date: Thu, 31 Dec 2020 11:58:54 -0500 Subject: [PATCH 05/22] Add decimation plugin to the core --- src/plugins/index.js | 1 + src/plugins/plugin.decimation.js | 83 ++++++++++++++++++++++++++++++++ 2 files changed, 84 insertions(+) create mode 100644 src/plugins/plugin.decimation.js diff --git a/src/plugins/index.js b/src/plugins/index.js index 65e8ec4a190..6a228f013e8 100644 --- a/src/plugins/index.js +++ b/src/plugins/index.js @@ -1,3 +1,4 @@ +export {default as Decimation} from './plugin.decimation'; export {default as Filler} from './plugin.filler'; export {default as Legend} from './plugin.legend'; export {default as Title} from './plugin.title'; diff --git a/src/plugins/plugin.decimation.js b/src/plugins/plugin.decimation.js new file mode 100644 index 00000000000..9c1adbff5ef --- /dev/null +++ b/src/plugins/plugin.decimation.js @@ -0,0 +1,83 @@ +export default { + id: 'decimation', + + beforeElementsUpdate: (chart, args, options) => { + if (!options.enabled) { + return; + } + + // Use an approximation since this is before scales are parsed + const verticalAxisCount = Object.values(chart.scales).reduce((acc, scale) => acc + scale.axis === 'y' ? 1 : 0, 0); + + // assume ~50px for now. If the axis is actually wider then we have more points than needed + // TODO: Take display settings into account and compute a more accurate guess for each axis + const availableWidth = chart.width - (verticalAxisCount * 50); + + chart.data.datasets.forEach((dataset, datasetIndex) => { + let i, point, x, y, prevX, minIndex, maxIndex, minY, maxY; + const {data} = dataset; + const meta = chart.getDatasetMeta(datasetIndex); + + if (meta.type !== 'line') { + // Only line datasets are supported + return; + } + + const xAxis = chart.scales[meta.xAxisID]; + if (xAxis.type !== 'linear' && xAxis.type !== 'time') { + // Only linear interpolation is supported + return; + } + + if (chart.options.parsing) { + // Plugin only supports data that does not need parsing + return; + } + + if (data.length <= 4 * availableWidth) { + // No decimation is required until we are above this threshold + return; + } + + const decimated = []; + + const xMin = data[0].x; + const xMax = data[data.length - 1].x; + const dx = xMax - xMin; + + for (i = 0; i < data.length; ++i) { + point = data[i]; + x = (point.x - xMin) / dx * availableWidth; + y = point.y; + const truncX = x | 0; + + if (truncX === prevX) { + // Determine `minY` / `maxY` and `avgX` while we stay within same x-position + if (y < minY) { + minY = y; + minIndex = i; + } else if (y > maxY) { + maxY = y; + maxIndex = i; + } + } else { + // Push up to 4 points, 3 for the last interval and the first point for this interval + if (minIndex && maxIndex) { + decimated.push(data[minIndex], data[maxIndex]); + } + if (i > 0) { + // Last point in the previous interval + decimated.push(data[i - 1]); + } + decimated.push(point); + prevX = truncX; + minY = maxY = y; + minIndex = maxIndex = i; + } + } + + dataset._data = dataset.data; + dataset.data = decimated; + }); + } +}; From f26b0c15461d35013aa880e3920eb0868f456b2c Mon Sep 17 00:00:00 2001 From: Evert Timberg Date: Thu, 31 Dec 2020 13:32:15 -0500 Subject: [PATCH 06/22] Allow a dataset to specify a different data key --- docs/docs/general/data-structures.md | 1 + src/controllers/controller.doughnut.js | 3 ++- src/controllers/controller.polarArea.js | 9 ++++++--- src/controllers/controller.radar.js | 3 ++- src/core/core.datasetController.js | 16 ++++++++++++---- types/index.esm.d.ts | 3 ++- 6 files changed, 25 insertions(+), 10 deletions(-) diff --git a/docs/docs/general/data-structures.md b/docs/docs/general/data-structures.md index 113e7266089..705381e4992 100644 --- a/docs/docs/general/data-structures.md +++ b/docs/docs/general/data-structures.md @@ -64,6 +64,7 @@ In this mode, property name is used for `index` scale and value for `value` scal | Name | Type | Description | ---- | ---- | ----------- +| `dataKey` | `string` | If specified, tells the chart to look for the dataset data in `dataset[dataset.dataKey]`. If unspecified, this defaults to `'data'`. | `label` | `string` | The label for the dataset which appears in the legend and tooltips. | `clip` | `number`\|`object` | How to clip relative to chartArea. Positive value allows overflow, negative value clips that many pixels inside chartArea. 0 = clip at chartArea. Clipping can also be configured per side: clip: {left: 5, top: false, right: -2, bottom: 0} | `order` | `number` | The drawing order of dataset. Also affects order for stacking, tooltip and legend. diff --git a/src/controllers/controller.doughnut.js b/src/controllers/controller.doughnut.js index 2374fcd0e45..ceb403a9aa3 100644 --- a/src/controllers/controller.doughnut.js +++ b/src/controllers/controller.doughnut.js @@ -56,7 +56,8 @@ export default class DoughnutController extends DatasetController { * Override data parsing, since we are not using scales */ parse(start, count) { - const data = this.getDataset().data; + const dataKey = this.getDataKey(); + const data = this.getDataset()[dataKey]; const meta = this._cachedMeta; let i, ilen; for (i = start, ilen = start + count; i < ilen; ++i) { diff --git a/src/controllers/controller.polarArea.js b/src/controllers/controller.polarArea.js index 432268a240e..87b4414576a 100644 --- a/src/controllers/controller.polarArea.js +++ b/src/controllers/controller.polarArea.js @@ -52,6 +52,7 @@ export default class PolarAreaController extends DatasetController { const centerX = scale.xCenter; const centerY = scale.yCenter; const datasetStartAngle = getStartAngleRadians(opts.startAngle); + const dataKey = me.getDataKey(); let angle = datasetStartAngle; let i; @@ -64,7 +65,7 @@ export default class PolarAreaController extends DatasetController { const arc = arcs[i]; let startAngle = angle; let endAngle = angle + me._computeAngle(i, mode); - let outerRadius = this.chart.getDataVisibility(i) ? scale.getDistanceFromCenterForValue(dataset.data[i]) : 0; + let outerRadius = this.chart.getDataVisibility(i) ? scale.getDistanceFromCenterForValue(dataset[dataKey][i]) : 0; angle = endAngle; if (reset) { @@ -94,10 +95,11 @@ export default class PolarAreaController extends DatasetController { countVisibleElements() { const dataset = this.getDataset(); const meta = this._cachedMeta; + const dataKey = this.getDataKey(); let count = 0; meta.data.forEach((element, index) => { - if (!isNaN(dataset.data[index]) && this.chart.getDataVisibility(index)) { + if (!isNaN(dataset[dataKey][index]) && this.chart.getDataVisibility(index)) { count++; } }); @@ -113,8 +115,9 @@ export default class PolarAreaController extends DatasetController { const meta = me._cachedMeta; const count = meta.count; const dataset = me.getDataset(); + const dataKey = me.getDataKey(); - if (isNaN(dataset.data[index]) || !this.chart.getDataVisibility(index)) { + if (isNaN(dataset[dataKey][index]) || !this.chart.getDataVisibility(index)) { return 0; } diff --git a/src/controllers/controller.radar.js b/src/controllers/controller.radar.js index 74f03fb9286..26439703918 100644 --- a/src/controllers/controller.radar.js +++ b/src/controllers/controller.radar.js @@ -44,13 +44,14 @@ export default class RadarController extends DatasetController { updateElements(points, start, count, mode) { const me = this; const dataset = me.getDataset(); + const dataKey = me.getDataKey(); const scale = me._cachedMeta.rScale; const reset = mode === 'reset'; for (let i = start; i < start + count; i++) { const point = points[i]; const options = me.resolveDataElementOptions(i, mode); - const pointPosition = scale.getPointPositionForValue(i, dataset.data[i]); + const pointPosition = scale.getPointPositionForValue(i, dataset[dataKey][i]); const x = reset ? scale.xCenter : pointPosition.x; const y = reset ? scale.yCenter : pointPosition.y; diff --git a/src/core/core.datasetController.js b/src/core/core.datasetController.js index 6cc65deaa3f..31cbc007073 100644 --- a/src/core/core.datasetController.js +++ b/src/core/core.datasetController.js @@ -1,6 +1,6 @@ import Animations from './core.animations'; import defaults from './core.defaults'; -import {isObject, merge, _merger, isArray, valueOrDefault, mergeIf, resolveObjectKey, _capitalize} from '../helpers/helpers.core'; +import {isObject, merge, _merger, isArray, valueOrDefault, mergeIf, resolveObjectKey, _capitalize, isNullOrUndef} from '../helpers/helpers.core'; import {listenArrayEvents, unlistenArrayEvents} from '../helpers/helpers.collection'; import {resolve} from '../helpers/helpers.options'; import {getHoverColor} from '../helpers/helpers.color'; @@ -278,6 +278,11 @@ export default class DatasetController { return this.chart.data.datasets[this.index]; } + getDataKey() { + const {dataKey} = this.getDataset(); + return isNullOrUndef(dataKey) ? 'data' : dataKey; + } + getMeta() { return this.chart.getDatasetMeta(this.index); } @@ -323,7 +328,8 @@ export default class DatasetController { _dataCheck() { const me = this; const dataset = me.getDataset(); - const data = dataset.data || (dataset.data = []); + const dataKey = me.getDataKey(); + const data = dataset[dataKey] || (dataset[dataKey] = []); // In order to correctly handle data addition/deletion animation (an thus simulate // real-time charts), we need to monitor these data modifications and synchronize @@ -389,6 +395,7 @@ export default class DatasetController { */ configure() { const me = this; + const dataKey = me.getDataKey(); me._config = merge(Object.create(null), [ defaults.controllers[me._type].datasets, (me.chart.options.datasets || {})[me._type], @@ -398,7 +405,7 @@ export default class DatasetController { // Cloning the data is expensive and unnecessary. // Additionally, plugins may add dataset level fields that should // not be cloned. We identify those via an underscore prefix - if (key !== 'data' && key.charAt(0) !== '_') { + if (key !== 'data' && key !== dataKey && key.charAt(0) !== '_') { _merger(key, target, source); } } @@ -1026,7 +1033,8 @@ export default class DatasetController { */ _onDataPush() { const count = arguments.length; - this._insertElements(this.getDataset().data.length - count, count); + const dataKey = this.getDataKey(); + this._insertElements(this.getDataset()[dataKey].length - count, count); } /** diff --git a/types/index.esm.d.ts b/types/index.esm.d.ts index 02698e6bc77..81732f8842b 100644 --- a/types/index.esm.d.ts +++ b/types/index.esm.d.ts @@ -533,7 +533,8 @@ export class DatasetController; getScaleForId(scaleID: string): Scale | undefined; configure(): void; From a80a4e12508847eb49637fb43f20fd0a1da0edfe Mon Sep 17 00:00:00 2001 From: Evert Timberg Date: Thu, 31 Dec 2020 13:39:32 -0500 Subject: [PATCH 07/22] Decimation plugin uses the dataKey feature --- src/plugins/plugin.decimation.js | 16 +++++++++++++--- 1 file changed, 13 insertions(+), 3 deletions(-) diff --git a/src/plugins/plugin.decimation.js b/src/plugins/plugin.decimation.js index 9c1adbff5ef..af0ba18fcbf 100644 --- a/src/plugins/plugin.decimation.js +++ b/src/plugins/plugin.decimation.js @@ -1,3 +1,5 @@ +import {isNullOrUndef} from '../helpers'; + export default { id: 'decimation', @@ -15,8 +17,15 @@ export default { chart.data.datasets.forEach((dataset, datasetIndex) => { let i, point, x, y, prevX, minIndex, maxIndex, minY, maxY; - const {data} = dataset; + const {_originalDataKey} = dataset; const meta = chart.getDatasetMeta(datasetIndex); + const dataKey = !isNullOrUndef(_originalDataKey) ? _originalDataKey : meta.controller.getDataKey(); + const data = dataset[dataKey]; + + if (isNullOrUndef(_originalDataKey)) { + // Store this for the next update + dataset._originalDataKey = dataKey; + } if (meta.type !== 'line') { // Only line datasets are supported @@ -76,8 +85,9 @@ export default { } } - dataset._data = dataset.data; - dataset.data = decimated; + // Point the chart to the decimated data + dataset._decimated = decimated; + dataset.dataKey = '_decimated'; }); } }; From 42ef5eeead77bd20bfa1d14d215c67f372ea3e95 Mon Sep 17 00:00:00 2001 From: Evert Timberg Date: Thu, 31 Dec 2020 16:12:05 -0500 Subject: [PATCH 08/22] Refactor the decimation plugin to support configurable algorithms --- src/plugins/plugin.decimation.js | 92 +++++++++++++++++++------------- 1 file changed, 55 insertions(+), 37 deletions(-) diff --git a/src/plugins/plugin.decimation.js b/src/plugins/plugin.decimation.js index af0ba18fcbf..226fd6cffa3 100644 --- a/src/plugins/plugin.decimation.js +++ b/src/plugins/plugin.decimation.js @@ -1,8 +1,55 @@ import {isNullOrUndef} from '../helpers'; +function minMaxDecimation(data, availableWidth) { + let i, point, x, y, prevX, minIndex, maxIndex, minY, maxY; + const decimated = []; + + const xMin = data[0].x; + const xMax = data[data.length - 1].x; + const dx = xMax - xMin; + + for (i = 0; i < data.length; ++i) { + point = data[i]; + x = (point.x - xMin) / dx * availableWidth; + y = point.y; + const truncX = x | 0; + + if (truncX === prevX) { + // Determine `minY` / `maxY` and `avgX` while we stay within same x-position + if (y < minY) { + minY = y; + minIndex = i; + } else if (y > maxY) { + maxY = y; + maxIndex = i; + } + } else { + // Push up to 4 points, 3 for the last interval and the first point for this interval + if (minIndex && maxIndex) { + decimated.push(data[minIndex], data[maxIndex]); + } + if (i > 0) { + // Last point in the previous interval + decimated.push(data[i - 1]); + } + decimated.push(point); + prevX = truncX; + minY = maxY = y; + minIndex = maxIndex = i; + } + } + + return decimated; +} + export default { id: 'decimation', + defaults: { + algorithm: 'min-max', + enabled: false, + }, + beforeElementsUpdate: (chart, args, options) => { if (!options.enabled) { return; @@ -16,7 +63,6 @@ export default { const availableWidth = chart.width - (verticalAxisCount * 50); chart.data.datasets.forEach((dataset, datasetIndex) => { - let i, point, x, y, prevX, minIndex, maxIndex, minY, maxY; const {_originalDataKey} = dataset; const meta = chart.getDatasetMeta(datasetIndex); const dataKey = !isNullOrUndef(_originalDataKey) ? _originalDataKey : meta.controller.getDataKey(); @@ -48,44 +94,16 @@ export default { return; } - const decimated = []; - - const xMin = data[0].x; - const xMax = data[data.length - 1].x; - const dx = xMax - xMin; - - for (i = 0; i < data.length; ++i) { - point = data[i]; - x = (point.x - xMin) / dx * availableWidth; - y = point.y; - const truncX = x | 0; - - if (truncX === prevX) { - // Determine `minY` / `maxY` and `avgX` while we stay within same x-position - if (y < minY) { - minY = y; - minIndex = i; - } else if (y > maxY) { - maxY = y; - maxIndex = i; - } - } else { - // Push up to 4 points, 3 for the last interval and the first point for this interval - if (minIndex && maxIndex) { - decimated.push(data[minIndex], data[maxIndex]); - } - if (i > 0) { - // Last point in the previous interval - decimated.push(data[i - 1]); - } - decimated.push(point); - prevX = truncX; - minY = maxY = y; - minIndex = maxIndex = i; - } + // Point the chart to the decimated data + let decimated; + switch (options.algorithm) { + case 'min-max': + decimated = minMaxDecimation(data, availableWidth); + break; + default: + throw new Error(`Unsupported decimation algorithm '${options.algorithm}'`); } - // Point the chart to the decimated data dataset._decimated = decimated; dataset.dataKey = '_decimated'; }); From c525c6965b21895a50fde282e9ecd2983d2948b9 Mon Sep 17 00:00:00 2001 From: Evert Timberg Date: Thu, 31 Dec 2020 17:26:19 -0500 Subject: [PATCH 09/22] Lint the plugin changes --- src/plugins/plugin.decimation.js | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/src/plugins/plugin.decimation.js b/src/plugins/plugin.decimation.js index 226fd6cffa3..4c598959ddf 100644 --- a/src/plugins/plugin.decimation.js +++ b/src/plugins/plugin.decimation.js @@ -97,11 +97,11 @@ export default { // Point the chart to the decimated data let decimated; switch (options.algorithm) { - case 'min-max': - decimated = minMaxDecimation(data, availableWidth); - break; - default: - throw new Error(`Unsupported decimation algorithm '${options.algorithm}'`); + case 'min-max': + decimated = minMaxDecimation(data, availableWidth); + break; + default: + throw new Error(`Unsupported decimation algorithm '${options.algorithm}'`); } dataset._decimated = decimated; From eb73050c2001a38ca60ddff7f0ce31f81d8b55c5 Mon Sep 17 00:00:00 2001 From: Evert Timberg Date: Thu, 31 Dec 2020 17:26:26 -0500 Subject: [PATCH 10/22] Tests for the dataKey feature --- test/fixtures/controller.bar/data-key.js | 29 +++++++++++++ test/fixtures/controller.bar/data-key.png | Bin 0 -> 6200 bytes test/fixtures/controller.doughnut/data-key.js | 30 ++++++++++++++ .../fixtures/controller.doughnut/data-key.png | Bin 0 -> 41963 bytes test/fixtures/controller.line/data-key.js | 29 +++++++++++++ test/fixtures/controller.line/data-key.png | Bin 0 -> 8745 bytes .../fixtures/controller.polarArea/data-key.js | 39 ++++++++++++++++++ .../controller.polarArea/data-key.png | Bin 0 -> 21480 bytes test/fixtures/controller.radar/data-key.js | 28 +++++++++++++ test/fixtures/controller.radar/data-key.png | Bin 0 -> 18551 bytes 10 files changed, 155 insertions(+) create mode 100644 test/fixtures/controller.bar/data-key.js create mode 100644 test/fixtures/controller.bar/data-key.png create mode 100644 test/fixtures/controller.doughnut/data-key.js create mode 100644 test/fixtures/controller.doughnut/data-key.png create mode 100644 test/fixtures/controller.line/data-key.js create mode 100644 test/fixtures/controller.line/data-key.png create mode 100644 test/fixtures/controller.polarArea/data-key.js create mode 100644 test/fixtures/controller.polarArea/data-key.png create mode 100644 test/fixtures/controller.radar/data-key.js create mode 100644 test/fixtures/controller.radar/data-key.png diff --git a/test/fixtures/controller.bar/data-key.js b/test/fixtures/controller.bar/data-key.js new file mode 100644 index 00000000000..8f971f325de --- /dev/null +++ b/test/fixtures/controller.bar/data-key.js @@ -0,0 +1,29 @@ +module.exports = { + config: { + type: 'bar', + data: { + labels: [0, 1, 3, 4], + datasets: [ + { + data2: [5, 20, 10, 11], + dataKey: 'data2', + backgroundColor: '#00ff00', + borderColor: '#ff0000', + borderWidth: 2, + } + ] + }, + options: { + scales: { + x: {display: false}, + y: {display: false} + } + } + }, + options: { + canvas: { + height: 256, + width: 512 + } + } +}; diff --git a/test/fixtures/controller.bar/data-key.png b/test/fixtures/controller.bar/data-key.png new file mode 100644 index 0000000000000000000000000000000000000000..7a83ce1544039ad531f76ad68a16400a9f61626b GIT binary patch literal 6200 zcmeHKTT~NS7QIy|AfSc-DlG&O)Zo}4Fp3fcnkXQ~AlT>#h$y{Kc_|`@#0RFp2imsC z(&1r?APO>$52B(xl{mD75kXpPbQDbxXhhzM5FsRU3g)A`=hu%}YsgP!)w*@gJ^Spv z@43gLH>Zhz;1abSu*aMLT;&YfXulsRt+Sx+46g}T0w1ox~jpkR#&kmStd6?v?PQV6Ljfvl9=*Xk{SWR?#l2jWfg57Ep7aKxha0TrD zF;aRUb=OX|=A(~hL^-@$eYrwBDwDaY>cp<<5%~U>0$Hn1abz(qTG;S;4@z3ZM@bS7 z7Y~IortBP*iB~`<^VoyUd zFsYsmGu;Zw%m2L(4rZE>8R|tuUIkM**e;f?9XN&BA~?vg=`;i8CYrx-^4(s+t@V*pU`lj>fxG>_(W37Srt34Ha%oM{WMXr5rwD z1P8HRDv>B4MQyvvg?Hzs7>{0~XwM}Sh8G$`=_2$vI${4W)j9y&Zq4bZFI=%>Lwy?U z%&G;Q0f1nDZ@g^rH;66`Dwr4QFyw>0O)8w47*aFWP<@yj-Gb#C?+#!zH^oks@1yE?~WTM8VcIGQ2wjSg?-b zg0$An6kv-Ec>kc2P@r_TSOQYTwbEerEfWjEyK|8H=x_##E#bNdN#rbi-&;cARnj%s z)=gy;9Ez8{#7bH_x-Ec~^zL)DP$8XvdA}2KtiLWGF5EfWUU>p;2oR80eA#|zrw+$q z0l|@Nc#2_oH0pZWP_09nktdex`|N;htaQ;X9#%qjJadG2DLq|Q4ioVTQA}3g89G05 zQLWe*tC>oXJ!*A$x17O`+Cb;0+{vRs%TUw9+>`pq2^k+T&wdFF|+|4vIgYo%Nc^7~bFO?}Xx2SuXD6_}Kri z35G%CveL!JQPGmys(1tPF$A32(e&49bq{L0eB=+DmC&NUeb;h@%2s7)%b16Z`?HpM zlIZcxgoO5qczrYYDY21;SlEtjpZjK`vlw;Xx(*uzHm;t6)!acoCYCp{Q8>myWtkyx7dqPGxzYl$bMs5(D}gp;AGDw~SfAqAcxw*fw)#5& zXX(}}It4}`OGX{AbygGLjHh<0xj=KA*(2YKKW<4Mw8rp$>nr80CTv6~ZZw{`O=X-n z?TuNajv^)Jb~0dXA=zp3ibCvcFI3JewlpA{wxw%q@YGolu%-FOr!Oka$mSv@$%+){ zK-aKqC)`Zg2zsLD;yf;5|F;iY2nC+Kwgcih-YqO_o``o3{~|hsFp@F)d_pm&$bQ&V z7ii;mAMC_NVU`7U0DYWan+xX6 zjf>w%iK;nnU(6m#`FRh@LwZp2K$Ma={YF#t>HUvfwa?eb0h;vY}6D|B2`K zMRa%_ZrXR*7Dv#5!|A^soI}y(kukJJtK!hw@zyZ(Dx8Zbzstxs&+-Q6b+iYzZt@>Ijq=ACoFzJop|fisfv(GlaVS(ccQyafDC zaqHQk#z-wiI~FZrByTcQ4vG$xRs2+*?Ty~d=*YR}|9iLXQwd3e<3QL72u^J|_d3O? zn8u&S4=1@5vVCRbs!}R#l0!E8woa4MI1b4pPi{teMF50tmiZ$yK-28Q)u!<18_OWZ zI{Y0h7Xv|J&QRxu)ftnWKr@H0fAbAxJ${yp-+*mLtsBezVkbCs3-`3fjK_1tt|VbIxUA{qyke*3dHB`(Al7|n5*53XLe@XCNT?Dx_|4Xdj< zk7|09FSv8uR@f|w+E#dI9GgxGC|hd==vZBk@~ExWocvxLd(HHW37AExfI2YK1ScK9 r4NPZD7BJa?NeWGh`2WX+`W7IKj**v4zl$@Hhu|mh@OHnkJUHp!PnyD) literal 0 HcmV?d00001 diff --git a/test/fixtures/controller.doughnut/data-key.js b/test/fixtures/controller.doughnut/data-key.js new file mode 100644 index 00000000000..32e60fb84c8 --- /dev/null +++ b/test/fixtures/controller.doughnut/data-key.js @@ -0,0 +1,30 @@ +module.exports = { + config: { + type: 'doughnut', + data: { + labels: ['A', 'B', 'C', 'D', 'E'], + datasets: [{ + data2: [1, 5, 10, 50, 100], + dataKey: 'data2', + backgroundColor: [ + 'rgba(255, 99, 132, 0.8)', + 'rgba(54, 162, 235, 0.8)', + 'rgba(255, 206, 86, 0.8)', + 'rgba(75, 192, 192, 0.8)', + 'rgba(153, 102, 255, 0.8)' + ], + borderWidth: 20, + borderColor: [ + 'rgb(255, 99, 132)', + 'rgb(54, 162, 235)', + 'rgb(255, 206, 86)', + 'rgb(75, 192, 192)', + 'rgb(153, 102, 255)' + ] + }] + }, + options: { + responsive: false + } + } +} diff --git a/test/fixtures/controller.doughnut/data-key.png b/test/fixtures/controller.doughnut/data-key.png new file mode 100644 index 0000000000000000000000000000000000000000..02eae1725c84a37add7393e8d48c2965120cafb0 GIT binary patch literal 41963 zcmXt9Wmr{h)7>X%q`OlF&-$35aw^hqQEeNr!@fq;z+8eaGj$zF+Wb zpMB50X3eZMvm;cLWL}_>paKB!LQYmv6#&5Sf58AUBK*&V=hPhlPyuq1V(Oj-2Yx6i zdQ#0-_n8LfLmduSKjK3|UPD!`6tATaa6DeDd24fWiHWs`8+Zw!#i>GU6H<3~kItWz-IS@QYcF;y1pK^P_Pn-IyVTp4H61jr zZ;yNz0k!740DTOM1>bl)YH&K%62NrQ$*9WEu*t6Q^x zVC5BIK2|?v21y($Tr5|REU@Qs^{nsj>U)vhPgYNjjoOat$UwC~Jxj~#-s0%~{h5LK zz`1vEE~$9__5?wq0U=9eKgX<#6R0NBLVOMBGs~%t#-_$7GC~bx0+S&cp@uW1E_Xr0 zo5%JdjttqqUQ;B;~$m-+5w$71Vq5fOnM zjqq`Oh`xG}fCoe)_^9{+M5z%M#Ss*7M z+V;hW=r43V7i^gjHNLE%b%0D}g^xP=)fMFJSBwKRuzM)8<7tM+`Yv^zi7xLS01;5cn|SwL946 zoWGp&KDZuvwy|4!ir#l&h*J;_o3Ng+ufCmlA1af@XJM-=O5R|vjR+ory#T<1Z>FoM zIL5UGhW4VKq9~0ipt!*sd8~#{Zk~b^=~ESGzxXgfsHd+3!$4j{(L(V?7r8Pb+#4F} z{pIk(p>P>NU^o;)`z^$XB>SElAk6!N;7-r|Rr8iP2I~?8kg&(6%Ho`rnh55`Y_4yY z<{`|-NzJ^6Ea1%Pd^4(8_(`Z@dyF&B5(4`LF!EMjH)&CIrDAx^ch@5g7NhEt(}6uP74&XaLh2by;Xb`b*@&Xo&-o zI?bQ%uuicSP2{aLvA86wW6_3Cvz#|XRUlETFA0~Nn25-wji*Cvesy{z3BXdQhwVsUy0!LG|UW+NQk@TNTrEp zKw2=ZTwB6kpmGL6;OT3g%^%Jx5CC+V`~G_E8%O8BN>%rvZw(|!1l&fxx3HYC zd42Wufz$3#3(=L+2m)l<>by22YT5!TVTL+U!(srH>vKDfQPEg1>@Vgm@k@G$GT50C zmX3|_oUKoM66|6lK?vai#{2U7IEG;@-;q{K=zigLFGP{lt{`z>Tl%CPG#P zPV$Ck*6MO&2m=u?Uq&nf_7G35Xu(1aQ!B%3Y++#Gdosum4k}T~uLN?qkP)_x_q$lX zkWQI=VwG`A5Pm?JfSbwRhP~sCOyq;x=HU-GE0tzT!!oF3s0)8NbN=1GW!?lB{|8K< zn^I}@?-Biz8d`Ua-6a=RB48xn_u*lA%3=RF$1uEC0?Qzn<0gr$rKX3ib~@TDhv6Rz zx21j)Q8A7X(jKAy3SN-_zDI6-;r`125kmo%c+ZY+_IeGIo-E^hsA|CRPtBvPhp7|C zv4>(z|BkInR*!S-bsH+A$a0E%qYNrc^z<11@t6YzmQ!4D38I?z?W)mle!#QXH+PQ2s?4Mwi}KrwFW@v1?tv(qkFb+Z#S$W*o_w2o_pT}0^hr>y zSo=F4BdDu)Cr+Sr`dHG)*AllBFcrXGUg$>Ds@3C@wH!bG!!?w#1gn zk?@X!mO-Mk@3`o5!<1h5aE`l}QvI8aEc*NlrF_1%(DbJ8mRV{c# zC&3)uV*HEa&)9aoUo2)=pshp)`f3c;ck5UlY8C7Uj!1*lSie7&j&wda z%_7Dzuc+&N97En1Gj6V{1Bo_&am{+PEnAPEtC)Ti9h%GxO2?K(sZI}CG}_7)q2j9C zrKo&51Jnyz1q3p7a1k(7*nm!u%4a>ZXF9@T8UZdHCYhY0H7>ME(Hu%1|@Td5MGLh3gti?{k;UztjOBc$Dc{ z=LLWKzI@4;qEl}*`%}j6nK5(r(B4(Ip3XoBSxtR{<_m0)9VWq9TU0l4PSp{;Zhu=4 z-XVlr@Gj!gpAu5=w)s%j+T5tmtL)(O+6d60RkJ2Edazh3?0Z?uT-#`9-Uko6z}%l{ zis-jyL0eLJIz@UsPMh#wk^7YOh3d~Wx4;k`JqhBlBTRyN!X}<3vxB&sh7xk4!T&TZ z7`3819&h>&jr_Le866GDlpe5S3CD0^G{pCR@P)hWTV`2 z!5`SP-`$r5Ha=-vMBOwt)asDS>t~p!ss4UR8jfP4A~G_JyA{d*!Saq zN2hBg`mfgj3AZ)7+0PkM91Ap&bVW4RBdf4{!wougtj<*Rcerbh3W1Y>TZ@fME3U@e zUftJ)!hrQAiEj(_ewuDgzbjtJZ3LKzm7`u@@#@xLrXai~ zMy&HImM@7S=L0Ap0zEyApWhy1J?*TZco@xEYusc(zk$QQrJ*tG+t@xu`0A?g z?^X+6uLh;R?Yld_#FW>j?Eq{OOlWLk<4iVkCz$G z%J)|5Y!U44uh1LS668zQ(v1TGV?n5(JUz8?b>Ua|F*F2jt;2BV@>@HPNuG}7mfv1{ zIu&rjwKp{hbxj@2(#+Jxr~0!ex~s=RmnDH*?|i^g>UL&Z9W(|9SCELbjiUC)>n*2uR70uPo^5#S($#aj zhrB2Tk|{bF@mjlAwa&>0stf*B7M0gekBv4E;F+K8b00h=3=^YU0-6r@W=?j>*ZGX% zKvgsRncrI}XDDxbyav=ebKaSJ<06;S6wvRNjKtUraMv|LXUvOj*TA~?rivDT^!{Pi z9u4YOjCwtW2!y&2S%w_>Jsk($sK;L4{_*nzd?XL|TW3K-vU~IK3=n@L0N?(sFGR9o zbJsrRry?>?-}<}3T8^l>Vpe%s11s+r>X*PAc?M75a^Js=%jDIMTL!crhiT+f4VbT*;v)@G_)Z-|}dlD1ZvRZFX(! zE^v;u^f?;j zhQupos3KV1llk^2q_~<}>h7xH#?o6#m<89<0iF3BR=F zMa*CDnv}SeU?o#$Fx2KeJhq+1Y1-c4^*0HFV=rHk5*W2m>6t4BMI%V+2An(PAM-rm zzjBNqt5w~XkMS2_F|PR6fom3m4Jvc9)WjaLf%Bl9?>MWVs(0ailHdr2yHY(w3@>(P@B#wP^;q`9&hy=8f)CPU$2;kte$4 zy(4}l+O)F-iwIKpHMCn$Pm+cyNOP(uyAJ98A*~#KpKC2Ks$_O)XdS4)EjJ_o!uxG- zaUG^Q71sEMxH~u1_A0ug6e$4pbi8vpoTtyAWA&%*B7XdHd4CMWp)$bkw&AggSw67f z{6kqeX&vC)MMW`XRcQ$p6%c&Sn0)8%UXqA1AQ8lR&_+1P)zCb3tM1CWIKz6XSzDAH%79m*TqEQ#Z=&1P=k2Y zpQBS!nr1*t1Olr{HW*rc>L1u3Ce*5qX{)3-46D<B_2*@tauD6vF z@h9CSKdJ)tjkAiRByt_v2~F+&V*@k=1bq# zm@D=wvCJzfA!zKXL7F>FP~=rcq}>#op6r=5h4Ucchj*E2Cu<4i`ag!q6CyqYL+{efcR)s=J(Zqz2UUQ-9=Q zrJ~C!H8T276Zb6YbN#%PuTYSop={Z&n;f=8AN^f|JBJ7e%uT`msE?3<8ztCPA$r|d z&<50#ns;kz>`5Kq8xkNtzC@C-=7S6pQW+47;oSC7)?8OK6C3NoJLov~!qnH~xV4>n zTT@pb^U2rc^>m`4%fc`e{@U!_)>$c0ZV#NWqq zVPhas9~s7)j&Xm*@_C_yt-KB&^<2LDMh6e(1`UPnNC6H7a+^{?+g^H~G5&8oou)y; zs)ZHUXeZ5ES_kv0+jZ)XaJGq)uBc8HfvqS=ab|NUm`>gD1bfz}_-ifP{mao}rNa67 zp4A{_PhAkz zPc|Hkvtn==?vy6Aq!8Ux5($q21kNq()1m(h$V}Fi%EhiY)9o}h@2G%HZ>LL3OLAm6 z9{H!Z>Es+n!gR4p7lpMOT89IHA+;>P@J{mW&L?q;$~2LHbhfLqIP`xgccOVSeQJs2 zA?BD8V~)uqWlL=|=}O>+HA-^L56sR{e15BG8B>P_6y)h^D6LhCKawyW@;Z)IjWuNE zxkXAb@a_$Bi0586X87NUxUK1wEfK?+OSv|$I=TqdgxkfQtw>?|NmM*MD&*&eW*NuH zNJTcND@Xn8vOPCk=iP8?3Osu}nBCPCwm-FHl8C-gbKP(u-zK{k_g2UF{Df@HK>ZqWvU85bHERc+U$-k$5R)3|k5h~8; zH*i6u`;r-Vy@zQilEjp5E}yrwMEeI^dBnhDoSqACDlcZB0-4q_R>TvUC0|Okwo(xWV{lN71)qw7>*!H zF>kH&&!A*91xQVF_P&Gy+ubA?nbIl-;8fnlA5^mMCvID_Cd`k+1C-tp!>LF$9VgduNmH&I zh;2r>nT)>S2$28jOM9Qqudo%1A`}}fJ=S)gsCM8UZJuTanB`)-)?rp>Zpi4YIk^?gCxhYW6%B-b-+FN=1PQ^p_?_JM z+M+RB7&@iDUE{Yflv>L9ea8Y=X*$BK;FCWVt~5q~oqa2xk@hHxPJO72o+WB8cKF7h zn%=9IUC3pyVU+q&%^kCgUSysu=DD9x7cv|E0zf7E3m3H6d@6FxzA+8E#>~)kw1XhK zx4=KT!1@~Vp01LML9LYMMeA+xvCU7VnWGPFIxLy#h$~fB3k8}SO?zBEZv`gv$CZ=l z8r_>#53ZvJiNIl>$F$A<@GwaI($!GQJ1d=qchhhpN#OfaRvjIQ{2&b&*4o55())~$ zEgiBMJs>)(!J8B?ra~4<;TL3}IhTPpUN!9FNX3K4JyNv(*DOoLogy6l2qkF>5tvq- z7+nlbTvc|6MG%nVukpHJRJj#0l>7oXBl}sXV<2k8pZKGpvmha4xYho+?{36LPWzk- z08WiMHuU^=K5JWG1c)w7YxAQ4i)kqy8!z;Wh;Z*vy6LH6io8x<(1PD%^W(r8OqH5{ zF@0?_)ew3**V|w4cHmsO?y(VdT-F+h1oYN@EW$IfY}J{8j)ew9h0mZ)Fp!J(V@MEa z^1I`WNyqbhw{Wc@lZp!1DaMf886HL!78-4B8WyaTO74Y1CEBwQ-N>l zJOk^RH};LaFRbrZlK3$BTMZMZI`)FHjnE>>`30?+ler=O2tf4ykE91MzzpPDe7>W; zP>YcCVaVHeIZdHiho-1Q>*pMJ2aJ~o`($(({#orpqapnQ1}H1%6lr*R+zEd$J)?V% zg1TRe&atm(0$9$IvI>lq_%N=pXPb%5uqW|SK*d6!t$IQ(S);#cAGb)cvwb9ET$#wK z#gW3Py-Y~p7gnsbLf2@#q(io89CMnDb%z!YPLaal6gw=P@n1N^6tzf5XT*ZyVm#4t$y`)0mTrCI|-*!fdsJ?|nyu_P! z87uExAdB?-=~BvR1@|Bf5LpjfdeK2z!D zeWgB}4GoBWYC9;!MKomXkBx3_AKDMwt46_Fo#Kbsm@ zV7J{F9NaDMY4L3@moW9K#%Qvq%6Hv=k47^1)a?`v?CK(F#BVqDuJd}HRKNZ{53I2C z{8b6* zkbH%#h%2g3c#-Fd;RC$JFW>#?1<)d6^*`rlpi*zzbSwIKlBXzu$yZT+Or{eI z+jE^+a%Z^9C;S9Q2w}rgnT^g)5$ez{j8DRqTN^X!w#?WOO&f2pPd5wDM14rY7x5z> zTd_KkI<^XEW_n4sF~iIqpTds=0;Quk|OfbkxH zk1X@Vgn;gkh&P8Qs)yym8u^%M%KCNYpMS!^4exrKXO>hpwAmi(;h>oX8*B`AXWIx` zcu$O{Ze)b`w>2NMH^_$5Oom)Yy^HPo5PPn(c3Ly7$+QowBujlcA_@!u_D zof#Xg3E=oV(((Gn zU~J_Dz9sKC6FYn;poTz{Xc8Ip9oy4Y=8gA+h!TH+?U+%L9U!VgV&jyK{8nZB^>95$ z_19OGBAi7}@F@h5Syv_8MqI3KUyRuDHT;VTc#&Qix@NucGdsKKUeeh#5DZF8m$oct z$j$z{Dm;@Pz7D9N5bd8oDPcF&78GvzVKFI0T*7-e5}R8Ha>s_(r>)7670KAhG0o}yoi3>l3dM2lOnMay+Q6l=H0}bw~R~vsmyX;DjaaXWvEK| zIdG*c2Gq6nONFi|Slt{7`(_uM8B(N+T)^HTvR{_!<>CC{B-CFqewR;Nl^%_=l1{de z$=O}u^%X;cJ}Qa3HUbdkmhobZ66-unQMOLvBvIo6Z9b6=GvEOgt|f;Eag|JUSsejyku~EHj8!(nz_`ptcVKS)w zUOouM#tfpn{=D8+-dt$jo_hqvXs`vt%p&=J;g^LPWt_gJn$qZGu)=&GE}AFVNrl%> zSaJINEdAM*fzrJPdv#`#*KLG&QEj1LnuBrBQyonz{S+7}5rV zW}`tWGLmGx=^W!XhX9x@bkHjxe83P*eEHqIk!^gc`(HGF6Y?a-{>Qia*Za`ZMEUc5 zczK-R%t-((gJE^|ieJ|ce)V}U15+Xj&kIgh2Lbuf?8zjJ;33nXr9Y(i*MDtafT^)l zk7R17z?cW&(%WBqF1wsjfMk%Ct@~$j^7H*Y|8q?%e>f)bqW+ztD&3!xJ~tzztPD_D zo?IQ%pTvBWTO&6Q^_QejXiYsXnP8^*7%L-@{{v~;!7jRw;MS<9_$8t*Fs?Fo9@?~o zl$;=GJ|?mn%wqF{a~$qMA^_B9r*HC?`5h2ocUe{b$dBr>&I&(Xbm|RLl7BA#6PJg; z{xYnMQY70dy03!CtmE$7PZSA$!|KFOQxl!PhvK!57^dV*Cvnmqqlz9|&8T|dz=p-z zpzM0Ij-UdU!W=)*9$nqs$6IY(L`9U6u=q*X6G@v}C!z5;sF{C#?{+Z}6T^ZQNvc3y zXK4JKhbtV&F9}9fDFLY7d!#2zdcSvY7r6Z&jRQ1AY%=g*-rp={30YKvTko@w4i%KIbwi<7U*kkZ#=AS<<&(3QR3+>ICB=tz9K$R;~=BaL#4(#@2n3&ns zuF@H9v7*k)d)sP-V2~jgFnIF~3!Z_MveoCTi*gAEqHJXmZ=1YbwaVt%RX|@)n zv<6P6wrbyN`5lJPaUEwPo7g5AT(XqKJ&pAv@UcF;K!|OVG4f2qPyzUM16`m@Z(TfI zwHj=@tVX%IsIq>U6ygsBJ{G2m@8mv7uhv8~j%vNJj^fGmC@7^i?R39CFHH&16c>4J zzkUpBWv>k-SI?zX%TU`u22EMRh9>%DO+Sp36eTO-6g&+Qv4gtcLeS3-N`YteAs~}= z=QyP0ybR}2%PBi3ye{e;=f9K56{WcTczheKNp>0R#Z_uBb(O!bC^M0yG(-FHmMh{g zVSMZthIAI!T#V>Pi@xB(?voM9KpB3ki3QDfne)egW<*aXBe@_i0r+$y33%%e?}~$h zUB(c{V>Mu`i->9lzYMB0rDlDlo7E0qcrik%b#b%!IjVse>i;TMo`LAq9Kdwk%!UJI z$AwiZeqQWY{0nc5I2}YFQ;wogfH+hn@I5}mR&?BWCtYn(h8W9mY!AQ75wgsPlmm?)u_{Ts2V3=tQ z7oJxgTW2{io_^rlxjs4(!zj>hJpN-cJiE9Xa^%Wz}_0TV-?M)*Dm2NQK%& zR{*|06A5}4rMrZ>!)A>pKJ_)A@0i0wne!@1(KUo7=6bUgUSMiml)d+QDH}R%f{vV) z!nV6Y6Klp}h>bCV!<&;V8@Y0`C^(E-ff#nqdfY$k2P~G7%BDIQz1WEK7R=>P6u&OsTPpm zzw2TR%eW8oe2@#~`6Bk!6j+%|5^opmkpq|p?7wl#|YdVOE|J_oid_#Shw=$Ov0t~k7_EXr`Ywb<2xQJCDlMSd^Gr{Lx zGy?r_8lC+rE^qJ}-V=W*%AQ#aj7I|=n$D1nxFX71h8jGRL7hY=wErf$9v&eyd+v%c zn^(KbeDwfVUsZ!+|y1(fkg;JHsedIIAbKejpNCnb@Urt!1eF|S;}XW$3hxl zY{}EXp?9L1L4733UR!z*UaT0{Uq=YErI2wLZ&7al(wH+=_?D;+uNWhS;VWv0sqe5n ze^A_U4OWF-g~FK(?Q=RFG}0^ZOkr*MYdhG zb$foyDt+BH|2hI#*;96LWDI3MNZF_lZk}!&@^>~Ho@Pcs^hE^>c9BDU5_?%SK{<31 zzxochDO%^q?GIY(b#Mgd7cJ#%L!oE2G@OWCrfMD7o>nq%1P&>SGH`Cb%9$jnGc?0@ zc%UjpxGn)@qgDats*m%=#6(!=H`suBp{g!CZNDzdYr#do{v>~Zw1RU3&+d9~6N_dp z2rvKT{ibVFRn6$q?fAPaHD;N9aP%1bFD^6>c99;;YfH2pR7 z8yxruFI^z>M2x9sL<1N^eM}q=lctkgAp(tNAW{9PA2mr|KYhz(Mvz_&uf-w;z2C)p zswu!O{FzqA_k=z;I`?ox7LG32f^6jw@rC6*KYsW~iuPji(wc!b{bDTnO!9!>g(@#( z6z{BiPwSvJ3Fj}_i$Dx`S-4RHvbnhgREnOa79t--Q)y<`2%1#R+TW>im+8M<;7gb6RYWIDfTzGNACjEuJ|XaZr`TNplD;?HG#=B0H@t3@ zo~(BtrY_n0)8Iwf6h;=pf#Z-B+(M_o93iPm<+7!M07?4+1CC|EE5#W;YX#rh&$dHZ zbQ_`nj*i@Xglpx5!M7{aZarB=8gth%J!aQR>Ic8JFQSO>R_8$gHu4TznlPOzbu&QsH3Sk54+y~U zb3ji918YRUVrq}cFvWA9F*DyCZZ74;qnf(cKU)PH|CN~t`{Z`z5l|*C=kBTluay@a zfeLZeU^44rEUC8>s%kEgOb@!UCm!IETe0n>iw7G5i5Bw?-aW5jmbaK z`@cJ};rPi;_3AV|7!@Zen(DiMq$$M>K9&n-(fxH{5n%M(nP5pMc7Hh8!SAhlv0_AR zXdd(mFg4ggDvnLWzZ>#c+xQ(#gH0V17|yi2Qn;m6_7-#I3pWa!P}E1%7;jojmga2( z3RCKvT8IXP4iF>|h@jn6;3P0#%gK4)E*qfI^#4m$Gm}Fi%fYmp_8&#>oAP}HR?czldt_uDHPYw4^a~IdKL!|v`1kq=>{9r)tCCg| z6e}YZyBkWH{}>-8CExC0Ip1C;2>FOC2{Ox(3_#=S3`sb#GIyk!3-I(qs?)-p97KqNmdi&rx97o2zNkvK14)% zwmzqwJ?H8~4m~UwJIIK2--o#E2@FGJi10D@UqUnObkmog2Q`A!hd#MqFLXJEe(HT7 z_HZZ0yZgwQBq+IfA~n#G zPTlKFw}eGM%`aV(nafKr1)@>U6s#7b7c@WvK?5Z(OK_l8Z1RC0#B-T`7G-xx2sR;! z;`*H%QCJqQXCv_SsO6C{xAqc%FyfhiRyUWM6YnH|+}N8&m=r3GOms~75w=j6F{IuzZ%E|3LYkx;;IgX*H zOrcVFxhV+wS6dXl;bG^=bvdoBjz$ChO;ymZbVGK9A=^GVRz6l=Li$9tpeAx(2sr2% zNQ#fZ@Uv=CxN|EJuU!vBv4)eUCV|$d-huV;o;ssFe(5BnnIE`I)8pu8et~m}KBN#k zj3zpq45Iq{QJ*st9Ni&E5%3{zBrE4L0q|O1-r|8kh`P&FnPOWjl{G6Uhh<=|A0%%v{|_oe%e`rx&xxYzhj!1{zjf# zmMX+aG7Jst%Q6?8oBlsnMY>OevzXp;jp}7-S|ChKFM|XS3^HrQMGS~Zn=Vnvm}sm^ zm3^GZ85*pg9=PWNU4YlaGjsnNDUFGKG1XHw1jP{Et&Rl>>YC+nQ4!@X-DpU61TOu_ zy8F7{V_2Vw<@KUb@sa0Sbi>zUFjLX+Q!Wm2i6~WN0m`|!i2h-wy{TUydHqj6BhdmB zM1I{NqcPt|sClAM@n|Y$n+Q!mHWO zZ1?@pRZPDDxQguJarAJbIO=89{f`S_xNb3l_9BMI(V@wKV}g-hCEmXKUa#qmj+{fM zKOoMII2Z8MZfJY8auAg|%24?c1EUlq-KMI;iRkmU&(m{07qhs7Ks0M7n;Rwy|=J@T;z}>J&z`r=X37z6pa_guQ zevBvL;*b>;&=>j)c#AyU2(0ugJFCdh z8-y6;AN}G;$3O5|Y$9+l;-CVDbwS0<5r!L^DP0M+o32gNFMEmwuly`A_lG>3uTBC! z?oxLmd(SMNu=T0jarua>*}8|3rW5|>sL%Q zZOZ5c&iyH%w)OB^!~2`XH%)Yl|6ylD1OzwMXKYAI^w3$+lj%WgU;j9r6wQ`YZ>5E>ye_5JJphSq*?&0u}2kL@eP ztf0+K4?SZ%tcUCKWFga8(94z}jt)iVfF1AD-deDb#AOvjmJ@VL^~BXL;ihBNf9>Z2 z=Er&AANq_(-tc zLmlZ%NjvhcoZmPT<~af4K{|9?eszzT2OR`<3Lr(`wz7k2b&VtZ-Cdr~SrU5|ETuU4 z`z6D{n_r*3gP-9An0#faA@ksa(} zm@(&{@#rnUiYZ_k${?NlTrdC|v<1AC#*Suuz=U|R1#%};E5);pdy3wU)y2VVY zDildTEqeE;q;Dh+bO{nth58*SY=>_uaD!VBnk2%LdOX%DTt0lR)b8@#HN}*^>H0Q= ze7cyEfwCe3oId*Yvwq0!I5e@$OSK()b!tSf%0@?|iW=I0Zi*-=4dGMtAbiw9U?%}m zR3B(#)#JGT90uqPXMsSU+|U%PmLn(M**Cwv@L7+;oRY%wepDalM}ys^mZqO)ope-R zFM2Wx&!v>e)6EMK*Ncnv6JcOgnX3D$e_jc9uN;hlk32hnM=!jvd;@3LO&#Q|9rvu> zNT6Z2zuvQ;4<^5kX8MM{A92p*etgW&^=1btMpVER6fPi|$QpcA^N0L%pI!ENbSox1 z4HNI~Ckh_(E-+FIXlPX95Su>m9&W`aymOn?`sb>0h1}G-52XIS@&DWLXk*b(2hitD zdE`g*6r_dEBCKHuXfgHbU%qpvoJFhL_=ZIhkAO85q?dD^Uys&}~3?i?J*#xqV}|WPev07^2ds8Q$Betqy5yHAU`Q(h(dcZKd#`#X4t1c#LIN3a@6y{d2%(Abf^`zdsyl3Kq~qi9Q*9A3h+&%SLIU^2bD4 z)}LU+g!WZBp9I^8uoIM=Xi{s%D^s0>RcKotWH2`gBcHwrs`q1@ z#7QNrtl7ZyHbOtS?MB=jE8ZE>njy&wvVBn@^;MB51q83+apBI8QYN}3=09cJ33Pm) zlna%D>%gm}PJ4sk=$XfH%?Oh^%8Jv!9>%0lO$Nc!^GF9gAB;Y(z%3F}XSDDK%&v3l ziQ^F&Ft)FyM>&5Oj3;(XjQ(|PK^c*wRKEZ$;s90;-}P|LG_`&K__u{?{GsJ^c&2p~ zKqHJdbj{Uw&$h7Xjzt_w-HbF z7#W@0xU>Da{X|r$SaC&S$x=ZKCX&fS>{4VPb$8M7WnE~NWkg@}Z@IAPe>V{cvLs|z zk+&G!dTcDvBcejIxOymPVt7P(=zEv@i}mvBbnkj_WOUGqE-YhV!45kKQL6yLqg|7R zp^h5W5y_o;@U`zK41`^fQ6dbfV0P~Ro|e|Rw`S-8IEuh<-T1$DQ%}tq7Tj2Tov6bh z)ni8@+A^QKv(C&m@K!W}=;^hXHa{#W2&6UQ zJmLbiKCqkHL4yL>1NmQxz?2-2A9Cpld@5NL?S66paV9}f-gUO6RNDF_a@uCE7fGmy z2qlv1UY&ngcy0fkxBi&n)ro{p%(9@Dm~CA1+nbYb^i&;4aUbt}AAI&?eJk~cuv6GZ z`2q<6Ej!@c73l{!u!pV`H>bRq`Q(daVTHh@x?4y7%C|$GhU#cd@QrUbMLPnlR{+pa ze!F+|du{ilD7dZ0ZkR^Vsjy~zV`jA zd7KoU8vCJlRC7AgSE>3rJK#ScE3Ty^qG6@~IW=FyD^S77>~PbobJD z-Qog&|!oUP3?oj2w*M>`;GOeGtaM5h+*p2)*+YXQfyO- zu7XHVq0I%!7uezdv&|a6fe3QHvzrhBfWr_kipLw$vS1i(Lh z`)GwkntR*JQ;YO$Tay&@iFY;%fkGP+?`ErgqA)aTXrwEN4d3;b7KHLOcE~*u*;Vj!lhb%(>s*QH&E^HCy44Q)a zcj`n}p5Uy#A){bdWnoaT*i z=l{9JWi34ZQ#7stsuwPVFjG$qal^F4I-#T07glIx&K-|~3*)TD6Lm2-ILIAvSAul} zr4Hy%@;@k|5#S;Ipy4AqdH*M-$-h@=Dzmocgqcf>`uE)`CIn4Kmkq%&)D+_|oh`Ml zd#^P{F{RO*1urmg7mK)TlJ&pgmRIEQrf_v-D@;Olb(C7T{Hvw@8bbA4jq9&CQKOQK zCukv>%3+?wag$+MS39o@uibb{112C_3v95!8=aN9y2#v~Ah z<5^NrD9!Zo`$9pM!V*Zd$Jk$f_w;y;x9;g$`h!cQ*xgFJ3(Y05?U zmfl-JmIOnB&i(0NRg0Cf>FES==cI$L(zB-7$On6Gi7Y3+^j)O}ev!`^)QgQ)nyeU1 zEw#2j6Ie(L08~aq!dDgr1dY$1_D#8nw5$u&9HFiXlGoG1#xcNgwf18W#}lM4vi9k! zaaW1ct1+BxOC}q+?ezwMh^;p16Ne~vfeWWT{1w}ncjqM)4dQ=tyP|zb7I;8rT~6k~Q)$HG^deQS zD4sKCD7G*A{;CWJPH~oMnmj@QHf&ER=0XH!5(qeikx%*!CC*{BL~oiS$#L_EclC8~ zB+uHWi6=Jke5-jBDtPHwqOw)A0?7zh^H#Kh@+Gn&PTZ-09d=U*J;8mVrs5a~mb)2% z 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 Date: Fri, 1 Jan 2021 15:38:15 -0500 Subject: [PATCH 11/22] Convert test files to tabs --- test/fixtures/controller.bar/data-key.js | 4 +- test/fixtures/controller.doughnut/data-key.js | 56 +++++++------- test/fixtures/controller.line/data-key.js | 8 +- .../fixtures/controller.polarArea/data-key.js | 74 +++++++++---------- test/fixtures/controller.radar/data-key.js | 52 ++++++------- 5 files changed, 97 insertions(+), 97 deletions(-) diff --git a/test/fixtures/controller.bar/data-key.js b/test/fixtures/controller.bar/data-key.js index 8f971f325de..7852da78079 100644 --- a/test/fixtures/controller.bar/data-key.js +++ b/test/fixtures/controller.bar/data-key.js @@ -5,8 +5,8 @@ module.exports = { labels: [0, 1, 3, 4], datasets: [ { - data2: [5, 20, 10, 11], - dataKey: 'data2', + data2: [5, 20, 10, 11], + dataKey: 'data2', backgroundColor: '#00ff00', borderColor: '#ff0000', borderWidth: 2, diff --git a/test/fixtures/controller.doughnut/data-key.js b/test/fixtures/controller.doughnut/data-key.js index 32e60fb84c8..212693ee0e3 100644 --- a/test/fixtures/controller.doughnut/data-key.js +++ b/test/fixtures/controller.doughnut/data-key.js @@ -1,30 +1,30 @@ module.exports = { - config: { - type: 'doughnut', - data: { - labels: ['A', 'B', 'C', 'D', 'E'], - datasets: [{ - data2: [1, 5, 10, 50, 100], - dataKey: 'data2', - backgroundColor: [ - 'rgba(255, 99, 132, 0.8)', - 'rgba(54, 162, 235, 0.8)', - 'rgba(255, 206, 86, 0.8)', - 'rgba(75, 192, 192, 0.8)', - 'rgba(153, 102, 255, 0.8)' - ], - borderWidth: 20, - borderColor: [ - 'rgb(255, 99, 132)', - 'rgb(54, 162, 235)', - 'rgb(255, 206, 86)', - 'rgb(75, 192, 192)', - 'rgb(153, 102, 255)' - ] - }] - }, - options: { - responsive: false - } - } + config: { + type: 'doughnut', + data: { + labels: ['A', 'B', 'C', 'D', 'E'], + datasets: [{ + data2: [1, 5, 10, 50, 100], + dataKey: 'data2', + backgroundColor: [ + 'rgba(255, 99, 132, 0.8)', + 'rgba(54, 162, 235, 0.8)', + 'rgba(255, 206, 86, 0.8)', + 'rgba(75, 192, 192, 0.8)', + 'rgba(153, 102, 255, 0.8)' + ], + borderWidth: 20, + borderColor: [ + 'rgb(255, 99, 132)', + 'rgb(54, 162, 235)', + 'rgb(255, 206, 86)', + 'rgb(75, 192, 192)', + 'rgb(153, 102, 255)' + ] + }] + }, + options: { + responsive: false + } + } } diff --git a/test/fixtures/controller.line/data-key.js b/test/fixtures/controller.line/data-key.js index 13b65083a84..2f8322b54a7 100644 --- a/test/fixtures/controller.line/data-key.js +++ b/test/fixtures/controller.line/data-key.js @@ -5,11 +5,11 @@ module.exports = { labels: [0, 1, 3, 4], datasets: [ { - data2: [5, 20, 10, 11], - dataKey: 'data2', + data2: [5, 20, 10, 11], + dataKey: 'data2', borderColor: '#ff0000', - borderWidth: 2, - fill: false, + borderWidth: 2, + fill: false, } ] }, diff --git a/test/fixtures/controller.polarArea/data-key.js b/test/fixtures/controller.polarArea/data-key.js index f377fb51a7b..5cbd8faabad 100644 --- a/test/fixtures/controller.polarArea/data-key.js +++ b/test/fixtures/controller.polarArea/data-key.js @@ -1,39 +1,39 @@ module.exports = { - config: { - type: 'polarArea', - data: { - labels: ['A', 'B', 'C', 'D', 'E'], - datasets: [{ - data2: [11, 16, 21, 1, 10], - dataKey: 'data2', - backgroundColor: [ - 'rgba(255, 99, 132, 0.8)', - 'rgba(54, 162, 235, 0.8)', - 'rgba(255, 206, 86, 0.8)', - 'rgba(75, 192, 192, 0.8)', - 'rgba(153, 102, 255, 0.8)' - ], - borderColor: [ - 'rgb(255, 99, 132)', - 'rgb(54, 162, 235)', - 'rgb(255, 206, 86)', - 'rgb(75, 192, 192)', - 'rgb(153, 102, 255)' - ] - }] - }, - options: { - elements: { - arc: { - angle: [ - 2.1658, 10.8404, 21.6922, 108.4323, 216.8588 - ] - } - }, - responsive: false, - scale: { - display: false - } - } - } + config: { + type: 'polarArea', + data: { + labels: ['A', 'B', 'C', 'D', 'E'], + datasets: [{ + data2: [11, 16, 21, 1, 10], + dataKey: 'data2', + backgroundColor: [ + 'rgba(255, 99, 132, 0.8)', + 'rgba(54, 162, 235, 0.8)', + 'rgba(255, 206, 86, 0.8)', + 'rgba(75, 192, 192, 0.8)', + 'rgba(153, 102, 255, 0.8)' + ], + borderColor: [ + 'rgb(255, 99, 132)', + 'rgb(54, 162, 235)', + 'rgb(255, 206, 86)', + 'rgb(75, 192, 192)', + 'rgb(153, 102, 255)' + ] + }] + }, + options: { + elements: { + arc: { + angle: [ + 2.1658, 10.8404, 21.6922, 108.4323, 216.8588 + ] + } + }, + responsive: false, + scale: { + display: false + } + } + } } diff --git a/test/fixtures/controller.radar/data-key.js b/test/fixtures/controller.radar/data-key.js index 623604b3b1e..75e68aa0e60 100644 --- a/test/fixtures/controller.radar/data-key.js +++ b/test/fixtures/controller.radar/data-key.js @@ -1,28 +1,28 @@ module.exports = { - config: { - type: 'radar', - data: { - labels: [0, 1, 2, 3, 4, 5, 6, 7, 8, 9], - datasets: [{ - borderColor: 'red', - data2: [3, 3, 3, 3, 3, 3, 3, 3, 3, 3], - dataKey: 'data2', - fill: false, - }] - }, - options: { - responsive: false, - scale: { - display: false, - min: 0, - max: 3 - }, - } - }, - options: { - canvas: { - height: 512, - width: 512 - } - } + config: { + type: 'radar', + data: { + labels: [0, 1, 2, 3, 4, 5, 6, 7, 8, 9], + datasets: [{ + borderColor: 'red', + data2: [3, 3, 3, 3, 3, 3, 3, 3, 3, 3], + dataKey: 'data2', + fill: false, + }] + }, + options: { + responsive: false, + scale: { + display: false, + min: 0, + max: 3 + }, + } + }, + options: { + canvas: { + height: 512, + width: 512 + } + } } From 75ccc6c168452694e60cfaf303dec99fc55fc654 Mon Sep 17 00:00:00 2001 From: Evert Timberg Date: Sat, 2 Jan 2021 12:07:18 -0500 Subject: [PATCH 12/22] Standardize on tabs in ts files --- types/index.esm.d.ts | 18 +++++++++--------- 1 file changed, 9 insertions(+), 9 deletions(-) diff --git a/types/index.esm.d.ts b/types/index.esm.d.ts index 81732f8842b..bf9462055c7 100644 --- a/types/index.esm.d.ts +++ b/types/index.esm.d.ts @@ -533,8 +533,8 @@ export class DatasetController; getScaleForId(scaleID: string): Scale | undefined; configure(): void; @@ -780,7 +780,7 @@ export interface Plugin extends ExtendedPlugin { * @param {object} options - The plugin options. * @returns {boolean} `false` to cancel the chart update. */ - beforeUpdate?(chart: Chart, args: { mode: UpdateMode }, options: O): boolean | void; + beforeUpdate?(chart: Chart, args: { mode: UpdateMode }, options: O): boolean | void; /** * @desc Called after `chart` has been updated and before rendering. Note that this * hook will not be called if the chart update has been previously cancelled. @@ -789,15 +789,15 @@ export interface Plugin extends ExtendedPlugin { * @param {UpdateMode} args.mode - The update mode * @param {object} options - The plugin options. */ - afterUpdate?(chart: Chart, args: { mode: UpdateMode }, options: O): void; - /** - * @desc Called during the update process, before any chart elements have been created. - * This can be used for data decimation by changing the data array inside a dataset. + afterUpdate?(chart: Chart, args: { mode: UpdateMode }, options: O): void; + /** + * @desc Called during the update process, before any chart elements have been created. + * This can be used for data decimation by changing the data array inside a dataset. * @param {Chart} chart - The chart instance. * @param {object} args - The call arguments. * @param {object} options - The plugin options. - */ - beforeElementsUpdate?(chart: Chart, args: {}, options: O): void; + */ + beforeElementsUpdate?(chart: Chart, args: {}, options: O): void; /** * @desc Called during chart reset * @param {Chart} chart - The chart instance. From cba735eb769a3d951009b64fdd67c40cbe156ad0 Mon Sep 17 00:00:00 2001 From: Evert Timberg Date: Sat, 16 Jan 2021 17:07:43 -0500 Subject: [PATCH 13/22] Remove the dataKey feature --- docs/docs/general/data-structures.md | 1 - src/controllers/controller.doughnut.js | 3 +- src/controllers/controller.polarArea.js | 9 ++-- src/controllers/controller.radar.js | 3 +- src/core/core.datasetController.js | 16 ++----- test/fixtures/controller.bar/data-key.js | 29 ------------- test/fixtures/controller.bar/data-key.png | Bin 6200 -> 0 bytes test/fixtures/controller.doughnut/data-key.js | 30 -------------- .../fixtures/controller.doughnut/data-key.png | Bin 41963 -> 0 bytes test/fixtures/controller.line/data-key.js | 29 ------------- test/fixtures/controller.line/data-key.png | Bin 8745 -> 0 bytes .../fixtures/controller.polarArea/data-key.js | 39 ------------------ .../controller.polarArea/data-key.png | Bin 21480 -> 0 bytes test/fixtures/controller.radar/data-key.js | 28 ------------- test/fixtures/controller.radar/data-key.png | Bin 18551 -> 0 bytes types/index.esm.d.ts | 1 - 16 files changed, 9 insertions(+), 179 deletions(-) delete mode 100644 test/fixtures/controller.bar/data-key.js delete mode 100644 test/fixtures/controller.bar/data-key.png delete mode 100644 test/fixtures/controller.doughnut/data-key.js delete mode 100644 test/fixtures/controller.doughnut/data-key.png delete mode 100644 test/fixtures/controller.line/data-key.js delete mode 100644 test/fixtures/controller.line/data-key.png delete mode 100644 test/fixtures/controller.polarArea/data-key.js delete mode 100644 test/fixtures/controller.polarArea/data-key.png delete mode 100644 test/fixtures/controller.radar/data-key.js delete mode 100644 test/fixtures/controller.radar/data-key.png diff --git a/docs/docs/general/data-structures.md b/docs/docs/general/data-structures.md index 705381e4992..113e7266089 100644 --- a/docs/docs/general/data-structures.md +++ b/docs/docs/general/data-structures.md @@ -64,7 +64,6 @@ In this mode, property name is used for `index` scale and value for `value` scal | Name | Type | Description | ---- | ---- | ----------- -| `dataKey` | `string` | If specified, tells the chart to look for the dataset data in `dataset[dataset.dataKey]`. If unspecified, this defaults to `'data'`. | `label` | `string` | The label for the dataset which appears in the legend and tooltips. | `clip` | `number`\|`object` | How to clip relative to chartArea. Positive value allows overflow, negative value clips that many pixels inside chartArea. 0 = clip at chartArea. Clipping can also be configured per side: clip: {left: 5, top: false, right: -2, bottom: 0} | `order` | `number` | The drawing order of dataset. Also affects order for stacking, tooltip and legend. diff --git a/src/controllers/controller.doughnut.js b/src/controllers/controller.doughnut.js index ceb403a9aa3..2374fcd0e45 100644 --- a/src/controllers/controller.doughnut.js +++ b/src/controllers/controller.doughnut.js @@ -56,8 +56,7 @@ export default class DoughnutController extends DatasetController { * Override data parsing, since we are not using scales */ parse(start, count) { - const dataKey = this.getDataKey(); - const data = this.getDataset()[dataKey]; + const data = this.getDataset().data; const meta = this._cachedMeta; let i, ilen; for (i = start, ilen = start + count; i < ilen; ++i) { diff --git a/src/controllers/controller.polarArea.js b/src/controllers/controller.polarArea.js index 87b4414576a..432268a240e 100644 --- a/src/controllers/controller.polarArea.js +++ b/src/controllers/controller.polarArea.js @@ -52,7 +52,6 @@ export default class PolarAreaController extends DatasetController { const centerX = scale.xCenter; const centerY = scale.yCenter; const datasetStartAngle = getStartAngleRadians(opts.startAngle); - const dataKey = me.getDataKey(); let angle = datasetStartAngle; let i; @@ -65,7 +64,7 @@ export default class PolarAreaController extends DatasetController { const arc = arcs[i]; let startAngle = angle; let endAngle = angle + me._computeAngle(i, mode); - let outerRadius = this.chart.getDataVisibility(i) ? scale.getDistanceFromCenterForValue(dataset[dataKey][i]) : 0; + let outerRadius = this.chart.getDataVisibility(i) ? scale.getDistanceFromCenterForValue(dataset.data[i]) : 0; angle = endAngle; if (reset) { @@ -95,11 +94,10 @@ export default class PolarAreaController extends DatasetController { countVisibleElements() { const dataset = this.getDataset(); const meta = this._cachedMeta; - const dataKey = this.getDataKey(); let count = 0; meta.data.forEach((element, index) => { - if (!isNaN(dataset[dataKey][index]) && this.chart.getDataVisibility(index)) { + if (!isNaN(dataset.data[index]) && this.chart.getDataVisibility(index)) { count++; } }); @@ -115,9 +113,8 @@ export default class PolarAreaController extends DatasetController { const meta = me._cachedMeta; const count = meta.count; const dataset = me.getDataset(); - const dataKey = me.getDataKey(); - if (isNaN(dataset[dataKey][index]) || !this.chart.getDataVisibility(index)) { + if (isNaN(dataset.data[index]) || !this.chart.getDataVisibility(index)) { return 0; } diff --git a/src/controllers/controller.radar.js b/src/controllers/controller.radar.js index 26439703918..74f03fb9286 100644 --- a/src/controllers/controller.radar.js +++ b/src/controllers/controller.radar.js @@ -44,14 +44,13 @@ export default class RadarController extends DatasetController { updateElements(points, start, count, mode) { const me = this; const dataset = me.getDataset(); - const dataKey = me.getDataKey(); const scale = me._cachedMeta.rScale; const reset = mode === 'reset'; for (let i = start; i < start + count; i++) { const point = points[i]; const options = me.resolveDataElementOptions(i, mode); - const pointPosition = scale.getPointPositionForValue(i, dataset[dataKey][i]); + const pointPosition = scale.getPointPositionForValue(i, dataset.data[i]); const x = reset ? scale.xCenter : pointPosition.x; const y = reset ? scale.yCenter : pointPosition.y; diff --git a/src/core/core.datasetController.js b/src/core/core.datasetController.js index 31cbc007073..6cc65deaa3f 100644 --- a/src/core/core.datasetController.js +++ b/src/core/core.datasetController.js @@ -1,6 +1,6 @@ import Animations from './core.animations'; import defaults from './core.defaults'; -import {isObject, merge, _merger, isArray, valueOrDefault, mergeIf, resolveObjectKey, _capitalize, isNullOrUndef} from '../helpers/helpers.core'; +import {isObject, merge, _merger, isArray, valueOrDefault, mergeIf, resolveObjectKey, _capitalize} from '../helpers/helpers.core'; import {listenArrayEvents, unlistenArrayEvents} from '../helpers/helpers.collection'; import {resolve} from '../helpers/helpers.options'; import {getHoverColor} from '../helpers/helpers.color'; @@ -278,11 +278,6 @@ export default class DatasetController { return this.chart.data.datasets[this.index]; } - getDataKey() { - const {dataKey} = this.getDataset(); - return isNullOrUndef(dataKey) ? 'data' : dataKey; - } - getMeta() { return this.chart.getDatasetMeta(this.index); } @@ -328,8 +323,7 @@ export default class DatasetController { _dataCheck() { const me = this; const dataset = me.getDataset(); - const dataKey = me.getDataKey(); - const data = dataset[dataKey] || (dataset[dataKey] = []); + const data = dataset.data || (dataset.data = []); // In order to correctly handle data addition/deletion animation (an thus simulate // real-time charts), we need to monitor these data modifications and synchronize @@ -395,7 +389,6 @@ export default class DatasetController { */ configure() { const me = this; - const dataKey = me.getDataKey(); me._config = merge(Object.create(null), [ defaults.controllers[me._type].datasets, (me.chart.options.datasets || {})[me._type], @@ -405,7 +398,7 @@ export default class DatasetController { // Cloning the data is expensive and unnecessary. // Additionally, plugins may add dataset level fields that should // not be cloned. We identify those via an underscore prefix - if (key !== 'data' && key !== dataKey && key.charAt(0) !== '_') { + if (key !== 'data' && key.charAt(0) !== '_') { _merger(key, target, source); } } @@ -1033,8 +1026,7 @@ export default class DatasetController { */ _onDataPush() { const count = arguments.length; - const dataKey = this.getDataKey(); - this._insertElements(this.getDataset()[dataKey].length - count, count); + this._insertElements(this.getDataset().data.length - count, count); } /** diff --git a/test/fixtures/controller.bar/data-key.js b/test/fixtures/controller.bar/data-key.js deleted file mode 100644 index 7852da78079..00000000000 --- a/test/fixtures/controller.bar/data-key.js +++ /dev/null @@ -1,29 +0,0 @@ -module.exports = { - config: { - type: 'bar', - data: { - labels: [0, 1, 3, 4], - datasets: [ - { - data2: [5, 20, 10, 11], - dataKey: 'data2', - backgroundColor: '#00ff00', - borderColor: '#ff0000', - borderWidth: 2, - } - ] - }, - options: { - scales: { - x: {display: false}, - y: {display: false} - } - } - }, - options: { - canvas: { - height: 256, - width: 512 - } - } -}; diff --git a/test/fixtures/controller.bar/data-key.png b/test/fixtures/controller.bar/data-key.png deleted file mode 100644 index 7a83ce1544039ad531f76ad68a16400a9f61626b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 6200 zcmeHKTT~NS7QIy|AfSc-DlG&O)Zo}4Fp3fcnkXQ~AlT>#h$y{Kc_|`@#0RFp2imsC z(&1r?APO>$52B(xl{mD75kXpPbQDbxXhhzM5FsRU3g)A`=hu%}YsgP!)w*@gJ^Spv z@43gLH>Zhz;1abSu*aMLT;&YfXulsRt+Sx+46g}T0w1ox~jpkR#&kmStd6?v?PQV6Ljfvl9=*Xk{SWR?#l2jWfg57Ep7aKxha0TrD zF;aRUb=OX|=A(~hL^-@$eYrwBDwDaY>cp<<5%~U>0$Hn1abz(qTG;S;4@z3ZM@bS7 z7Y~IortBP*iB~`<^VoyUd zFsYsmGu;Zw%m2L(4rZE>8R|tuUIkM**e;f?9XN&BA~?vg=`;i8CYrx-^4(s+t@V*pU`lj>fxG>_(W37Srt34Ha%oM{WMXr5rwD z1P8HRDv>B4MQyvvg?Hzs7>{0~XwM}Sh8G$`=_2$vI${4W)j9y&Zq4bZFI=%>Lwy?U z%&G;Q0f1nDZ@g^rH;66`Dwr4QFyw>0O)8w47*aFWP<@yj-Gb#C?+#!zH^oks@1yE?~WTM8VcIGQ2wjSg?-b zg0$An6kv-Ec>kc2P@r_TSOQYTwbEerEfWjEyK|8H=x_##E#bNdN#rbi-&;cARnj%s z)=gy;9Ez8{#7bH_x-Ec~^zL)DP$8XvdA}2KtiLWGF5EfWUU>p;2oR80eA#|zrw+$q z0l|@Nc#2_oH0pZWP_09nktdex`|N;htaQ;X9#%qjJadG2DLq|Q4ioVTQA}3g89G05 zQLWe*tC>oXJ!*A$x17O`+Cb;0+{vRs%TUw9+>`pq2^k+T&wdFF|+|4vIgYo%Nc^7~bFO?}Xx2SuXD6_}Kri z35G%CveL!JQPGmys(1tPF$A32(e&49bq{L0eB=+DmC&NUeb;h@%2s7)%b16Z`?HpM zlIZcxgoO5qczrYYDY21;SlEtjpZjK`vlw;Xx(*uzHm;t6)!acoCYCp{Q8>myWtkyx7dqPGxzYl$bMs5(D}gp;AGDw~SfAqAcxw*fw)#5& zXX(}}It4}`OGX{AbygGLjHh<0xj=KA*(2YKKW<4Mw8rp$>nr80CTv6~ZZw{`O=X-n z?TuNajv^)Jb~0dXA=zp3ibCvcFI3JewlpA{wxw%q@YGolu%-FOr!Oka$mSv@$%+){ zK-aKqC)`Zg2zsLD;yf;5|F;iY2nC+Kwgcih-YqO_o``o3{~|hsFp@F)d_pm&$bQ&V z7ii;mAMC_NVU`7U0DYWan+xX6 zjf>w%iK;nnU(6m#`FRh@LwZp2K$Ma={YF#t>HUvfwa?eb0h;vY}6D|B2`K zMRa%_ZrXR*7Dv#5!|A^soI}y(kukJJtK!hw@zyZ(Dx8Zbzstxs&+-Q6b+iYzZt@>Ijq=ACoFzJop|fisfv(GlaVS(ccQyafDC zaqHQk#z-wiI~FZrByTcQ4vG$xRs2+*?Ty~d=*YR}|9iLXQwd3e<3QL72u^J|_d3O? zn8u&S4=1@5vVCRbs!}R#l0!E8woa4MI1b4pPi{teMF50tmiZ$yK-28Q)u!<18_OWZ zI{Y0h7Xv|J&QRxu)ftnWKr@H0fAbAxJ${yp-+*mLtsBezVkbCs3-`3fjK_1tt|VbIxUA{qyke*3dHB`(Al7|n5*53XLe@XCNT?Dx_|4Xdj< zk7|09FSv8uR@f|w+E#dI9GgxGC|hd==vZBk@~ExWocvxLd(HHW37AExfI2YK1ScK9 r4NPZD7BJa?NeWGh`2WX+`W7IKj**v4zl$@Hhu|mh@OHnkJUHp!PnyD) diff --git a/test/fixtures/controller.doughnut/data-key.js b/test/fixtures/controller.doughnut/data-key.js deleted file mode 100644 index 212693ee0e3..00000000000 --- a/test/fixtures/controller.doughnut/data-key.js +++ /dev/null @@ -1,30 +0,0 @@ -module.exports = { - config: { - type: 'doughnut', - data: { - labels: ['A', 'B', 'C', 'D', 'E'], - datasets: [{ - data2: [1, 5, 10, 50, 100], - dataKey: 'data2', - backgroundColor: [ - 'rgba(255, 99, 132, 0.8)', - 'rgba(54, 162, 235, 0.8)', - 'rgba(255, 206, 86, 0.8)', - 'rgba(75, 192, 192, 0.8)', - 'rgba(153, 102, 255, 0.8)' - ], - borderWidth: 20, - borderColor: [ - 'rgb(255, 99, 132)', - 'rgb(54, 162, 235)', - 'rgb(255, 206, 86)', - 'rgb(75, 192, 192)', - 'rgb(153, 102, 255)' - ] - }] - }, - options: { - responsive: false - } - } -} diff --git a/test/fixtures/controller.doughnut/data-key.png b/test/fixtures/controller.doughnut/data-key.png deleted file mode 100644 index 02eae1725c84a37add7393e8d48c2965120cafb0..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 41963 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 z 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 getScaleForId(scaleID: string): Scale | undefined; configure(): void; From a198a7386aae3477a8159549169eefb3f43a5142 Mon Sep 17 00:00:00 2001 From: Evert Timberg Date: Sat, 16 Jan 2021 17:08:54 -0500 Subject: [PATCH 14/22] Replace dataKey usage in decimation plugin We define a new descriptor for the `data` key allowing the plugin to be simpler. --- src/plugins/plugin.decimation.js | 28 ++++++++++++++++++++-------- 1 file changed, 20 insertions(+), 8 deletions(-) diff --git a/src/plugins/plugin.decimation.js b/src/plugins/plugin.decimation.js index 4c598959ddf..24b223c48b2 100644 --- a/src/plugins/plugin.decimation.js +++ b/src/plugins/plugin.decimation.js @@ -63,14 +63,27 @@ export default { const availableWidth = chart.width - (verticalAxisCount * 50); chart.data.datasets.forEach((dataset, datasetIndex) => { - const {_originalDataKey} = dataset; + const {_data} = dataset; const meta = chart.getDatasetMeta(datasetIndex); - const dataKey = !isNullOrUndef(_originalDataKey) ? _originalDataKey : meta.controller.getDataKey(); - const data = dataset[dataKey]; - - if (isNullOrUndef(_originalDataKey)) { - // Store this for the next update - dataset._originalDataKey = dataKey; + const data = _data || dataset.data; + + if (isNullOrUndef(_data)) { + // First time we are seeing this dataset + // We override the 'data' property with a setter that stores the + // raw data in _data, but reads the decimated data from _decimated + // TODO: Undo this on chart destruction + dataset._data = data; + delete dataset.data; + Object.defineProperty(dataset, 'data', { + configurable: true, + enumerable: true, + get: function() { + return this._decimated; + }, + set: function(d) { + this._data = d; + } + }); } if (meta.type !== 'line') { @@ -105,7 +118,6 @@ export default { } dataset._decimated = decimated; - dataset.dataKey = '_decimated'; }); } }; From 389f445910f366e79fa6bddcb892624d9c376e3b Mon Sep 17 00:00:00 2001 From: Evert Timberg Date: Sat, 16 Jan 2021 17:21:51 -0500 Subject: [PATCH 15/22] Disable decimation when indexAxis is Y --- src/plugins/plugin.decimation.js | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/plugins/plugin.decimation.js b/src/plugins/plugin.decimation.js index 24b223c48b2..c0ae2d1a714 100644 --- a/src/plugins/plugin.decimation.js +++ b/src/plugins/plugin.decimation.js @@ -51,7 +51,8 @@ export default { }, beforeElementsUpdate: (chart, args, options) => { - if (!options.enabled) { + // Decimation is only supported for lines that have an X indexAxis + if (!options.enabled || chart.options.indexAxis === 'y') { return; } From 757717dcbe79d8cbac1b06cf7c823aba4a991ab0 Mon Sep 17 00:00:00 2001 From: Evert Timberg Date: Sat, 23 Jan 2021 12:59:40 -0500 Subject: [PATCH 16/22] Simplify the decimation width approximation --- src/plugins/plugin.decimation.js | 15 ++++++++------- 1 file changed, 8 insertions(+), 7 deletions(-) diff --git a/src/plugins/plugin.decimation.js b/src/plugins/plugin.decimation.js index c0ae2d1a714..3be616dea9c 100644 --- a/src/plugins/plugin.decimation.js +++ b/src/plugins/plugin.decimation.js @@ -56,18 +56,19 @@ export default { return; } - // Use an approximation since this is before scales are parsed - const verticalAxisCount = Object.values(chart.scales).reduce((acc, scale) => acc + scale.axis === 'y' ? 1 : 0, 0); - - // assume ~50px for now. If the axis is actually wider then we have more points than needed - // TODO: Take display settings into account and compute a more accurate guess for each axis - const availableWidth = chart.width - (verticalAxisCount * 50); + // Assume the entire chart is available to show a few more points than needed + const availableWidth = chart.width; chart.data.datasets.forEach((dataset, datasetIndex) => { - const {_data} = dataset; + const {_data, indexAxis} = dataset; const meta = chart.getDatasetMeta(datasetIndex); const data = _data || dataset.data; + if (indexAxis === 'y') { + // Skip this dataset as it is not horizontal + return; + } + if (isNullOrUndef(_data)) { // First time we are seeing this dataset // We override the 'data' property with a setter that stores the From 4dc262a403078cd14792b5226b6e77b684b36f70 Mon Sep 17 00:00:00 2001 From: Evert Timberg Date: Sat, 23 Jan 2021 13:26:26 -0500 Subject: [PATCH 17/22] Resolve the indexAxis correctly in all cases --- src/plugins/plugin.decimation.js | 19 +++++++++---------- 1 file changed, 9 insertions(+), 10 deletions(-) diff --git a/src/plugins/plugin.decimation.js b/src/plugins/plugin.decimation.js index 3be616dea9c..f999c8bfae8 100644 --- a/src/plugins/plugin.decimation.js +++ b/src/plugins/plugin.decimation.js @@ -1,4 +1,4 @@ -import {isNullOrUndef} from '../helpers'; +import {isNullOrUndef, resolve} from '../helpers'; function minMaxDecimation(data, availableWidth) { let i, point, x, y, prevX, minIndex, maxIndex, minY, maxY; @@ -51,8 +51,7 @@ export default { }, beforeElementsUpdate: (chart, args, options) => { - // Decimation is only supported for lines that have an X indexAxis - if (!options.enabled || chart.options.indexAxis === 'y') { + if (!options.enabled) { return; } @@ -64,8 +63,13 @@ export default { const meta = chart.getDatasetMeta(datasetIndex); const data = _data || dataset.data; - if (indexAxis === 'y') { - // Skip this dataset as it is not horizontal + if (resolve([indexAxis, chart.options.indexAxis]) !== 'x') { + // Decimation is only supported for lines that have an X indexAxis + return; + } + + if (meta.type !== 'line') { + // Only line datasets are supported return; } @@ -88,11 +92,6 @@ export default { }); } - if (meta.type !== 'line') { - // Only line datasets are supported - return; - } - const xAxis = chart.scales[meta.xAxisID]; if (xAxis.type !== 'linear' && xAxis.type !== 'time') { // Only linear interpolation is supported From 96dc16faba660fb68393df99d8d004d75aa3ad23 Mon Sep 17 00:00:00 2001 From: Evert Timberg Date: Sat, 23 Jan 2021 13:37:43 -0500 Subject: [PATCH 18/22] Initial documentation --- docs/docs/configuration/decimation.md | 33 +++++++++++++++++++++++++++ docs/docs/general/performance.md | 2 +- docs/sidebars.js | 3 ++- 3 files changed, 36 insertions(+), 2 deletions(-) create mode 100644 docs/docs/configuration/decimation.md diff --git a/docs/docs/configuration/decimation.md b/docs/docs/configuration/decimation.md new file mode 100644 index 00000000000..3aa26866d27 --- /dev/null +++ b/docs/docs/configuration/decimation.md @@ -0,0 +1,33 @@ +--- +title: Data Decimation +--- + +The decimation plugin can be used with line charts to automatically decimate data at the start of the chart lifecycle. Before enabling this plugin, review the [requirements](#requirements) to ensure that it will work with the chart you want to create. + +## Configuration Options + +The decimation plugin configuration is passed into the `options.plugins.decimation` namespace. The global options for the plugin are defined in `Chart.defaults.plugins.decimation`. + +| Name | Type | Default | Description +| ---- | ---- | ------- | ----------- +| `enabled` | `boolean` | `true` | Is decimation enabled? +| `algorithm` | `string` | `'min-max'` | Decimation algorithm to use. See the [more...](#decimation-algorithms) + +## Decimation Algorithms + +Decimation algorithm to use for data. Options are: + +* `'min-max'` + +### Min/Max Decimation + +[Min/max](https://digital.ni.com/public.nsf/allkb/F694FFEEA0ACF282862576020075F784) decimation will preserve peaks in your data but could require up to 4 points for each pixel. This type of decimation would work well for a very noisy signal where you need to see data peaks. + +## Requirements + +To use the decimation plugin, the following requirements must be met: + +1. The dataset must have an `indexAxis` of `'x'` +2. The dataset must be a line +3. The X axis for the dataset must be either a `'linear'` or `'time'` type axis +4. The dataset object must be mutable. The plugin stores the original data as `dataset._data` and then defines a new `data` property on the dataset. diff --git a/docs/docs/general/performance.md b/docs/docs/general/performance.md index 51cde5c05c2..6bd85a02637 100644 --- a/docs/docs/general/performance.md +++ b/docs/docs/general/performance.md @@ -18,7 +18,7 @@ Chart.js is fastest if you provide data with indices that are unique, sorted, an Decimating your data will achieve the best results. When there is a lot of data to display on the graph, it doesn't make sense to show tens of thousands of data points on a graph that is only a few hundred pixels wide. -There are many approaches to data decimation and selection of an algorithm will depend on your data and the results you want to achieve. For instance, [min/max](https://digital.ni.com/public.nsf/allkb/F694FFEEA0ACF282862576020075F784) decimation will preserve peaks in your data but could require up to 4 points for each pixel. This type of decimation would work well for a very noisy signal where you need to see data peaks. +The [decimation plugin](./configuration/decimation.md) can be used with line charts to decimate data before the chart is rendered. This will provide the best performance since it will reduce the memory needed to render the chart. Line charts are able to do [automatic data decimation during draw](#automatic-data-decimation-during-draw), when certain conditions are met. You should still consider decimating data yourself before passing it in for maximum performance since the automatic decimation occurs late in the chart life cycle. diff --git a/docs/sidebars.js b/docs/sidebars.js index b56c313673d..53aff196475 100644 --- a/docs/sidebars.js +++ b/docs/sidebars.js @@ -30,7 +30,8 @@ module.exports = { 'configuration/legend', 'configuration/title', 'configuration/tooltip', - 'configuration/elements' + 'configuration/elements', + 'configuration/decimation' ], 'Chart Types': [ 'charts/line', From dab73c5c71e5729a803fdb82fe0ff1f707655e29 Mon Sep 17 00:00:00 2001 From: Evert Timberg Date: Sat, 23 Jan 2021 13:51:53 -0500 Subject: [PATCH 19/22] Reverse check --- src/plugins/plugin.decimation.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/plugins/plugin.decimation.js b/src/plugins/plugin.decimation.js index f999c8bfae8..73a0744769c 100644 --- a/src/plugins/plugin.decimation.js +++ b/src/plugins/plugin.decimation.js @@ -63,7 +63,7 @@ export default { const meta = chart.getDatasetMeta(datasetIndex); const data = _data || dataset.data; - if (resolve([indexAxis, chart.options.indexAxis]) !== 'x') { + if (resolve([indexAxis, chart.options.indexAxis]) === 'y') { // Decimation is only supported for lines that have an X indexAxis return; } From 61da6d7e3debe5b9564f7171187fc08a7de56690 Mon Sep 17 00:00:00 2001 From: Evert Timberg Date: Sat, 23 Jan 2021 14:59:52 -0500 Subject: [PATCH 20/22] Update TS definitions for new plugin options --- types/index.esm.d.ts | 11 ++++++++++- 1 file changed, 10 insertions(+), 1 deletion(-) diff --git a/types/index.esm.d.ts b/types/index.esm.d.ts index 5f908dec869..5b414f99ab2 100644 --- a/types/index.esm.d.ts +++ b/types/index.esm.d.ts @@ -1910,8 +1910,16 @@ export class BasePlatform { export class BasicPlatform extends BasePlatform {} export class DomPlatform extends BasePlatform {} -export const Filler: Plugin; +export declare enum DecimationAlgorithm { + minmax = 'min-max', +} + +export interface DecimationOptions { + enabled: boolean; + algorithm: DecimationAlgorithm; +} +export const Filler: Plugin; export interface FillerOptions { propagate: boolean; } @@ -2485,6 +2493,7 @@ export interface TooltipItem { } export interface PluginOptionsByType { + decimation: DecimationOptions; filler: FillerOptions; legend: LegendOptions; title: TitleOptions; From 0cfd8dd24ae3c305bbf8429c105cd6716d9254c3 Mon Sep 17 00:00:00 2001 From: Evert Timberg Date: Sun, 31 Jan 2021 15:22:27 -0500 Subject: [PATCH 21/22] Move defineProperty after bailouts --- src/plugins/plugin.decimation.js | 32 ++++++++++++++++---------------- 1 file changed, 16 insertions(+), 16 deletions(-) diff --git a/src/plugins/plugin.decimation.js b/src/plugins/plugin.decimation.js index 73a0744769c..5ad34c1e3e9 100644 --- a/src/plugins/plugin.decimation.js +++ b/src/plugins/plugin.decimation.js @@ -73,6 +73,22 @@ export default { return; } + const xAxis = chart.scales[meta.xAxisID]; + if (xAxis.type !== 'linear' && xAxis.type !== 'time') { + // Only linear interpolation is supported + return; + } + + if (chart.options.parsing) { + // Plugin only supports data that does not need parsing + return; + } + + if (data.length <= 4 * availableWidth) { + // No decimation is required until we are above this threshold + return; + } + if (isNullOrUndef(_data)) { // First time we are seeing this dataset // We override the 'data' property with a setter that stores the @@ -92,22 +108,6 @@ export default { }); } - const xAxis = chart.scales[meta.xAxisID]; - if (xAxis.type !== 'linear' && xAxis.type !== 'time') { - // Only linear interpolation is supported - return; - } - - if (chart.options.parsing) { - // Plugin only supports data that does not need parsing - return; - } - - if (data.length <= 4 * availableWidth) { - // No decimation is required until we are above this threshold - return; - } - // Point the chart to the decimated data let decimated; switch (options.algorithm) { From 8aba00761c196c31a82a95efb5e0f63181dc94ab Mon Sep 17 00:00:00 2001 From: Evert Timberg Date: Sun, 31 Jan 2021 15:27:49 -0500 Subject: [PATCH 22/22] Add destroy hook --- src/plugins/plugin.decimation.js | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/src/plugins/plugin.decimation.js b/src/plugins/plugin.decimation.js index 5ad34c1e3e9..4093e365679 100644 --- a/src/plugins/plugin.decimation.js +++ b/src/plugins/plugin.decimation.js @@ -120,5 +120,16 @@ export default { dataset._decimated = decimated; }); + }, + + destroy(chart) { + chart.data.datasets.forEach((dataset) => { + if (dataset._decimated) { + const data = dataset._data; + delete dataset._decimated; + delete dataset._data; + Object.defineProperty(dataset, 'data', {value: data}); + } + }); } };