| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173 | /* * * (c) 2010-2019 Highsoft AS * * Author: Sebastian Domas * * License: www.highcharts.com/license */'use strict';import H from '../parts/Globals.js';import '../parts/Utilities.js';import derivedSeriesMixin from '../mixins/derived-series.js';var seriesType = H.seriesType,    correctFloat = H.correctFloat,    isNumber = H.isNumber,    merge = H.merge;/* ************************************************************************** * *  BELL CURVE                                                                * * ************************************************************************** */function mean(data) {    var length = data.length,        sum = data.reduce(function (sum, value) {            return (sum += value);        }, 0);    return length > 0 && sum / length;}function standardDeviation(data, average) {    var len = data.length,        sum;    average = isNumber(average) ? average : mean(data);    sum = data.reduce(function (sum, value) {        var diff = value - average;        return (sum += diff * diff);    }, 0);    return len > 1 && Math.sqrt(sum / (len - 1));}function normalDensity(x, mean, standardDeviation) {    var translation = x - mean;    return Math.exp(        -(translation * translation) /        (2 * standardDeviation * standardDeviation)    ) / (standardDeviation * Math.sqrt(2 * Math.PI));}/** * Bell curve class * * @private * @class * @name Highcharts.seriesTypes.bellcurve * * @augments Highcharts.Series * * @mixes DerivedSeriesMixin */seriesType('bellcurve', 'areaspline'    /** * A bell curve is an areaspline series which represents the probability density * function of the normal distribution. It calculates mean and standard * deviation of the base series data and plots the curve according to the * calculated parameters. * * @sample {highcharts} highcharts/demo/bellcurve/ *         Bell curve * * @extends      plotOptions.areaspline * @since        6.0.0 * @product      highcharts * @excluding    boostThreshold, connectNulls, stacking, pointInterval, *               pointIntervalUnit * @optionparent plotOptions.bellcurve */    , {        /**    * This option allows to define the length of the bell curve. A unit of the    * length of the bell curve is standard deviation.    *    * @sample highcharts/plotoptions/bellcurve-intervals-pointsininterval    *         Intervals and points in interval    */        intervals: 3,        /**    * Defines how many points should be plotted within 1 interval. See    * `plotOptions.bellcurve.intervals`.    *    * @sample highcharts/plotoptions/bellcurve-intervals-pointsininterval    *         Intervals and points in interval    */        pointsInInterval: 3,        marker: {            enabled: false        }    }, merge(derivedSeriesMixin, {        setMean: function () {            this.mean = correctFloat(mean(this.baseSeries.yData));        },        setStandardDeviation: function () {            this.standardDeviation = correctFloat(                standardDeviation(this.baseSeries.yData, this.mean)            );        },        setDerivedData: function () {            if (this.baseSeries.yData.length > 1) {                this.setMean();                this.setStandardDeviation();                this.setData(                    this.derivedData(this.mean, this.standardDeviation), false                );            }        },        derivedData: function (mean, standardDeviation) {            var intervals = this.options.intervals,                pointsInInterval = this.options.pointsInInterval,                x = mean - intervals * standardDeviation,                stop = intervals * pointsInInterval * 2 + 1,                increment = standardDeviation / pointsInInterval,                data = [],                i;            for (i = 0; i < stop; i++) {                data.push([x, normalDensity(x, mean, standardDeviation)]);                x += increment;            }            return data;        }    }));/** * A `bellcurve` series. If the [type](#series.bellcurve.type) option is not * specified, it is inherited from [chart.type](#chart.type). * * For options that apply to multiple series, it is recommended to add * them to the [plotOptions.series](#plotOptions.series) options structure. * To apply to all series of this specific type, apply it to * [plotOptions.bellcurve](#plotOptions.bellcurve). * * @extends   series,plotOptions.bellcurve * @since     6.0.0 * @product   highcharts * @excluding dataParser, dataURL, data * @apioption series.bellcurve *//** * An integer identifying the index to use for the base series, or a string * representing the id of the series. * * @type      {number|string} * @apioption series.bellcurve.baseSeries */
 |