From d103a0f4aefa23546e4be4fc63ce905ae48efdfc Mon Sep 17 00:00:00 2001 From: Daniel Cohen Gindi Date: Wed, 22 Apr 2026 15:01:53 +0300 Subject: [PATCH] added datasetSpacing feature --- docs/charts/doughnut.md | 3 +- src/controllers/controller.doughnut.js | 12 +- src/types/index.d.ts | 8 +- .../doughnut-dataset-spacing.json | 70 +++++++++++ .../doughnut-dataset-spacing.png | Bin 0 -> 56474 bytes test/specs/controller.doughnut.tests.js | 113 ++++++++++++++++++ test/types/options.ts | 1 + 7 files changed, 203 insertions(+), 4 deletions(-) create mode 100644 test/fixtures/controller.doughnut/doughnut-dataset-spacing.json create mode 100644 test/fixtures/controller.doughnut/doughnut-dataset-spacing.png diff --git a/docs/charts/doughnut.md b/docs/charts/doughnut.md index 36d7680d561..f04575ee9a2 100644 --- a/docs/charts/doughnut.md +++ b/docs/charts/doughnut.md @@ -149,7 +149,8 @@ The style of each arc can be controlled with the following properties: | `borderJoinStyle` | arc border join style. See [MDN](https://developer.mozilla.org/en-US/docs/Web/API/CanvasRenderingContext2D/lineJoin). | `borderWidth` | arc border width (in pixels). | `offset` | arc offset (in pixels). -| `spacing` | Fixed arc offset (in pixels). Similar to `offset` but applies to all arcs. +| `spacing` | Fixed arc (slice) offset (in pixels). Similar to `offset` but applies to all slices. +| `datasetSpacing` | Fixed spacing between datasets (in pixels). This property only applies to multi-dataset doughnut/pie charts. It adjusts the spacing between concentric rings of data, allowing better visual separation between datasets. | `weight` | The relative thickness of the dataset. Providing a value for weight will cause the pie or doughnut dataset to be drawn with a thickness relative to the sum of all the dataset weight values. All these values, if `undefined`, fallback to the associated [`elements.arc.*`](../configuration/elements.md#arc-configuration) options. diff --git a/src/controllers/controller.doughnut.js b/src/controllers/controller.doughnut.js index a159b42c86b..a893ebde637 100644 --- a/src/controllers/controller.doughnut.js +++ b/src/controllers/controller.doughnut.js @@ -234,8 +234,16 @@ export default class DoughnutController extends DatasetController { meta.total = this.calculateTotal(); - this.outerRadius = outerRadius - radiusLength * this._getRingWeightOffset(this.index); - this.innerRadius = Math.max(this.outerRadius - radiusLength * chartWeight, 0); + // For index 0, 0 spacing + // For index 1, 1 spacing + // For index 2, 2 spacings (account for the spacing for previous datasets) + // These are triangular numbers, so N*(N+1)/2 are the count of spacings we need to add. + const datasetSpacing = this.index > 0 && this.options.datasetSpacing + ? (this.options.datasetSpacing || 0) * (this.index * (this.index + 1) / 2) + : 0; + + this.outerRadius = outerRadius - radiusLength * this._getRingWeightOffset(this.index) - datasetSpacing; + this.innerRadius = Math.max(this.outerRadius - radiusLength * chartWeight - datasetSpacing, 0); this.updateElements(arcs, 0, arcs.length, mode); } diff --git a/src/types/index.d.ts b/src/types/index.d.ts index 32831adc88c..d2e2191ea09 100644 --- a/src/types/index.d.ts +++ b/src/types/index.d.ts @@ -336,11 +336,17 @@ export interface DoughnutControllerChartOptions { rotation: number; /** - * Spacing between the arcs + * Spacing between the arcs (slices) * @default 0 */ spacing: number; + /** + * Spacing between the dataSets + * @default 0 + */ + datasetSpacing: number; + /** * Geometry used to apply arc spacing. * - `proportional`: legacy behavior (default for polarArea). diff --git a/test/fixtures/controller.doughnut/doughnut-dataset-spacing.json b/test/fixtures/controller.doughnut/doughnut-dataset-spacing.json new file mode 100644 index 00000000000..908001991bb --- /dev/null +++ b/test/fixtures/controller.doughnut/doughnut-dataset-spacing.json @@ -0,0 +1,70 @@ +{ + "config": { + "type": "doughnut", + "data": { + "datasets": [ + { + "label": "Dataset 1", + "data": [ + 10, + 20, + 40 + ], + "backgroundColor": [ + "rgba(255, 99, 132, 0.8)", + "rgba(54, 162, 235, 0.8)", + "rgba(255, 206, 86, 0.8)" + ], + "borderWidth": 0, + "weight": 1 + }, + { + "label": "Dataset 2", + "data": [ + 15, + 25, + 35 + ], + "backgroundColor": [ + "rgba(75, 192, 192, 0.8)", + "rgba(153, 102, 255, 0.8)", + "rgba(255, 159, 64, 0.8)" + ], + "borderWidth": 0, + "weight": 1 + }, + { + "label": "Dataset 3", + "data": [ + 20, + 30, + 30 + ], + "backgroundColor": [ + "rgba(255, 99, 132, 0.5)", + "rgba(54, 162, 235, 0.5)", + "rgba(255, 206, 86, 0.5)" + ], + "borderWidth": 0, + "weight": 1 + } + ], + "labels": [ + "Category A", + "Category B", + "Category C" + ] + }, + "options": { + "datasetSpacing": 8, + "responsive": false, + "maintainAspectRatio": true, + "plugins": { + "legend": { + "display": true, + "position": "top" + } + } + } +} +} diff --git a/test/fixtures/controller.doughnut/doughnut-dataset-spacing.png b/test/fixtures/controller.doughnut/doughnut-dataset-spacing.png new file mode 100644 index 0000000000000000000000000000000000000000..03df527c4a45e689cd3a252e383042481bcdbb6d GIT binary patch literal 56474 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 QY5)KL07*qoM6N<$f_`HQQ~&?~ literal 0 HcmV?d00001 diff --git a/test/specs/controller.doughnut.tests.js b/test/specs/controller.doughnut.tests.js index ff45ab83138..e1bd5d08f9d 100644 --- a/test/specs/controller.doughnut.tests.js +++ b/test/specs/controller.doughnut.tests.js @@ -460,4 +460,117 @@ describe('Chart.controllers.doughnut', function() { after: [] }]); }); + + it ('should apply datasetSpacing to multiple datasets', function() { + var chart = window.acquireChart({ + type: 'doughnut', + data: { + datasets: [{ + data: [10, 20], + label: 'Dataset 1', + backgroundColor: ['red', 'blue'] + }, { + data: [15, 25], + label: 'Dataset 2', + backgroundColor: ['green', 'yellow'] + }, { + data: [20, 30], + label: 'Dataset 3', + backgroundColor: ['orange', 'purple'] + }], + labels: ['label0', 'label1'] + }, + options: { + plugins: { + legend: false, + title: false + }, + datasetSpacing: 10 + } + }); + + chart.update(); + + var controller0 = chart.getDatasetMeta(0).controller; + var controller1 = chart.getDatasetMeta(1).controller; + var controller2 = chart.getDatasetMeta(2).controller; + + // Verify that outer/inner radius decrease by datasetSpacing for each dataset + expect(controller0.outerRadius).toBeGreaterThan(0); + expect(controller1.outerRadius).toBeGreaterThan(0); + expect(controller2.outerRadius).toBeGreaterThan(0); + + expect(controller0.outerRadius).toBeGreaterThan(controller1.outerRadius); + expect(controller1.outerRadius).toBeGreaterThan(controller2.outerRadius); + + // The outer radius should decrease as we move to inner datasets + // Each dataset should have its spacing applied + var spacing0to1 = controller0.outerRadius - controller1.outerRadius; + var spacing1to2 = controller1.outerRadius - controller2.outerRadius; + expect(spacing0to1).toBeGreaterThan(0); + expect(spacing1to2).toBeGreaterThan(0); + }); + + it ('should handle zero datasetSpacing', function() { + var chart = window.acquireChart({ + type: 'doughnut', + data: { + datasets: [{ + data: [10, 20], + label: 'Dataset 1' + }, { + data: [15, 25], + label: 'Dataset 2' + }], + labels: ['label0', 'label1'] + }, + options: { + plugins: { + legend: false, + title: false + }, + datasetSpacing: 0 + } + }); + + chart.update(); + + var controller0 = chart.getDatasetMeta(0).controller; + var controller1 = chart.getDatasetMeta(1).controller; + + // With zero spacing, the radius difference should be only due to radiusLength + var radiusLength = (controller0.outerRadius - controller0.innerRadius); + expect(controller0.outerRadius - controller1.outerRadius).toBeCloseTo(radiusLength, 0); + }); + + it ('should handle undefined datasetSpacing (default to 0)', function() { + var chart = window.acquireChart({ + type: 'doughnut', + data: { + datasets: [{ + data: [10, 20], + label: 'Dataset 1' + }, { + data: [15, 25], + label: 'Dataset 2' + }], + labels: ['label0', 'label1'] + }, + options: { + plugins: { + legend: false, + title: false + } + } + }); + + chart.update(); + + var controller0 = chart.getDatasetMeta(0).controller; + var controller1 = chart.getDatasetMeta(1).controller; + + // With undefined spacing (defaults to 0), the radius difference should be only due to radiusLength + var radiusLength = (controller0.outerRadius - controller0.innerRadius); + expect(controller0.outerRadius - controller1.outerRadius).toBeCloseTo(radiusLength, 0); + }); }); diff --git a/test/types/options.ts b/test/types/options.ts index b848475df54..d8f8a760529 100644 --- a/test/types/options.ts +++ b/test/types/options.ts @@ -39,6 +39,7 @@ const doughnutOptions: DoughnutControllerChartOptions = { radius: 100, rotation: 0, spacing: 0, + datasetSpacing: 0, animation: false, spacingMode: 'angular', };