UNPKG

dygraphs

Version:

dygraphs is a fast, flexible open source JavaScript charting library.

112 lines (107 loc) 15.7 kB
'use strict'; /** * @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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