UNPKG

dygraphs

Version:

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

101 lines (95 loc) 12.9 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 errorBars option. * @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 BarsHandler */ var ErrorBarsHandler = function ErrorBarsHandler() {}; ErrorBarsHandler.prototype = new _bars["default"](); /** @inheritDoc */ ErrorBarsHandler.prototype.extractSeries = function (rawData, i, options) { // TODO(danvk): pre-allocate series here. var series = []; var x, y, variance, point; 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[0] - sigma * point[1] <= 0) { point = null; } } // Extract to the unified data format. if (point !== null) { y = point[0]; if (y !== null && !isNaN(y)) { variance = sigma * point[1]; // preserve original error value in extras for further // filtering series.push([x, y, [y - variance, y + variance, point[1]]]); } else { series.push([x, y, [y, y, y]]); } } else { series.push([x, null, [null, null, null]]); } } return series; }; /** @inheritDoc */ ErrorBarsHandler.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 i, j, y, v, sum, num_ok, stddev, variance, value; // Calculate the rolling average for the first rollPeriod - 1 points // where there is not enough data to roll over the full number of points for (i = 0; i < originalData.length; i++) { sum = 0; variance = 0; num_ok = 0; for (j = Math.max(0, i - rollPeriod + 1); j < i + 1; j++) { y = originalData[j][1]; if (y === null || isNaN(y)) continue; num_ok++; sum += y; variance += Math.pow(originalData[j][2][2], 2); } if (num_ok) { stddev = Math.sqrt(variance) / num_ok; value = sum / num_ok; rollingData[i] = [originalData[i][0], value, [value - sigma * stddev, value + sigma * stddev]]; } else { // This explicitly preserves NaNs to aid with "independent // series". // See testRollingAveragePreservesNaNs. v = rollPeriod == 1 ? originalData[i][1] : null; rollingData[i] = [originalData[i][0], v, [v, v]]; } } return rollingData; }; var _default = exports["default"] = ErrorBarsHandler; module.exports = exports.default; //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJPYmplY3QiLCJkZWZpbmVQcm9wZXJ0eSIsImV4cG9ydHMiLCJ2YWx1ZSIsIl9iYXJzIiwiX2ludGVyb3BSZXF1aXJlRGVmYXVsdCIsInJlcXVpcmUiLCJlIiwiX19lc01vZHVsZSIsIkVycm9yQmFyc0hhbmRsZXIiLCJwcm90b3R5cGUiLCJCYXJzSGFuZGxlciIsImV4dHJhY3RTZXJpZXMiLCJyYXdEYXRhIiwiaSIsIm9wdGlvbnMiLCJzZXJpZXMiLCJ4IiwieSIsInZhcmlhbmNlIiwicG9pbnQiLCJzZXJpZXNMYWJlbCIsImdldCIsImxvZ1NjYWxlIiwiZ2V0Rm9yU2VyaWVzIiwic2lnbWEiLCJqIiwibGVuZ3RoIiwiaXNOYU4iLCJwdXNoIiwicm9sbGluZ0F2ZXJhZ2UiLCJvcmlnaW5hbERhdGEiLCJyb2xsUGVyaW9kIiwiTWF0aCIsIm1pbiIsInJvbGxpbmdEYXRhIiwidiIsInN1bSIsIm51bV9vayIsInN0ZGRldiIsIm1heCIsInBvdyIsInNxcnQiLCJfZGVmYXVsdCIsIm1vZHVsZSIsImRlZmF1bHQiXSwic291cmNlcyI6WyIuLi8uLi9zcmMvZGF0YWhhbmRsZXIvYmFycy1lcnJvci5qcyJdLCJzb3VyY2VzQ29udGVudCI6WyIndXNlIHN0cmljdCc7XG5cbi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDEzIERhdmlkIEViZXJsZWluIChkYXZpZC5lYmVybGVpbkBjaC5zYXV0ZXItYmMuY29tKVxuICogTUlULWxpY2VuY2VkOiBodHRwczovL29wZW5zb3VyY2Uub3JnL2xpY2Vuc2UvTUlUXG4gKi9cblxuLyoqXG4gKiBAZmlsZW92ZXJ2aWV3IERhdGFIYW5kbGVyIGltcGxlbWVudGF0aW9uIGZvciB0aGUgZXJyb3JCYXJzIG9wdGlvbi5cbiAqIEBhdXRob3IgRGF2aWQgRWJlcmxlaW4gKGRhdmlkLmViZXJsZWluQGNoLnNhdXRlci1iYy5jb20pXG4gKi9cblxuLypnbG9iYWwgRHlncmFwaDpmYWxzZSAqL1xuXG5pbXBvcnQgQmFyc0hhbmRsZXIgZnJvbSAnLi9iYXJzJztcblxuLyoqXG4gKiBAY29uc3RydWN0b3JcbiAqIEBleHRlbmRzIEJhcnNIYW5kbGVyXG4gKi9cbnZhciBFcnJvckJhcnNIYW5kbGVyID0gZnVuY3Rpb24oKSB7XG59O1xuXG5FcnJvckJhcnNIYW5kbGVyLnByb3RvdHlwZSA9IG5ldyBCYXJzSGFuZGxlcigpO1xuXG4vKiogQGluaGVyaXREb2MgKi9cbkVycm9yQmFyc0hhbmRsZXIucHJvdG90eXBlLmV4dHJhY3RTZXJpZXMgPSBmdW5jdGlvbihyYXdEYXRhLCBpLCBvcHRpb25zKSB7XG4gIC8vIFRPRE8oZGFudmspOiBwcmUtYWxsb2NhdGUgc2VyaWVzIGhlcmUuXG4gIHZhciBzZXJpZXMgPSBbXTtcbiAgdmFyIHgsIHksIHZhcmlhbmNlLCBwb2ludDtcbiAgY29uc3Qgc2VyaWVzTGFiZWwgPSBvcHRpb25zLmdldChcImxhYmVsc1wiKVtpXTtcbiAgY29uc3QgbG9nU2NhbGUgPSBvcHRpb25zLmdldEZvclNlcmllcyhcImxvZ3NjYWxlXCIsIHNlcmllc0xhYmVsKTtcbiAgY29uc3Qgc2lnbWEgPSBvcHRpb25zLmdldEZvclNlcmllcyhcInNpZ21hXCIsIHNlcmllc0xhYmVsKTtcbiAgZm9yICggdmFyIGogPSAwOyBqIDwgcmF3RGF0YS5sZW5ndGg7IGorKykge1xuICAgIHggPSByYXdEYXRhW2pdWzBdO1xuICAgIHBvaW50ID0gcmF3RGF0YVtqXVtpXTtcbiAgICBpZiAobG9nU2NhbGUgJiYgcG9pbnQgIT09IG51bGwpIHtcbiAgICAgIC8vIE9uIHRoZSBsb2cgc2NhbGUsIHBvaW50cyBsZXNzIHRoYW4gemVybyBkbyBub3QgZXhpc3QuXG4gICAgICAvLyBUaGlzIHdpbGwgY3JlYXRlIGEgZ2FwIGluIHRoZSBjaGFydC5cbiAgICAgIGlmIChwb2ludFswXSA8PSAwIHx8IHBvaW50WzBdIC0gc2lnbWEgKiBwb2ludFsxXSA8PSAwKSB7XG4gICAgICAgIHBvaW50ID0gbnVsbDtcbiAgICAgIH1cbiAgICB9XG4gICAgLy8gRXh0cmFjdCB0byB0aGUgdW5pZmllZCBkYXRhIGZvcm1hdC5cbiAgICBpZiAocG9pbnQgIT09IG51bGwpIHtcbiAgICAgIHkgPSBwb2ludFswXTtcbiAgICAgIGlmICh5ICE9PSBudWxsICYmICFpc05hTih5KSkge1xuICAgICAgICB2YXJpYW5jZSA9IHNpZ21hICogcG9pbnRbMV07XG4gICAgICAgIC8vIHByZXNlcnZlIG9yaWdpbmFsIGVycm9yIHZhbHVlIGluIGV4dHJhcyBmb3IgZnVydGhlclxuICAgICAgICAvLyBmaWx0ZXJpbmdcbiAgICAgICAgc2VyaWVzLnB1c2goWyB4LCB5LCBbIHkgLSB2YXJpYW5jZSwgeSArIHZhcmlhbmNlLCBwb2ludFsxXSBdIF0pO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgc2VyaWVzLnB1c2goWyB4LCB5LCBbIHksIHksIHkgXSBdKTtcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgc2VyaWVzLnB1c2goWyB4LCBudWxsLCBbIG51bGwsIG51bGwsIG51bGwgXSBdKTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIHNlcmllcztcbn07XG5cbi8qKiBAaW5oZXJpdERvYyAqL1xuRXJyb3JCYXJzSGFuZGxlci5wcm90b3R5cGUucm9sbGluZ0F2ZXJhZ2UgPVxuICAgIGZ1bmN0aW9uKG9yaWdpbmFsRGF0YSwgcm9sbFBlcmlvZCwgb3B0aW9ucywgaSkge1xuICByb2xsUGVyaW9kID0gTWF0aC5taW4ocm9sbFBlcmlvZCwgb3JpZ2luYWxEYXRhLmxlbmd0aCk7XG4gIHZhciByb2xsaW5nRGF0YSA9IFtdO1xuICBjb25zdCBzZXJpZXNMYWJlbCA9IG9wdGlvbnMuZ2V0KFwibGFiZWxzXCIpW2ldO1xuICBjb25zdCBzaWdtYSA9IG9wdGlvbnMuZ2V0Rm9yU2VyaWVzKFwic2lnbWFcIiwgc2VyaWVzTGFiZWwpO1xuXG4gIHZhciBpLCBqLCB5LCB2LCBzdW0sIG51bV9vaywgc3RkZGV2LCB2YXJpYW5jZSwgdmFsdWU7XG5cbiAgLy8gQ2FsY3VsYXRlIHRoZSByb2xsaW5nIGF2ZXJhZ2UgZm9yIHRoZSBmaXJzdCByb2xsUGVyaW9kIC0gMSBwb2ludHNcbiAgLy8gd2hlcmUgdGhlcmUgaXMgbm90IGVub3VnaCBkYXRhIHRvIHJvbGwgb3ZlciB0aGUgZnVsbCBudW1iZXIgb2YgcG9pbnRzXG4gIGZvciAoaSA9IDA7IGkgPCBvcmlnaW5hbERhdGEubGVuZ3RoOyBpKyspIHtcbiAgICBzdW0gPSAwO1xuICAgIHZhcmlhbmNlID0gMDtcbiAgICBudW1fb2sgPSAwO1xuICAgIGZvciAoaiA9IE1hdGgubWF4KDAsIGkgLSByb2xsUGVyaW9kICsgMSk7IGogPCBpICsgMTsgaisrKSB7XG4gICAgICB5ID0gb3JpZ2luYWxEYXRhW2pdWzFdO1xuICAgICAgaWYgKHkgPT09IG51bGwgfHwgaXNOYU4oeSkpXG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgbnVtX29rKys7XG4gICAgICBzdW0gKz0geTtcbiAgICAgIHZhcmlhbmNlICs9IE1hdGgucG93KG9yaWdpbmFsRGF0YVtqXVsyXVsyXSwgMik7XG4gICAgfVxuICAgIGlmIChudW1fb2spIHtcbiAgICAgIHN0ZGRldiA9IE1hdGguc3FydCh2YXJpYW5jZSkgLyBudW1fb2s7XG4gICAgICB2YWx1ZSA9IHN1bSAvIG51bV9vaztcbiAgICAgIHJvbGxpbmdEYXRhW2ldID0gWyBvcmlnaW5hbERhdGFbaV1bMF0sIHZhbHVlLFxuICAgICAgICAgIFt2YWx1ZSAtIHNpZ21hICogc3RkZGV2LCB2YWx1ZSArIHNpZ21hICogc3RkZGV2XSBdO1xuICAgIH0gZWxzZSB7XG4gICAgICAvLyBUaGlzIGV4cGxpY2l0bHkgcHJlc2VydmVzIE5hTnMgdG8gYWlkIHdpdGggXCJpbmRlcGVuZGVudFxuICAgICAgLy8gc2VyaWVzXCIuXG4gICAgICAvLyBTZWUgdGVzdFJvbGxpbmdBdmVyYWdlUHJlc2VydmVzTmFOcy5cbiAgICAgIHYgPSAocm9sbFBlcmlvZCA9PSAxKSA/IG9yaWdpbmFsRGF0YVtpXVsxXSA6IG51bGw7XG4gICAgICByb2xsaW5nRGF0YVtpXSA9IFsgb3JpZ2luYWxEYXRhW2ldWzBdLCB2LCBbIHYsIHYgXSBdO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiByb2xsaW5nRGF0YTtcbn07XG5cbmV4cG9ydCBkZWZhdWx0IEVycm9yQmFyc0hhbmRsZXI7XG4iXSwibWFwcGluZ3MiOiJBQUFBLFlBQVk7O0FBRVo7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUFBQSxNQUFBLENBQUFDLGNBQUEsQ0FBQUMsT0FBQTtFQUFBQyxLQUFBO0FBQUE7QUFBQUQsT0FBQTtBQUVBLElBQUFFLEtBQUEsR0FBQUMsc0JBQUEsQ0FBQUMsT0FBQTtBQUFpQyxTQUFBRCx1QkFBQUUsQ0FBQSxXQUFBQSxDQUFBLElBQUFBLENBQUEsQ0FBQUMsVUFBQSxHQUFBRCxDQUFBLGdCQUFBQSxDQUFBO0FBRWpDO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsSUFBSUUsZ0JBQWdCLEdBQUcsU0FBbkJBLGdCQUFnQkEsQ0FBQSxFQUFjLENBQ2xDLENBQUM7QUFFREEsZ0JBQWdCLENBQUNDLFNBQVMsR0FBRyxJQUFJQyxnQkFBVyxDQUFDLENBQUM7O0FBRTlDO0FBQ0FGLGdCQUFnQixDQUFDQyxTQUFTLENBQUNFLGFBQWEsR0FBRyxVQUFTQyxPQUFPLEVBQUVDLENBQUMsRUFBRUMsT0FBTyxFQUFFO0VBQ3ZFO0VBQ0EsSUFBSUMsTUFBTSxHQUFHLEVBQUU7RUFDZixJQUFJQyxDQUFDLEVBQUVDLENBQUMsRUFBRUMsUUFBUSxFQUFFQyxLQUFLO0VBQ3pCLElBQU1DLFdBQVcsR0FBR04sT0FBTyxDQUFDTyxHQUFHLENBQUMsUUFBUSxDQUFDLENBQUNSLENBQUMsQ0FBQztFQUM1QyxJQUFNUyxRQUFRLEdBQUdSLE9BQU8sQ0FBQ1MsWUFBWSxDQUFDLFVBQVUsRUFBRUgsV0FBVyxDQUFDO0VBQzlELElBQU1JLEtBQUssR0FBR1YsT0FBTyxDQUFDUyxZQUFZLENBQUMsT0FBTyxFQUFFSCxXQUFXLENBQUM7RUFDeEQsS0FBTSxJQUFJSyxDQUFDLEdBQUcs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