]> git.ipfire.org Git - thirdparty/Chart.js.git/commitdiff
Float bars: data as objects (#6739)
authorJukka Kurkela <jukka.kurkela@gmail.com>
Fri, 15 Nov 2019 13:40:45 +0000 (15:40 +0200)
committerEvert Timberg <evert.timberg+github@gmail.com>
Fri, 15 Nov 2019 13:40:45 +0000 (08:40 -0500)
Float bars can be specified in object data points

samples/charts/bar/float.html [new file with mode: 0644]
samples/charts/bar/vertical.html
samples/samples.js
src/controllers/controller.bar.js
src/core/core.scale.js
test/fixtures/controller.bar/floatBar/data-as-objects-horizontal.js [new file with mode: 0644]
test/fixtures/controller.bar/floatBar/data-as-objects-horizontal.png [new file with mode: 0644]
test/fixtures/controller.bar/floatBar/data-as-objects.js [new file with mode: 0644]
test/fixtures/controller.bar/floatBar/data-as-objects.png [new file with mode: 0644]

diff --git a/samples/charts/bar/float.html b/samples/charts/bar/float.html
new file mode 100644 (file)
index 0000000..968deb9
--- /dev/null
@@ -0,0 +1,143 @@
+<!doctype html>
+<html>
+
+<head>
+       <title>Bar Chart</title>
+       <script src="../../../dist/Chart.min.js"></script>
+       <script src="../../utils.js"></script>
+       <style>
+       canvas {
+               -moz-user-select: none;
+               -webkit-user-select: none;
+               -ms-user-select: none;
+       }
+       </style>
+</head>
+
+<body>
+       <div id="container" style="width: 75%;">
+               <canvas id="canvas"></canvas>
+       </div>
+       <button id="randomizeData">Randomize Data</button>
+       <button id="addDataset">Add Dataset</button>
+       <button id="removeDataset">Remove Dataset</button>
+       <button id="addData">Add Data</button>
+       <button id="removeData">Remove Data</button>
+       <script>
+               var MONTHS = ['January', 'February', 'March', 'April', 'May', 'June', 'July', 'August', 'September', 'October', 'November', 'December'];
+               var color = Chart.helpers.color;
+               var barChartData = {
+                       labels: ['January', 'February', 'March', 'April', 'May', 'June', 'July'],
+                       datasets: [{
+                               label: 'Dataset 1',
+                               backgroundColor: color(window.chartColors.red).alpha(0.5).rgbString(),
+                               borderColor: window.chartColors.red,
+                               borderWidth: 1,
+                               data: [
+                                       [randomScalingFactor(), randomScalingFactor()],
+                                       [randomScalingFactor(), randomScalingFactor()],
+                                       [randomScalingFactor(), randomScalingFactor()],
+                                       [randomScalingFactor(), randomScalingFactor()],
+                                       [randomScalingFactor(), randomScalingFactor()],
+                                       [randomScalingFactor(), randomScalingFactor()],
+                                       [randomScalingFactor(), randomScalingFactor()]
+                               ]
+                       }, {
+                               label: 'Dataset 2',
+                               backgroundColor: color(window.chartColors.blue).alpha(0.5).rgbString(),
+                               borderColor: window.chartColors.blue,
+                               borderWidth: 1,
+                               data: [
+                                       [randomScalingFactor(), randomScalingFactor()],
+                                       [randomScalingFactor(), randomScalingFactor()],
+                                       [randomScalingFactor(), randomScalingFactor()],
+                                       [randomScalingFactor(), randomScalingFactor()],
+                                       [randomScalingFactor(), randomScalingFactor()],
+                                       [randomScalingFactor(), randomScalingFactor()],
+                                       [randomScalingFactor(), randomScalingFactor()]
+                               ]
+                       }]
+
+               };
+
+               window.onload = function() {
+                       var ctx = document.getElementById('canvas').getContext('2d');
+                       window.myBar = new Chart(ctx, {
+                               type: 'bar',
+                               data: barChartData,
+                               options: {
+                                       responsive: true,
+                                       legend: {
+                                               position: 'top',
+                                       },
+                                       title: {
+                                               display: true,
+                                               text: 'Chart.js Bar Chart'
+                                       }
+                               }
+                       });
+
+               };
+
+               document.getElementById('randomizeData').addEventListener('click', function() {
+                       var zero = Math.random() < 0.2 ? true : false;
+                       barChartData.datasets.forEach(function(dataset) {
+                               dataset.data = dataset.data.map(function() {
+                                       return zero ? 0.0 : [randomScalingFactor(), randomScalingFactor()];
+                               });
+
+                       });
+                       window.myBar.update();
+               });
+
+               var colorNames = Object.keys(window.chartColors);
+               document.getElementById('addDataset').addEventListener('click', function() {
+                       var colorName = colorNames[barChartData.datasets.length % colorNames.length];
+                       var dsColor = window.chartColors[colorName];
+                       var newDataset = {
+                               label: 'Dataset ' + (barChartData.datasets.length + 1),
+                               backgroundColor: color(dsColor).alpha(0.5).rgbString(),
+                               borderColor: dsColor,
+                               borderWidth: 1,
+                               data: []
+                       };
+
+                       for (var index = 0; index < barChartData.labels.length; ++index) {
+                               newDataset.data.push([randomScalingFactor(), randomScalingFactor()]);
+                       }
+
+                       barChartData.datasets.push(newDataset);
+                       window.myBar.update();
+               });
+
+               document.getElementById('addData').addEventListener('click', function() {
+                       if (barChartData.datasets.length > 0) {
+                               var month = MONTHS[barChartData.labels.length % MONTHS.length];
+                               barChartData.labels.push(month);
+
+                               for (var index = 0; index < barChartData.datasets.length; ++index) {
+                                       barChartData.datasets[index].data.push([randomScalingFactor(), randomScalingFactor()]);
+                               }
+
+                               window.myBar.update();
+                       }
+               });
+
+               document.getElementById('removeDataset').addEventListener('click', function() {
+                       barChartData.datasets.pop();
+                       window.myBar.update();
+               });
+
+               document.getElementById('removeData').addEventListener('click', function() {
+                       barChartData.labels.splice(-1, 1); // remove the label first
+
+                       barChartData.datasets.forEach(function(dataset) {
+                               dataset.data.pop();
+                       });
+
+                       window.myBar.update();
+               });
+       </script>
+</body>
+
+</html>
index ed69a436738462f4861a81f1b0a0b77ab103996e..1cc2fd3e40459fe4ac2366837bf25c24bf8058e7 100644 (file)
                                barChartData.labels.push(month);
 
                                for (var index = 0; index < barChartData.datasets.length; ++index) {
-                                       // window.myBar.addData(randomScalingFactor(), index);
                                        barChartData.datasets[index].data.push(randomScalingFactor());
                                }
 
index 6e06756b2046ff5e670c91ec61a09dd55c2b9298..15ece3ff5680c284d65510a1cae1d18de5cc5c1d 100644 (file)
@@ -19,6 +19,9 @@
                }, {
                        title: 'Stacked groups',
                        path: 'charts/bar/stacked-group.html'
+               }, {
+                       title: 'Floating',
+                       path: 'charts/bar/float.html'
                }]
        }, {
                title: 'Line charts',
index 7c30a6a4324c055f274e0005c6fae56844852244..212ff840ebbdac1d4f723eb886787117167a36ce 100644 (file)
@@ -213,6 +213,32 @@ module.exports = DatasetController.extend({
                return parseArrayOrPrimitive.apply(this, arguments);
        },
 
+       /**
+        * Overriding object data parsing since we support mixed primitive/array
+        * value-scale data for float bars
+        * @private
+        */
+       _parseObjectData: function(meta, data, start, count) {
+               var iScale = this._getIndexScale();
+               var vScale = this._getValueScale();
+               var vProp = vScale._getAxis();
+               var parsed = [];
+               var i, ilen, item, obj, value;
+               for (i = start, ilen = start + count; i < ilen; ++i) {
+                       obj = data[i];
+                       item = {};
+                       item[iScale.id] = iScale._parseObject(obj, iScale._getAxis(), i);
+                       value = obj[vProp];
+                       if (helpers.isArray(value)) {
+                               parseFloatBar(value, item, vScale, i);
+                       } else {
+                               item[vScale.id] = vScale._parseObject(obj, vProp, i);
+                       }
+                       parsed.push(item);
+               }
+               return parsed;
+       },
+
        initialize: function() {
                var me = this;
                var meta;
index 89d8d1c853964bf74399037085546d0c9b33927c..a06438ebaae2a86eafe0308faf2562532244cb5f 100644 (file)
@@ -1391,8 +1391,8 @@ class Scale extends Element {
        /**
         * @private
         */
-       _getAxisID() {
-               return this.isHorizontal() ? 'xAxisID' : 'yAxisID';
+       _getAxis() {
+               return this.isHorizontal() ? 'x' : 'y';
        }
 
        /**
@@ -1403,7 +1403,7 @@ class Scale extends Element {
        _getMatchingVisibleMetas(type) {
                var me = this;
                var metas = me.chart._getSortedVisibleDatasetMetas();
-               var axisID = me._getAxisID();
+               var axisID = me._getAxis() + 'AxisID';
                var result = [];
                var i, ilen, meta;
 
diff --git a/test/fixtures/controller.bar/floatBar/data-as-objects-horizontal.js b/test/fixtures/controller.bar/floatBar/data-as-objects-horizontal.js
new file mode 100644 (file)
index 0000000..14dbb58
--- /dev/null
@@ -0,0 +1,32 @@
+module.exports = {
+       config: {
+               type: 'horizontalBar',
+               data: {
+                       labels: ['a', 'b', 'c'],
+                       datasets: [
+                               {
+                                       data: [{y: 'b', x: [2, 8]}, {y: 'c', x: [2, 5]}],
+                                       backgroundColor: '#ff0000'
+                               },
+                               {
+                                       data: [{y: 'a', x: 10}, {y: 'c', x: [6, 10]}],
+                                       backgroundColor: '#00ff00'
+                               }
+                       ]
+               },
+               options: {
+                       legend: false,
+                       title: false,
+                       scales: {
+                               xAxes: [{display: false, ticks: {min: 0}}],
+                               yAxes: [{display: false, stacked: true}]
+                       }
+               }
+       },
+       options: {
+               canvas: {
+                       height: 256,
+                       width: 512
+               }
+       }
+};
diff --git a/test/fixtures/controller.bar/floatBar/data-as-objects-horizontal.png b/test/fixtures/controller.bar/floatBar/data-as-objects-horizontal.png
new file mode 100644 (file)
index 0000000..39b4496
Binary files /dev/null and b/test/fixtures/controller.bar/floatBar/data-as-objects-horizontal.png differ
diff --git a/test/fixtures/controller.bar/floatBar/data-as-objects.js b/test/fixtures/controller.bar/floatBar/data-as-objects.js
new file mode 100644 (file)
index 0000000..08ab0a9
--- /dev/null
@@ -0,0 +1,32 @@
+module.exports = {
+       config: {
+               type: 'bar',
+               data: {
+                       labels: ['a', 'b', 'c'],
+                       datasets: [
+                               {
+                                       data: [{x: 'b', y: [2, 8]}, {x: 'c', y: [2, 5]}],
+                                       backgroundColor: '#ff0000'
+                               },
+                               {
+                                       data: [{x: 'a', y: 10}, {x: 'c', y: [6, 10]}],
+                                       backgroundColor: '#00ff00'
+                               }
+                       ]
+               },
+               options: {
+                       legend: false,
+                       title: false,
+                       scales: {
+                               xAxes: [{display: false, stacked: true}],
+                               yAxes: [{display: false, ticks: {min: 0}}]
+                       }
+               }
+       },
+       options: {
+               canvas: {
+                       height: 256,
+                       width: 512
+               }
+       }
+};
diff --git a/test/fixtures/controller.bar/floatBar/data-as-objects.png b/test/fixtures/controller.bar/floatBar/data-as-objects.png
new file mode 100644 (file)
index 0000000..70c0ada
Binary files /dev/null and b/test/fixtures/controller.bar/floatBar/data-as-objects.png differ