diff --git a/src/core/core.scale.js b/src/core/core.scale.js index 53e90c64215..14b4af404da 100644 --- a/src/core/core.scale.js +++ b/src/core/core.scale.js @@ -355,7 +355,7 @@ var Scale = Element.extend({ me._start = start; me._end = end; me._reverse = reverse; - me._length = me._end - me._start; + me._length = end - start; }, afterUpdate: function() { diff --git a/src/scales/scale.linear.js b/src/scales/scale.linear.js index fdb9e1dcacc..260a5ff974a 100644 --- a/src/scales/scale.linear.js +++ b/src/scales/scale.linear.js @@ -149,20 +149,12 @@ module.exports = LinearScaleBase.extend({ // Utils getPixelForValue: function(value) { - // This must be called after fit has been run so that - // this.left, this.top, this.right, and this.bottom have been defined var me = this; - var start = me.min; - var rightValue = +me.getRightValue(value); - var range = me.max - start; - return me.getPixelForDecimal((rightValue - start) / range); + return me.getPixelForDecimal((+me.getRightValue(value) - me.min) / me._range); }, getValueForPixel: function(pixel) { - var me = this; - var start = me.min; - var range = me.max - start; - return start + me.getDecimalForPixel(pixel) * range; + return this.min + this.getDecimalForPixel(pixel) * this._range; }, getPixelForTick: function(index) { diff --git a/src/scales/scale.linearbase.js b/src/scales/scale.linearbase.js index 7f68279db6c..d9d0901f6e3 100644 --- a/src/scales/scale.linearbase.js +++ b/src/scales/scale.linearbase.js @@ -231,5 +231,13 @@ module.exports = Scale.extend({ me.zeroLineIndex = me.ticks.indexOf(0); Scale.prototype.convertTicksToLabels.call(me); + }, + + _configure: function() { + var me = this; + + Scale.prototype._configure.call(me); + + me._range = me.max - me.min; } }); diff --git a/src/scales/scale.logarithmic.js b/src/scales/scale.logarithmic.js index 24b62792630..df8654a064b 100644 --- a/src/scales/scale.logarithmic.js +++ b/src/scales/scale.logarithmic.js @@ -266,15 +266,18 @@ module.exports = Scale.extend({ return significand * Math.pow(10, exp); }, - _getParams: function() { + _configure: function() { var me = this; var start = me.min; var offset = 0; + + Scale.prototype._configure.call(me); + if (start === 0) { start = me._getFirstTickValue(me.minNotZero); offset = valueOrDefault(me.options.ticks.fontSize, defaults.global.defaultFontSize) / me._length; } - return { + me._params = { start: log10(start), offset: offset, range: (log10(me.max) - log10(start)) / (1 - offset) @@ -284,12 +287,11 @@ module.exports = Scale.extend({ getPixelForValue: function(value) { var me = this; var decimal = 0; - var params; + var params = me._params; value = +me.getRightValue(value); if (value > me.min && value > 0) { - params = me._getParams(); decimal = (log10(value) - params.start) / params.range + params.offset; } return me.getPixelForDecimal(decimal); @@ -297,7 +299,7 @@ module.exports = Scale.extend({ getValueForPixel: function(pixel) { var me = this; - var params = me._getParams(); + var params = me._params; var decimal = me.getDecimalForPixel(pixel); return decimal === 0 && me.min === 0 ? 0 diff --git a/src/scales/scale.time.js b/src/scales/scale.time.js index 0f6348bc433..9d6dfc0e893 100644 --- a/src/scales/scale.time.js +++ b/src/scales/scale.time.js @@ -595,7 +595,6 @@ module.exports = Scale.extend({ me.max = Math.max(min + 1, max); // PRIVATE - me._horizontal = me.isHorizontal(); me._table = []; me._timestamps = { data: timestamps, @@ -610,16 +609,16 @@ module.exports = Scale.extend({ var max = me.max; var options = me.options; var timeOpts = options.time; - var timestamps = []; + var timestamps = me._timestamps; var ticks = []; var i, ilen, timestamp; switch (options.ticks.source) { case 'data': - timestamps = me._timestamps.data; + timestamps = timestamps.data; break; case 'labels': - timestamps = me._timestamps.labels; + timestamps = timestamps.labels; break; case 'auto': default: @@ -724,13 +723,8 @@ module.exports = Scale.extend({ getPixelForOffset: function(time) { var me = this; var offsets = me._offsets; - var size = me._horizontal ? me.width : me.height; var pos = interpolate(me._table, 'time', time, 'pos'); - var offset = size * (offsets.start + pos) * offsets.factor; - - return me.options.ticks.reverse ? - (me._horizontal ? me.right : me.bottom) - offset : - (me._horizontal ? me.left : me.top) + offset; + return me.getPixelForDecimal((offsets.start + pos) * offsets.factor); }, getPixelForValue: function(value, index, datasetIndex) { @@ -760,11 +754,7 @@ module.exports = Scale.extend({ getValueForPixel: function(pixel) { var me = this; var offsets = me._offsets; - var size = me._horizontal ? me.width : me.height; - var offset = me.options.ticks.reverse ? - (me._horizontal ? me.right : me.bottom) - pixel : - pixel - (me._horizontal ? me.left : me.top); - var pos = offset / size / offsets.factor - offsets.start; + var pos = me.getDecimalForPixel(pixel) / offsets.factor - offsets.end; var time = interpolate(me._table, 'pos', pos, 'time'); // DEPRECATION, we should return time directly diff --git a/test/specs/scale.time.tests.js b/test/specs/scale.time.tests.js index 8939dcb78a7..b3e4f0950d9 100755 --- a/test/specs/scale.time.tests.js +++ b/test/specs/scale.time.tests.js @@ -1557,11 +1557,11 @@ describe('Time scale tests', function() { var firstTickInterval = scale.getPixelForTick(1) - scale.getPixelForTick(0); var lastTickInterval = scale.getPixelForTick(numTicks - 1) - scale.getPixelForTick(numTicks - 2); - expect(scale.getValueForPixel(scale.left + firstTickInterval / 2)).toBeCloseToTime({ + expect(scale.getValueForPixel(scale.left + lastTickInterval / 2)).toBeCloseToTime({ value: moment('2042-01-01T00:00:00'), unit: 'hour', }); - expect(scale.getValueForPixel(scale.left + scale.width - lastTickInterval / 2)).toBeCloseToTime({ + expect(scale.getValueForPixel(scale.left + scale.width - firstTickInterval / 2)).toBeCloseToTime({ value: moment('2017-01-01T00:00:00'), unit: 'hour', });