X-Git-Url: https://adrianiainlam.tk/git/?a=blobdiff_plain;f=dygraph-tickers.js;h=6ad31027f6b8f0d9e92a5c8fa4ec0c9ac0ac906f;hb=1a19005fada6b8f190aa35b3908dc571ea360d3e;hp=457d23c25b13e9673c5c8fa880e74ccd8723ea0f;hpb=fa0d7ad80802e2b31d9889936eb6ffd55dab1f43;p=dygraphs.git diff --git a/dygraph-tickers.js b/dygraph-tickers.js index 457d23c..6ad3102 100644 --- a/dygraph-tickers.js +++ b/dygraph-tickers.js @@ -58,12 +58,12 @@ * middle of the years. */ -/*jshint globalstrict: true */ +/*jshint globalstrict:true, sub:true */ /*global Dygraph:false */ "use strict"; /** @typedef {Array.<{v:number, label:string, label_v:(string|undefined)}>} */ -Dygraph.TickList; +Dygraph.TickList = undefined; // the ' = undefined' keeps jshint happy. /** @typedef {function( * number, @@ -74,8 +74,7 @@ Dygraph.TickList; * Array.= * ): Dygraph.TickList} */ -Dygraph.Ticker; - +Dygraph.Ticker = undefined; // the ' = undefined' keeps jshint happy. /** @type {Dygraph.Ticker} */ Dygraph.numericLinearTicks = function(a, b, pixels, opts, dygraph, vals) { @@ -157,18 +156,32 @@ Dygraph.numericTicks = function(a, b, pixels, opts, dygraph, vals) { var kmg2 = opts("labelsKMG2"); var mults, base; if (kmg2) { - mults = [1, 2, 4, 8, 16]; + mults = [1, 2, 4, 8, 16, 32, 64, 128, 256]; base = 16; } else { - mults = [1, 2, 5, 10]; + mults = [1, 2, 5, 10, 20, 50, 100]; base = 10; } - var wanted_ticks = pixels / pixels_per_tick; - var units_per_tick = Math.abs(b - a) / wanted_ticks; + // Get the maximum number of permitted ticks based on the + // graph's pixel size and pixels_per_tick setting. + var max_ticks = Math.ceil(pixels / pixels_per_tick); + + // Now calculate the data unit equivalent of this tick spacing. + // Use abs() since graphs may have a reversed Y axis. + var units_per_tick = Math.abs(b - a) / max_ticks; + + // Based on this, get a starting scale which is the largest + // integer power of the chosen base (10 or 16) that still remains + // below the requested pixels_per_tick spacing. var base_power = Math.floor(Math.log(units_per_tick) / Math.log(base)); var base_scale = Math.pow(base, base_power); - var scale, low_val, high_val, nTicks, spacing; + + // Now try multiples of the starting scale until we find one + // that results in tick marks spaced sufficiently far apart. + // The "mults" array should cover the range 1 .. base^2 to + // adjust for rounding and edge effects. + var scale, low_val, high_val, spacing; for (j = 0; j < mults.length; j++) { scale = base_scale * mults[j]; low_val = Math.floor(a / scale) * scale;