dygraphs
Version:
dygraphs is a fast, flexible open source JavaScript charting library.
112 lines (107 loc) • 15.7 kB
JavaScript
;
/**
* @license
* Copyright 2013 David Eberlein (david.eberlein@ch.sauter-bc.com)
* MIT-licenced: https://opensource.org/license/MIT
*/
/**
* @fileoverview DataHandler implementation for the combination
* of error bars and fractions options.
* @author David Eberlein (david.eberlein@ch.sauter-bc.com)
*/
/*global Dygraph:false */
Object.defineProperty(exports, "__esModule", {
value: true
});
exports["default"] = void 0;
var _bars = _interopRequireDefault(require("./bars"));
function _interopRequireDefault(e) { return e && e.__esModule ? e : { "default": e }; }
/**
* @constructor
* @extends Dygraph.DataHandlers.BarsHandler
*/
var FractionsBarsHandler = function FractionsBarsHandler() {};
FractionsBarsHandler.prototype = new _bars["default"]();
/** @inheritDoc */
FractionsBarsHandler.prototype.extractSeries = function (rawData, i, options) {
// TODO(danvk): pre-allocate series here.
var series = [];
var x, y, point, num, den, value, stddev, variance;
var mult = 100.0;
var seriesLabel = options.get("labels")[i];
var logScale = options.getForSeries("logscale", seriesLabel);
var sigma = options.getForSeries("sigma", seriesLabel);
for (var j = 0; j < rawData.length; j++) {
x = rawData[j][0];
point = rawData[j][i];
if (logScale && point !== null) {
// On the log scale, points less than zero do not exist.
// This will create a gap in the chart.
if (point[0] <= 0 || point[1] <= 0) {
point = null;
}
}
// Extract to the unified data format.
if (point !== null) {
num = point[0];
den = point[1];
if (num !== null && !isNaN(num)) {
value = den ? num / den : 0.0;
stddev = den ? sigma * Math.sqrt(value * (1 - value) / den) : 1.0;
variance = mult * stddev;
y = mult * value;
// preserve original values in extras for further filtering
series.push([x, y, [y - variance, y + variance, num, den]]);
} else {
series.push([x, num, [num, num, num, den]]);
}
} else {
series.push([x, null, [null, null, null, null]]);
}
}
return series;
};
/** @inheritDoc */
FractionsBarsHandler.prototype.rollingAverage = function (originalData, rollPeriod, options, i) {
rollPeriod = Math.min(rollPeriod, originalData.length);
var rollingData = [];
var seriesLabel = options.get("labels")[i];
var sigma = options.getForSeries("sigma", seriesLabel);
var wilsonInterval = options.getForSeries("wilsonInterval", seriesLabel);
var low, high, i, stddev;
var num = 0;
var den = 0; // numerator/denominator
var mult = 100.0;
for (i = 0; i < originalData.length; i++) {
num += originalData[i][2][2];
den += originalData[i][2][3];
if (i - rollPeriod >= 0) {
num -= originalData[i - rollPeriod][2][2];
den -= originalData[i - rollPeriod][2][3];
}
var date = originalData[i][0];
var value = den ? num / den : 0.0;
if (wilsonInterval) {
// For more details on this confidence interval, see:
// https://en.wikipedia.org/wiki/Binomial_proportion_confidence_interval
if (den) {
var p = value < 0 ? 0 : value,
n = den;
var pm = sigma * Math.sqrt(p * (1 - p) / n + sigma * sigma / (4 * n * n));
var denom = 1 + sigma * sigma / den;
low = (p + sigma * sigma / (2 * den) - pm) / denom;
high = (p + sigma * sigma / (2 * den) + pm) / denom;
rollingData[i] = [date, p * mult, [low * mult, high * mult]];
} else {
rollingData[i] = [date, 0, [0, 0]];
}
} else {
stddev = den ? sigma * Math.sqrt(value * (1 - value) / den) : 1.0;
rollingData[i] = [date, mult * value, [mult * (value - stddev), mult * (value + stddev)]];
}
}
return rollingData;
};
var _default = exports["default"] = FractionsBarsHandler;
module.exports = exports.default;
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJPYmplY3QiLCJkZWZpbmVQcm9wZXJ0eSIsImV4cG9ydHMiLCJ2YWx1ZSIsIl9iYXJzIiwiX2ludGVyb3BSZXF1aXJlRGVmYXVsdCIsInJlcXVpcmUiLCJlIiwiX19lc01vZHVsZSIsIkZyYWN0aW9uc0JhcnNIYW5kbGVyIiwicHJvdG90eXBlIiwiQmFyc0hhbmRsZXIiLCJleHRyYWN0U2VyaWVzIiwicmF3RGF0YSIsImkiLCJvcHRpb25zIiwic2VyaWVzIiwieCIsInkiLCJwb2ludCIsIm51bSIsImRlbiIsInN0ZGRldiIsInZhcmlhbmNlIiwibXVsdCIsInNlcmllc0xhYmVsIiwiZ2V0IiwibG9nU2NhbGUiLCJnZXRGb3JTZXJpZXMiLCJzaWdtYSIsImoiLCJsZW5ndGgiLCJpc05hTiIsIk1hdGgiLCJzcXJ0IiwicHVzaCIsInJvbGxpbmdBdmVyYWdlIiwib3JpZ2luYWxEYXRhIiwicm9sbFBlcmlvZCIsIm1pbiIsInJvbGxpbmdEYXRhIiwid2lsc29uSW50ZXJ2YWwiLCJsb3ciLCJoaWdoIiwiZGF0ZSIsInAiLCJuIiwicG0iLCJkZW5vbSIsIl9kZWZhdWx0IiwibW9kdWxlIiwiZGVmYXVsdCJdLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9kYXRhaGFuZGxlci9iYXJzLWZyYWN0aW9ucy5qcyJdLCJzb3VyY2VzQ29udGVudCI6WyIndXNlIHN0cmljdCc7XG5cbi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDEzIERhdmlkIEViZXJsZWluIChkYXZpZC5lYmVybGVpbkBjaC5zYXV0ZXItYmMuY29tKVxuICogTUlULWxpY2VuY2VkOiBodHRwczovL29wZW5zb3VyY2Uub3JnL2xpY2Vuc2UvTUlUXG4gKi9cblxuLyoqXG4gKiBAZmlsZW92ZXJ2aWV3IERhdGFIYW5kbGVyIGltcGxlbWVudGF0aW9uIGZvciB0aGUgY29tYmluYXRpb25cbiAqIG9mIGVycm9yIGJhcnMgYW5kIGZyYWN0aW9ucyBvcHRpb25zLlxuICogQGF1dGhvciBEYXZpZCBFYmVybGVpbiAoZGF2aWQuZWJlcmxlaW5AY2guc2F1dGVyLWJjLmNvbSlcbiAqL1xuXG4vKmdsb2JhbCBEeWdyYXBoOmZhbHNlICovXG5cbmltcG9ydCBCYXJzSGFuZGxlciBmcm9tICcuL2JhcnMnO1xuXG4vKipcbiAqIEBjb25zdHJ1Y3RvclxuICogQGV4dGVuZHMgRHlncmFwaC5EYXRhSGFuZGxlcnMuQmFyc0hhbmRsZXJcbiAqL1xudmFyIEZyYWN0aW9uc0JhcnNIYW5kbGVyID0gZnVuY3Rpb24oKSB7XG59O1xuXG5GcmFjdGlvbnNCYXJzSGFuZGxlci5wcm90b3R5cGUgPSBuZXcgQmFyc0hhbmRsZXIoKTtcblxuLyoqIEBpbmhlcml0RG9jICovXG5GcmFjdGlvbnNCYXJzSGFuZGxlci5wcm90b3R5cGUuZXh0cmFjdFNlcmllcyA9IGZ1bmN0aW9uKHJhd0RhdGEsIGksIG9wdGlvbnMpIHtcbiAgLy8gVE9ETyhkYW52ayk6IHByZS1hbGxvY2F0ZSBzZXJpZXMgaGVyZS5cbiAgdmFyIHNlcmllcyA9IFtdO1xuICB2YXIgeCwgeSwgcG9pbnQsIG51bSwgZGVuLCB2YWx1ZSwgc3RkZGV2LCB2YXJpYW5jZTtcbiAgdmFyIG11bHQgPSAxMDAuMDtcbiAgY29uc3Qgc2VyaWVzTGFiZWwgPSBvcHRpb25zLmdldChcImxhYmVsc1wiKVtpXTtcbiAgY29uc3QgbG9nU2NhbGUgPSBvcHRpb25zLmdldEZvclNlcmllcyhcImxvZ3NjYWxlXCIsIHNlcmllc0xhYmVsKTtcbiAgY29uc3Qgc2lnbWEgPSBvcHRpb25zLmdldEZvclNlcmllcyhcInNpZ21hXCIsIHNlcmllc0xhYmVsKTtcbiAgZm9yICggdmFyIGogPSAwOyBqIDwgcmF3RGF0YS5sZW5ndGg7IGorKykge1xuICAgIHggPSByYXdEYXRhW2pdWzBdO1xuICAgIHBvaW50ID0gcmF3RGF0YVtqXVtpXTtcbiAgICBpZiAobG9nU2NhbGUgJiYgcG9pbnQgIT09IG51bGwpIHtcbiAgICAgIC8vIE9uIHRoZSBsb2cgc2NhbGUsIHBvaW50cyBsZXNzIHRoYW4gemVybyBkbyBub3QgZXhpc3QuXG4gICAgICAvLyBUaGlzIHdpbGwgY3JlYXRlIGEgZ2FwIGluIHRoZSBjaGFydC5cbiAgICAgIGlmIChwb2ludFswXSA8PSAwIHx8IHBvaW50WzFdIDw9IDApIHtcbiAgICAgICAgcG9pbnQgPSBudWxsO1xuICAgICAgfVxuICAgIH1cbiAgICAvLyBFeHRyYWN0IHRvIHRoZSB1bmlmaWVkIGRhdGEgZm9ybWF0LlxuICAgIGlmIChwb2ludCAhPT0gbnVsbCkge1xuICAgICAgbnVtID0gcG9pbnRbMF07XG4gICAgICBkZW4gPSBwb2ludFsxXTtcbiAgICAgIGlmIChudW0gIT09IG51bGwgJiYgIWlzTmFOKG51bSkpIHtcbiAgICAgICAgdmFsdWUgPSBkZW4gPyBudW0gLyBkZW4gOiAwLjA7XG4gICAgICAgIHN0ZGRldiA9IGRlbiA/IHNpZ21hICogTWF0aC5zcXJ0KHZhbHVlICogKDEgLSB2YWx1ZSkgLyBkZW4pIDogMS4wO1xuICAgICAgICB2YXJpYW5jZSA9IG11bHQgKiBzdGRkZXY7XG4gICAgICAgIHkgPSBtdWx0ICogdmFsdWU7XG4gICAgICAgIC8vIHByZXNlcnZlIG9yaWdpbmFsIHZhbHVlcyBpbiBleHRyYXMgZm9yIGZ1cnRoZXIgZmlsdGVyaW5nXG4gICAgICAgIHNlcmllcy5wdXNoKFsgeCwgeSwgWyB5IC0gdmFyaWFuY2UsIHkgKyB2YXJpYW5jZSwgbnVtLCBkZW4gXSBdKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHNlcmllcy5wdXNoKFsgeCwgbnVtLCBbIG51bSwgbnVtLCBudW0sIGRlbiBdIF0pO1xuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICBzZXJpZXMucHVzaChbIHgsIG51bGwsIFsgbnVsbCwgbnVsbCwgbnVsbCwgbnVsbCBdIF0pO1xuICAgIH1cbiAgfVxuICByZXR1cm4gc2VyaWVzO1xufTtcblxuLyoqIEBpbmhlcml0RG9jICovXG5GcmFjdGlvbnNCYXJzSGFuZGxlci5wcm90b3R5cGUucm9sbGluZ0F2ZXJhZ2UgPVxuICAgIGZ1bmN0aW9uKG9yaWdpbmFsRGF0YSwgcm9sbFBlcmlvZCwgb3B0aW9ucywgaSkge1xuICByb2xsUGVyaW9kID0gTWF0aC5taW4ocm9sbFBlcmlvZCwgb3JpZ2luYWxEYXRhLmxlbmd0aCk7XG4gIHZhciByb2xsaW5nRGF0YSA9IFtdO1xuICBjb25zdCBzZXJpZXNMYWJlbCA9IG9wdGlvbnMuZ2V0KFwibGFiZWxzXCIpW2ldO1xuICBjb25zdCBzaWdtYSA9IG9wdGlvbnMuZ2V0Rm9yU2VyaWVzKFwic2lnbWFcIiwgc2VyaWVzTGFiZWwpO1xuICBjb25zdCB3aWxzb25JbnRlcnZhbCA9IG9wdGlvbnMuZ2V0Rm9yU2VyaWVzKFwid2lsc29uSW50ZXJ2YWxcIiwgc2VyaWVzTGFiZWwpO1xuXG4gIHZhciBsb3csIGhpZ2gsIGksIHN0ZGRldjtcbiAgdmFyIG51bSA9IDA7XG4gIHZhciBkZW4gPSAwOyAvLyBudW1lcmF0b3IvZGVub21pbmF0b3JcbiAgdmFyIG11bHQgPSAxMDAuMDtcbiAgZm9yIChpID0gMDsgaSA8IG9yaWdpbmFsRGF0YS5sZW5ndGg7IGkrKykge1xuICAgIG51bSArPSBvcmlnaW5hbERhdGFbaV1bMl1bMl07XG4gICAgZGVuICs9IG9yaWdpbmFsRGF0YVtpXVsyXVszXTtcbiAgICBpZiAoaSAtIHJvbGxQZXJpb2QgPj0gMCkge1xuICAgICAgbnVtIC09IG9yaWdpbmFsRGF0YVtpIC0gcm9sbFBlcmlvZF1bMl1bMl07XG4gICAgICBkZW4gLT0gb3JpZ2luYWxEYXRhW2kgLSByb2xsUGVyaW9kXVsyXVszXTtcbiAgICB9XG5cbiAgICB2YXIgZGF0ZSA9IG9yaWdpbmFsRGF0YVtpXVswXTtcbiAgICB2YXIgdmFsdWUgPSBkZW4gPyBudW0gLyBkZW4gOiAwLjA7XG4gICAgaWYgKHdpbHNvbkludGVydmFsKSB7XG4gICAgICAvLyBGb3IgbW9yZSBkZXRhaWxzIG9uIHRoaXMgY29uZmlkZW5jZSBpbnRlcnZhbCwgc2VlOlxuICAgICAgLy8gaHR0cHM6Ly9lbi53aWtpcGVkaWEub3JnL3dpa2kvQmlub21pYWxfcHJvcG9ydGlvbl9jb25maWRlbmNlX2ludGVydmFsXG4gICAgICBpZiAoZGVuKSB7XG4gICAgICAgIHZhciBwID0gdmFsdWUgPCAwID8gMCA6IHZhbHVlLCBuID0gZGVuO1xuICAgICAgICB2YXIgcG0gPSBzaWdtYSAqIE1hdGguc3FydChwICogKDEgLSBwKSAvIG4gKyBzaWdtYSAqIHNpZ21hIC8gKDQgKiBuICogbikpO1xuICAgICAgICB2YXIgZGVub20gPSAxICsgc2lnbWEgKiBzaWdtYSAvIGRlbjtcbiAgICAgICAgbG93ID0gKHAgKyBzaWdtYSAqIHNpZ21hIC8gKDIgKiBkZW4pIC0gcG0pIC8gZGVub207XG4gICAgICAgIGhpZ2ggPSAocCArIHNpZ21hICogc2lnbWEgLyAoMiAqIGRlbikgKyBwbSkgLyBkZW5vbTtcbiAgICAgICAgcm9sbGluZ0RhdGFbaV0gPSBbIGRhdGUsIHAgKiBtdWx0LFxuICAgICAgICAgICAgWyBsb3cgKiBtdWx0LCBoaWdoICogbXVsdCBdIF07XG4gICAgICB9IGVsc2Uge1xuICAgICAgICByb2xsaW5nRGF0YVtpXSA9IFsgZGF0ZSwgMCwgWyAwLCAwIF0gXTtcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgc3RkZGV2ID0gZGVuID8gc2lnbWEgKiBNYXRoLnNxcnQodmFsdWUgKiAoMSAtIHZhbHVlKSAvIGRlbikgOiAxLjA7XG4gICAgICByb2xsaW5nRGF0YVtpXSA9IFsgZGF0ZSwgbXVsdCAqIHZhbHVlLFxuICAgICAgICAgICAgICAgICAgICAgICAgIFsgbXVsdCAqICh2YWx1ZSAtIHN0ZGRldiksIG11bHQgKiAodmFsdWUgKyBzdGRkZXYpIF0gXTtcbiAgICB9XG4gIH1cblxuICByZXR1cm4gcm9sbGluZ0RhdGE7XG59O1xuXG5leHBvcnQgZGVmYXVsdCBGcmFjdGlvbnNCYXJzSGFuZGxlcjtcbiJdLCJtYXBwaW5ncyI6IkFBQUEsWUFBWTs7QUFFWjtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFBQUEsTUFB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