define(function (require) { var quantile = require('./quantile'); var numberUtil = require('echarts').number; /** * Helper method for preparing data. * @param {Array.} rawData like * [ * [12,232,443], (raw data set for the first box) * [3843,5545,1232], (raw datat set for the second box) * ... * ] * @param {Object} [opt] * * @param {(number|string)} [opt.boundIQR=1.5] Data less than min bound is outlier. * default 1.5, means Q1 - 1.5 * (Q3 - Q1). * If pass 'none', min bound will not be used. * @param {(number|string)} [opt.layout='horizontal'] * Box plot layout, can be 'horizontal' or 'vertical' */ return function (rawData, opt) { opt = opt || []; var boxData = []; var outliers = []; var axisData = []; var boundIQR = opt.boundIQR; for (var i = 0; i < rawData.length; i++) { axisData.push(i + ''); var ascList = numberUtil.asc(rawData[i].slice()); var Q1 = quantile(ascList, 0.25); var Q2 = quantile(ascList, 0.5); var Q3 = quantile(ascList, 0.75); var IQR = Q3 - Q1; var low = boundIQR === 'none' ? ascList[0] : Q1 - (boundIQR == null ? 1.5 : boundIQR) * IQR; var high = boundIQR === 'none' ? ascList[ascList.length - 1] : Q3 + (boundIQR == null ? 1.5 : boundIQR) * IQR; boxData.push([low, Q1, Q2, Q3, high]); for (var j = 0; j < ascList.length; j++) { var dataItem = ascList[j]; if (dataItem < low || dataItem > high) { var outlier = [i, dataItem]; opt.layout === 'vertical' && outlier.reverse(); outliers.push(outlier); } } } return { boxData: boxData, outliers: outliers, axisData: axisData }; }; });