]> git.ipfire.org Git - thirdparty/Chart.js.git/commitdiff
Improved number format function. Also improved the generation of small tick values
authoretimberg <evert.timberg@gmail.com>
Sat, 24 Oct 2015 02:00:59 +0000 (22:00 -0400)
committeretimberg <evert.timberg@gmail.com>
Sat, 24 Oct 2015 02:00:59 +0000 (22:00 -0400)
src/core/core.scale.js
src/scales/scale.linear.js
test/scale.linear.tests.js

index 1338011500c117d4f390f5d8e32f98b067a0f45f..40c436fed75de96c264f6db47f9dc42a021b184a 100644 (file)
                                        if (this.options.ticks.userCallback) {
                                                return this.options.ticks.userCallback(numericalTick, index, ticks);
                                        }
-                                       return this.options.ticks.callback(numericalTick);
+                                       return this.options.ticks.callback(numericalTick, index, ticks);
                                },
                                this);
                },
index 9de4d81cf6c0e178b8d35f379971ee2229997d23..2d18f4a55701bc8ad92f17ab0b68dffbb4f8f1b7 100644 (file)
@@ -7,6 +7,32 @@
 
        var defaultConfig = {
                position: "left",
+               ticks: {
+                       callback: function(tickValue, index, ticks) {
+                               var delta = ticks[1] - ticks[0];
+
+                               // If we have a number like 2.5 as the delta, figure out how many decimal places we need
+                               if (Math.abs(delta) > 1) {
+                                       if (tickValue !== Math.floor(tickValue)) {
+                                               // not an integer
+                                               delta = tickValue - Math.floor(tickValue);
+                                       }
+                               }
+
+                               var logDelta = helpers.log10(Math.abs(delta));
+                               var tickString = '';
+
+                               if (tickValue !== 0) {
+                                       var numDecimal = -1 * Math.floor(logDelta);
+                                       numDecimal = Math.max(Math.min(numDecimal, 20), 0); // toFixed has a max of 20 decimal places
+                                       tickString = tickValue.toFixed(numDecimal);
+                               } else {
+                                       tickString = '0'; // never show decimal places for 0
+                               }
+
+                               return tickString;
+                       }
+               }
        };
 
        var LinearScale = Chart.Scale.extend({
                        var niceMin = Math.floor(this.min / spacing) * spacing;
                        var niceMax = Math.ceil(this.max / spacing) * spacing;
 
+                       var numSpaces = Math.ceil((niceMax - niceMin) / spacing);
+
                        // Put the values into the ticks array
-                       for (var j = niceMin; j <= niceMax; j += spacing) {
-                               this.ticks.push(j);
+                       for (var j = 0; j <= numSpaces; ++j) {
+                               this.ticks.push(niceMin + (j * spacing));
                        }
 
                        if (this.options.position == "left" || this.options.position == "right") {
index d4a29eec3da2f784030652185487b630cb7aa449..2906d641b2604946f0f5dfb56b3e4cac49add52b 100644 (file)
@@ -412,6 +412,31 @@ describe('Linear Scale', function() {
                expect(scale.ticks).toEqual(['80', '70', '60', '50', '40', '30', '20', '10', '0']);
        });
 
+       it('should use the correct number of decimal places in the default format function', function() {
+               var scaleID = 'myScale';
+
+               var mockData = {
+                       datasets: [{
+                               yAxisID: scaleID,
+                               data: [0.06, 0.005, 0, 0.025, 0.0078]
+                       }, ]
+               };
+
+               var mockContext = window.createMockContext();
+               var config = Chart.helpers.clone(Chart.scaleService.getScaleDefaults('linear'));
+               var Constructor = Chart.scaleService.getScaleConstructor('linear');
+               var scale = new Constructor({
+                       ctx: mockContext,
+                       options: config,
+                       data: mockData,
+                       id: scaleID
+               });
+
+               // Set arbitrary width and height for now
+               scale.update(50, 400);
+               expect(scale.ticks).toEqual(['0.06', '0.05', '0.04', '0.03', '0.02', '0.01', '0']);
+       });
+
        it('Should build labels using the user supplied callback', function() {
                var scaleID = 'myScale';
 
@@ -423,7 +448,7 @@ describe('Linear Scale', function() {
                };
 
                var config = Chart.helpers.clone(Chart.scaleService.getScaleDefaults('linear'));
-               config.ticks.userCallback = function(value, index) {
+               config.ticks.callback = function(value, index) {
                        return index.toString();
                };