dygraphs
Version:
dygraphs is a fast, flexible open source JavaScript charting library.
157 lines (140 loc) • 4.38 kB
JavaScript
/**
* @license
* Copyright 2015 Petr Shevtsov (petr.shevtsov@gmail.com)
* MIT-licenced: https://opensource.org/licenses/MIT
*
* Rebase plugin
*
* On pan/zoom event, each series will rebase to a specified value (e.g. 100) at the
* start of the displayed period.
*
* See http://stats.oecd.org/glossary/detail.asp?ID=2249
*
* Options:
* Value to rebase. Must be either Number or 'percent' or null.
*
* See tests/straw-broom.html for demo.
*/
/* loader wrapper to allow browser use and ES6 imports */
(function _extras_rebase_closure() {
;
var Dygraph;
if (window.Dygraph) {
Dygraph = window.Dygraph;
} else if (typeof(module) !== 'undefined') {
Dygraph = require('../dygraph');
if (typeof(Dygraph.NAME) === 'undefined' && typeof(Dygraph.default) !== 'undefined')
Dygraph = Dygraph.default;
}
/* end of loader wrapper header */
// Matches DefaultHandler.parseFloat
var parseFloat = function parseFloat(val) {
if (val === null) return NaN;
return val;
};
Dygraph.DataHandlers.RebaseHandler = function RebaseHandler(baseOpt) {
this.baseOpt = baseOpt;
};
var RebaseHandler = Dygraph.DataHandlers.RebaseHandler;
RebaseHandler.prototype = new Dygraph.DataHandlers.DefaultHandler();
RebaseHandler.rebase = function rebase(value, initial, base) {
if (base === "percent") {
return (value / initial - 1) * 100;
}
return value * base / initial;
};
RebaseHandler.prototype.getExtremeYValues = function getExtremeYValues(series, dateWindow, stepPlot) {
var minY = null, maxY = null, y;
var firstIdx = 0, lastIdx = series.length - 1;
var initial = series[firstIdx][1];
for (var j = firstIdx; j <= lastIdx; j++) {
if (j === firstIdx) {
y = (this.baseOpt === "percent") ? 0 : this.baseOpt;
} else {
y = RebaseHandler.rebase(series[j][1], initial, this.baseOpt);
}
if (y === null || isNaN(y))
continue;
if (maxY === null || y > maxY) {
maxY = y;
}
if (minY === null || y < minY) {
minY = y;
}
}
return [ minY, maxY ];
};
RebaseHandler.prototype.seriesToPoints = function seriesToPoints(series, setName, boundaryIdStart) {
var points = [];
var firstIdx = 0;
var lastIdx = series.length - 1;
var initial = series[firstIdx][1]; // TODO: check for null
for (var i = 0; i <= lastIdx; ++i) {
var item = series[i];
var yraw = item[1];
var yval = yraw === null ? null : parseFloat(yraw);
if (yval !== null) {
if (i === firstIdx) {
yval = (this.baseOpt === "percent") ? 0 : this.baseOpt;
} else {
yval = RebaseHandler.rebase(yval, initial, this.baseOpt);
}
}
var point = {
x: NaN,
y: NaN,
xval: parseFloat(item[0]),
yval: yval,
name: setName,
idx: i + boundaryIdStart
};
points.push(point);
}
this.onPointsCreated_(series, points);
return points;
};
Dygraph.Plugins.Rebase = (function _rebase_inner_closure() {
var rebase = function rebase(baseOpt) {
var isNum = function isNum(v) {
return !isNaN(v) && (typeof v === 'number' || {}.toString.call(v) === '[object Number]');
};
if (baseOpt === "percent" || isNum(baseOpt)) {
this.baseOpt_ = baseOpt;
} else {
this.baseOpt_ = null;
}
};
rebase.prototype.toString = function toString() {
return "Rebase Plugin";
};
rebase.prototype.activate = function activate(g) {
if (this.baseOpt_ === null) {
return;
}
return {
predraw: this.predraw
};
};
rebase.prototype.predraw = function predraw(e) {
var g = e.dygraph;
if (this.baseOpt_ === "percent") {
g.updateOptions({
axes: {
y: {
axisLabelFormatter: function axisLabelFormatter(y) {
return y + '%';
},
valueFormatter: function valueFormatter(y) {
return Math.round(y * 100) / 100 + '%';
}
}
}
}, true);
}
g.dataHandler_ = new Dygraph.DataHandlers.RebaseHandler(this.baseOpt_);
};
return rebase;
})();
/* closure and loader wrapper */
Dygraph._require.add('dygraphs/src/extras/rebase.js', /* exports */ {});
})();