/*global Dygraph:false */
"use strict";
+Dygraph.numericLinearTicks = function(a, b, pixels, opts, dygraph, vals) {
+ var nonLogscaleOpts = function(opt) {
+ if (opt === 'logscale') return false;
+ return opts(opt);
+ };
+ return Dygraph.numericTicks(a, b, pixels, nonLogscaleOpts, dygraph, vals);
+};
+
Dygraph.numericTicks = function(a, b, pixels, opts, dygraph, vals) {
var pixels_per_tick = opts('pixelsPerLabel');
var ticks = [];
// Add formatted labels to the ticks.
var k;
var k_labels = [];
+ var m_labels = [];
if (opts("labelsKMB")) {
k = 1000;
- k_labels = [ "K", "M", "B", "T" ];
+ k_labels = [ "K", "M", "B", "T", "Q" ];
}
if (opts("labelsKMG2")) {
if (k) Dygraph.warn("Setting both labelsKMB and labelsKMG2. Pick one!");
k = 1024;
- k_labels = [ "k", "M", "G", "T" ];
+ k_labels = [ "k", "M", "G", "T", "P", "E", "Z", "Y" ];
+ m_labels = [ "m", "u", "n", "p", "f", "a", "z", "y" ];
}
var formatter = opts('axisLabelFormatter');
if (k_labels.length > 0) {
// TODO(danvk): should this be integrated into the axisLabelFormatter?
// Round up to an appropriate unit.
- var n = k*k*k*k;
- for (j = 3; j >= 0; j--, n /= k) {
+ var n = Math.pow(k, k_labels.length);
+ for (j = k_labels.length - 1; j >= 0; j--, n /= k) {
if (absTickV >= n) {
label = Dygraph.round_(tickV / n, opts('digitsAfterDecimal')) +
k_labels[j];
}
}
}
+ if(opts("labelsKMG2")){
+ tickV = String(tickV.toExponential());
+ if(tickV.split('e-').length === 2 && tickV.split('e-')[1] >= 3 && tickV.split('e-')[1] <= 24){
+ if(tickV.split('e-')[1] % 3 > 0) {
+ label = Dygraph.round_(tickV.split('e-')[0] /
+ Math.pow(10,(tickV.split('e-')[1] % 3)),
+ opts('digitsAfterDecimal'));
+ } else {
+ label = Number(tickV.split('e-')[0]).toFixed(2);
+ }
+ label += m_labels[Math.floor(tickV.split('e-')[1] / 3) - 1];
+ }
+ }
ticks[i].label = label;
}
Dygraph.dateTicker = function(a, b, pixels, opts, dygraph, vals) {
- var pixels_per_tick = opts('pixelsPerLabel');
- var chosen = -1;
- for (var i = 0; i < Dygraph.NUM_GRANULARITIES; i++) {
- var num_ticks = Dygraph.numDateTicks(a, b, i);
- if (pixels / num_ticks >= pixels_per_tick) {
- chosen = i;
- break;
- }
- }
+ var chosen = Dygraph.pickDateTickGranularity(a, b, pixels, opts);
if (chosen >= 0) {
return Dygraph.getDateAxis(a, b, chosen, opts, dygraph);
return vals;
}();
+/**
+ * Determine the correct granularity of ticks on a date axis.
+ *
+ * @param {Number} a Left edge of the chart (ms)
+ * @param {Number} b Right edge of the chart (ms)
+ * @param {Number} pixels Size of the chart in the relevant dimension (width).
+ * @param {Function} opts Function mapping from option name -> value.
+ * @return {Number} The appropriate axis granularity for this chart. See the
+ * enumeration of possible values in dygraph-tickers.js.
+ */
+Dygraph.pickDateTickGranularity = function(a, b, pixels, opts) {
+ var pixels_per_tick = opts('pixelsPerLabel');
+ for (var i = 0; i < Dygraph.NUM_GRANULARITIES; i++) {
+ var num_ticks = Dygraph.numDateTicks(a, b, i);
+ if (pixels / num_ticks >= pixels_per_tick) {
+ return i;
+ }
+ }
+ return -1;
+};
+
Dygraph.numDateTicks = function(start_time, end_time, granularity) {
if (granularity < Dygraph.MONTHLY) {
// Generate one tick mark for every fixed interval of time.
// for this granularity.
var g = spacing / 1000;
var d = new Date(start_time);
+ d.setMilliseconds(0);
var x;
if (g <= 60) { // seconds
x = d.getSeconds(); d.setSeconds(x - x % g);