| `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.
-| `stack` | `string` | The ID of the group to which this dataset belongs to (when stacked, each group will be a separate stack).
+| `stack` | `string` | The ID of the group to which this dataset belongs to (when stacked, each group will be a separate stack). Defaults to dataset `type`.
| `parsing` | `boolean`\|`object` | How to parse the dataset. The parsing can be disabled by specifying parsing: false at chart options or dataset. If parsing is disabled, data must be sorted and in the formats the associated chart type and scales use internally.
| `hidden` | `boolean` | Configure the visibility of the dataset. Using `hidden: true` will hide the dataset from being rendered in the Chart.
--- /dev/null
+# Stacked bar/line
+
+```js chart-editor
+// <block:actions:2>
+const actions = [
+ {
+ name: 'Randomize',
+ handler(chart) {
+ chart.data.datasets.forEach(dataset => {
+ dataset.data = Utils.numbers({count: chart.data.labels.length, min: 0, max: 100});
+ });
+ chart.update();
+ }
+ },
+ {
+ name: 'Add Dataset',
+ handler(chart) {
+ const data = chart.data;
+ const dsColor = Utils.namedColor(chart.data.datasets.length);
+ const newDataset = {
+ label: 'Dataset ' + (data.datasets.length + 1),
+ backgroundColor: Utils.transparentize(dsColor, 0.5),
+ borderColor: dsColor,
+ borderWidth: 1,
+ stack: 'combined',
+ data: Utils.numbers({count: data.labels.length, min: 0, max: 100}),
+ };
+ chart.data.datasets.push(newDataset);
+ chart.update();
+ }
+ },
+ {
+ name: 'Add Data',
+ handler(chart) {
+ const data = chart.data;
+ if (data.datasets.length > 0) {
+ data.labels = Utils.months({count: data.labels.length + 1});
+
+ for (var index = 0; index < data.datasets.length; ++index) {
+ data.datasets[index].data.push(Utils.rand(0, 100));
+ }
+
+ chart.update();
+ }
+ }
+ },
+ {
+ name: 'Remove Dataset',
+ handler(chart) {
+ chart.data.datasets.pop();
+ chart.update();
+ }
+ },
+ {
+ name: 'Remove Data',
+ handler(chart) {
+ chart.data.labels.splice(-1, 1); // remove the label first
+
+ chart.data.datasets.forEach(dataset => {
+ dataset.data.pop();
+ });
+
+ chart.update();
+ }
+ }
+];
+// </block:actions>
+
+// <block:setup:1>
+const DATA_COUNT = 7;
+const NUMBER_CFG = {count: DATA_COUNT, min: 0, max: 100};
+
+const labels = Utils.months({count: 7});
+const data = {
+ labels: labels,
+ datasets: [
+ {
+ label: 'Dataset 1',
+ data: Utils.numbers(NUMBER_CFG),
+ borderColor: Utils.CHART_COLORS.red,
+ backgroundColor: Utils.transparentize(Utils.CHART_COLORS.red, 0.5),
+ stack: 'combined',
+ type: 'bar'
+ },
+ {
+ label: 'Dataset 2',
+ data: Utils.numbers(NUMBER_CFG),
+ borderColor: Utils.CHART_COLORS.blue,
+ backgroundColor: Utils.transparentize(Utils.CHART_COLORS.blue, 0.5),
+ stack: 'combined'
+ }
+ ]
+};
+// </block:setup>
+
+// <block:config:0>
+const config = {
+ type: 'line',
+ data: data,
+ options: {
+ plugins: {
+ title: {
+ display: true,
+ text: 'Chart.js Stacked Line/Bar Chart'
+ }
+ },
+ scales: {
+ y: {
+ stacked: true
+ }
+ }
+ },
+};
+// </block:config>
+
+module.exports = {
+ actions: actions,
+ config: config,
+};
+```