2698 lines
62 KiB
JavaScript
2698 lines
62 KiB
JavaScript
![]() |
(function webpackUniversalModuleDefinition(root, factory) {
|
|||
|
if(typeof exports === 'object' && typeof module === 'object')
|
|||
|
module.exports = factory();
|
|||
|
else if(typeof define === 'function' && define.amd)
|
|||
|
define([], factory);
|
|||
|
else if(typeof exports === 'object')
|
|||
|
exports["scale"] = factory();
|
|||
|
else
|
|||
|
root["scale"] = factory();
|
|||
|
})(typeof self !== 'undefined' ? self : this, function() {
|
|||
|
return /******/ (function(modules) { // webpackBootstrap
|
|||
|
/******/ // The module cache
|
|||
|
/******/ var installedModules = {};
|
|||
|
/******/
|
|||
|
/******/ // The require function
|
|||
|
/******/ function __webpack_require__(moduleId) {
|
|||
|
/******/
|
|||
|
/******/ // Check if module is in cache
|
|||
|
/******/ if(installedModules[moduleId]) {
|
|||
|
/******/ return installedModules[moduleId].exports;
|
|||
|
/******/ }
|
|||
|
/******/ // Create a new module (and put it into the cache)
|
|||
|
/******/ var module = installedModules[moduleId] = {
|
|||
|
/******/ i: moduleId,
|
|||
|
/******/ l: false,
|
|||
|
/******/ exports: {}
|
|||
|
/******/ };
|
|||
|
/******/
|
|||
|
/******/ // Execute the module function
|
|||
|
/******/ modules[moduleId].call(module.exports, module, module.exports, __webpack_require__);
|
|||
|
/******/
|
|||
|
/******/ // Flag the module as loaded
|
|||
|
/******/ module.l = true;
|
|||
|
/******/
|
|||
|
/******/ // Return the exports of the module
|
|||
|
/******/ return module.exports;
|
|||
|
/******/ }
|
|||
|
/******/
|
|||
|
/******/
|
|||
|
/******/ // expose the modules object (__webpack_modules__)
|
|||
|
/******/ __webpack_require__.m = modules;
|
|||
|
/******/
|
|||
|
/******/ // expose the module cache
|
|||
|
/******/ __webpack_require__.c = installedModules;
|
|||
|
/******/
|
|||
|
/******/ // define getter function for harmony exports
|
|||
|
/******/ __webpack_require__.d = function(exports, name, getter) {
|
|||
|
/******/ if(!__webpack_require__.o(exports, name)) {
|
|||
|
/******/ Object.defineProperty(exports, name, {
|
|||
|
/******/ configurable: false,
|
|||
|
/******/ enumerable: true,
|
|||
|
/******/ get: getter
|
|||
|
/******/ });
|
|||
|
/******/ }
|
|||
|
/******/ };
|
|||
|
/******/
|
|||
|
/******/ // getDefaultExport function for compatibility with non-harmony modules
|
|||
|
/******/ __webpack_require__.n = function(module) {
|
|||
|
/******/ var getter = module && module.__esModule ?
|
|||
|
/******/ function getDefault() { return module['default']; } :
|
|||
|
/******/ function getModuleExports() { return module; };
|
|||
|
/******/ __webpack_require__.d(getter, 'a', getter);
|
|||
|
/******/ return getter;
|
|||
|
/******/ };
|
|||
|
/******/
|
|||
|
/******/ // Object.prototype.hasOwnProperty.call
|
|||
|
/******/ __webpack_require__.o = function(object, property) { return Object.prototype.hasOwnProperty.call(object, property); };
|
|||
|
/******/
|
|||
|
/******/ // __webpack_public_path__
|
|||
|
/******/ __webpack_require__.p = "";
|
|||
|
/******/
|
|||
|
/******/ // Load entry module and return exports
|
|||
|
/******/ return __webpack_require__(__webpack_require__.s = 13);
|
|||
|
/******/ })
|
|||
|
/************************************************************************/
|
|||
|
/******/ ([
|
|||
|
/* 0 */
|
|||
|
/***/ (function(module, exports, __webpack_require__) {
|
|||
|
|
|||
|
var mix = __webpack_require__(16);
|
|||
|
|
|||
|
var each = __webpack_require__(1);
|
|||
|
|
|||
|
var isObject = __webpack_require__(7);
|
|||
|
|
|||
|
var isNil = __webpack_require__(2);
|
|||
|
|
|||
|
var Scale = /*#__PURE__*/function () {
|
|||
|
var _proto = Scale.prototype;
|
|||
|
|
|||
|
_proto._initDefaultCfg = function _initDefaultCfg() {
|
|||
|
this.type = 'base';
|
|||
|
/**
|
|||
|
* 格式化函数,输出文本或者tick时的格式化函数
|
|||
|
* @type {Function}
|
|||
|
*/
|
|||
|
|
|||
|
this.formatter = null;
|
|||
|
/**
|
|||
|
* 输出的值域
|
|||
|
* @type {Array}
|
|||
|
*/
|
|||
|
|
|||
|
this.range = [0, 1];
|
|||
|
/**
|
|||
|
* 度量的标记
|
|||
|
* @type {Array}
|
|||
|
*/
|
|||
|
|
|||
|
this.ticks = null;
|
|||
|
/**
|
|||
|
* 参与度量计算的值,可选项
|
|||
|
* @type {Array}
|
|||
|
*/
|
|||
|
|
|||
|
this.values = [];
|
|||
|
};
|
|||
|
|
|||
|
function Scale(cfg) {
|
|||
|
this._initDefaultCfg();
|
|||
|
|
|||
|
mix(this, cfg);
|
|||
|
this.init();
|
|||
|
}
|
|||
|
/**
|
|||
|
* 度量初始化
|
|||
|
* @protected
|
|||
|
*/
|
|||
|
|
|||
|
|
|||
|
_proto.init = function init() {}
|
|||
|
/**
|
|||
|
* 获取该度量的ticks,返回的是多个对象,
|
|||
|
* - text: tick 的文本
|
|||
|
* - value: 对应的度量转换后的值
|
|||
|
* <code>
|
|||
|
* [
|
|||
|
* {text: 0,value:0}
|
|||
|
* {text: 1,value:0.2}
|
|||
|
* {text: 2,value:0.4}
|
|||
|
* {text: 3,value:0.6}
|
|||
|
* {text: 4,value:0.8}
|
|||
|
* {text: 5,value:1}
|
|||
|
* ]
|
|||
|
* </code>
|
|||
|
* @param {Number} count 输出tick的个数的近似值,默认是 10
|
|||
|
* @return {Array} 返回 ticks 数组
|
|||
|
*/
|
|||
|
;
|
|||
|
|
|||
|
_proto.getTicks = function getTicks() {
|
|||
|
var self = this;
|
|||
|
var ticks = self.ticks;
|
|||
|
var rst = [];
|
|||
|
each(ticks, function (tick) {
|
|||
|
var obj;
|
|||
|
|
|||
|
if (isObject(tick)) {
|
|||
|
obj = tick;
|
|||
|
} else {
|
|||
|
obj = {
|
|||
|
text: self.getText(tick),
|
|||
|
tickValue: tick,
|
|||
|
value: self.scale(tick)
|
|||
|
};
|
|||
|
}
|
|||
|
|
|||
|
rst.push(obj);
|
|||
|
});
|
|||
|
return rst;
|
|||
|
}
|
|||
|
/**
|
|||
|
* 获取格式化后的文本
|
|||
|
* @param {*} value 输入的数据
|
|||
|
* @param {*} key 字段的 key
|
|||
|
* @return {String} 格式化的文本
|
|||
|
*/
|
|||
|
;
|
|||
|
|
|||
|
_proto.getText = function getText(value, key) {
|
|||
|
var formatter = this.formatter;
|
|||
|
value = formatter ? formatter(value, key) : value;
|
|||
|
|
|||
|
if (isNil(value) || !value.toString) {
|
|||
|
value = '';
|
|||
|
}
|
|||
|
|
|||
|
return value.toString();
|
|||
|
}
|
|||
|
/**
|
|||
|
* 输出的值域最小值
|
|||
|
* @protected
|
|||
|
* @return {Number} 返回最小的值
|
|||
|
*/
|
|||
|
;
|
|||
|
|
|||
|
_proto.rangeMin = function rangeMin() {
|
|||
|
return this.range[0];
|
|||
|
}
|
|||
|
/**
|
|||
|
* 输出的值域最大值
|
|||
|
* @protected
|
|||
|
* @return {Number} 返回最大的值
|
|||
|
*/
|
|||
|
;
|
|||
|
|
|||
|
_proto.rangeMax = function rangeMax() {
|
|||
|
var range = this.range;
|
|||
|
return range[range.length - 1];
|
|||
|
}
|
|||
|
/**
|
|||
|
* 度量转换后的结果,翻转回输入域
|
|||
|
* @param {Number} value 需要翻转的数值
|
|||
|
* @return {*} 度量的输入值
|
|||
|
*/
|
|||
|
;
|
|||
|
|
|||
|
_proto.invert = function invert(value) {
|
|||
|
return value;
|
|||
|
}
|
|||
|
/**
|
|||
|
* 将传入的值从非数值转换成数值格式,如分类字符串、时间字符串等
|
|||
|
* @param {*} value 传入的值
|
|||
|
* @return {Number} 转换的值
|
|||
|
*/
|
|||
|
;
|
|||
|
|
|||
|
_proto.translate = function translate(value) {
|
|||
|
return value;
|
|||
|
}
|
|||
|
/**
|
|||
|
* 进行度量转换
|
|||
|
* @param {*} value 输入值
|
|||
|
* @return {Number} 输出值,在设定的输出值域之间,默认[0,1]
|
|||
|
*/
|
|||
|
;
|
|||
|
|
|||
|
_proto.scale = function scale(value) {
|
|||
|
return value;
|
|||
|
}
|
|||
|
/**
|
|||
|
* 克隆一个新的scale,拥有跟当前scale相同的输入域、输出域等
|
|||
|
* @return {Scale} 克隆的度量
|
|||
|
*/
|
|||
|
;
|
|||
|
|
|||
|
_proto.clone = function clone() {
|
|||
|
var self = this;
|
|||
|
var constr = self.constructor;
|
|||
|
var cfg = {};
|
|||
|
each(self, function (v, k) {
|
|||
|
cfg[k] = self[k];
|
|||
|
});
|
|||
|
return new constr(cfg);
|
|||
|
}
|
|||
|
/**
|
|||
|
* 更改度量的属性信息
|
|||
|
* @param {Object} info 属性信息
|
|||
|
* @chainable
|
|||
|
* @return {Scale} 返回自身的引用
|
|||
|
*/
|
|||
|
;
|
|||
|
|
|||
|
_proto.change = function change(info) {
|
|||
|
this.ticks = null;
|
|||
|
mix(this, info);
|
|||
|
this.init();
|
|||
|
return this;
|
|||
|
};
|
|||
|
|
|||
|
return Scale;
|
|||
|
}();
|
|||
|
|
|||
|
module.exports = Scale;
|
|||
|
|
|||
|
/***/ }),
|
|||
|
/* 1 */
|
|||
|
/***/ (function(module, exports, __webpack_require__) {
|
|||
|
|
|||
|
var isObject = __webpack_require__(7);
|
|||
|
|
|||
|
var isArray = __webpack_require__(17);
|
|||
|
|
|||
|
var each = function each(elements, func) {
|
|||
|
if (!elements) {
|
|||
|
return;
|
|||
|
}
|
|||
|
|
|||
|
var rst = void 0;
|
|||
|
|
|||
|
if (isArray(elements)) {
|
|||
|
for (var i = 0, len = elements.length; i < len; i++) {
|
|||
|
rst = func(elements[i], i);
|
|||
|
|
|||
|
if (rst === false) {
|
|||
|
break;
|
|||
|
}
|
|||
|
}
|
|||
|
} else if (isObject(elements)) {
|
|||
|
for (var k in elements) {
|
|||
|
if (elements.hasOwnProperty(k)) {
|
|||
|
rst = func(elements[k], k);
|
|||
|
|
|||
|
if (rst === false) {
|
|||
|
break;
|
|||
|
}
|
|||
|
}
|
|||
|
}
|
|||
|
}
|
|||
|
};
|
|||
|
|
|||
|
module.exports = each;
|
|||
|
|
|||
|
/***/ }),
|
|||
|
/* 2 */
|
|||
|
/***/ (function(module, exports) {
|
|||
|
|
|||
|
// isFinite,
|
|||
|
var isNil = function isNil(value) {
|
|||
|
/**
|
|||
|
* isNil(null) => true
|
|||
|
* isNil() => true
|
|||
|
*/
|
|||
|
return value === null || value === undefined;
|
|||
|
};
|
|||
|
|
|||
|
module.exports = isNil;
|
|||
|
|
|||
|
/***/ }),
|
|||
|
/* 3 */
|
|||
|
/***/ (function(module, exports) {
|
|||
|
|
|||
|
var toString = {}.toString;
|
|||
|
|
|||
|
var isType = function isType(value, type) {
|
|||
|
return toString.call(value) === '[object ' + type + ']';
|
|||
|
};
|
|||
|
|
|||
|
module.exports = isType;
|
|||
|
|
|||
|
/***/ }),
|
|||
|
/* 4 */
|
|||
|
/***/ (function(module, exports, __webpack_require__) {
|
|||
|
|
|||
|
function _inheritsLoose(subClass, superClass) { subClass.prototype = Object.create(superClass.prototype); subClass.prototype.constructor = subClass; subClass.__proto__ = superClass; }
|
|||
|
|
|||
|
/**
|
|||
|
* @fileOverview The measurement of linear data scale function
|
|||
|
* @author dxq613@gmail.com
|
|||
|
*/
|
|||
|
var isNil = __webpack_require__(2);
|
|||
|
|
|||
|
var each = __webpack_require__(1);
|
|||
|
|
|||
|
var Base = __webpack_require__(0);
|
|||
|
|
|||
|
var numberAuto = __webpack_require__(18);
|
|||
|
/**
|
|||
|
* 线性度量
|
|||
|
* @class Scale.Linear
|
|||
|
*/
|
|||
|
|
|||
|
|
|||
|
var Linear = /*#__PURE__*/function (_Base) {
|
|||
|
_inheritsLoose(Linear, _Base);
|
|||
|
|
|||
|
function Linear() {
|
|||
|
return _Base.apply(this, arguments) || this;
|
|||
|
}
|
|||
|
|
|||
|
var _proto = Linear.prototype;
|
|||
|
|
|||
|
_proto._initDefaultCfg = function _initDefaultCfg() {
|
|||
|
_Base.prototype._initDefaultCfg.call(this);
|
|||
|
|
|||
|
var self = this;
|
|||
|
self.type = 'linear';
|
|||
|
self.isLinear = true;
|
|||
|
/**
|
|||
|
* 是否为了用户习惯,优化min,max和ticks,如果进行优化,则会根据生成的ticks调整min,max,否则舍弃(min,max)范围之外的ticks
|
|||
|
* @type {Boolean}
|
|||
|
* @default false
|
|||
|
*/
|
|||
|
|
|||
|
self.nice = false;
|
|||
|
/**
|
|||
|
* min value of the scale
|
|||
|
* @type {Number}
|
|||
|
* @default null
|
|||
|
*/
|
|||
|
|
|||
|
self.min = null;
|
|||
|
/**
|
|||
|
* min value limitted of the scale
|
|||
|
* @type {Number}
|
|||
|
* @default null
|
|||
|
*/
|
|||
|
|
|||
|
self.minLimit = null;
|
|||
|
/**
|
|||
|
* max value of the scale
|
|||
|
* @type {Number}
|
|||
|
* @default null
|
|||
|
*/
|
|||
|
|
|||
|
self.max = null;
|
|||
|
/**
|
|||
|
* max value limitted of the scale
|
|||
|
* @type {Number}
|
|||
|
* @default null
|
|||
|
*/
|
|||
|
|
|||
|
self.maxLimit = null;
|
|||
|
/**
|
|||
|
* 自动生成标记时的个数
|
|||
|
* @type {Number}
|
|||
|
* @default null
|
|||
|
*/
|
|||
|
|
|||
|
self.tickCount = null;
|
|||
|
/**
|
|||
|
* 坐标轴点之间的间距,指的是真实数据的差值
|
|||
|
* @type {Number}
|
|||
|
* @default null
|
|||
|
*/
|
|||
|
|
|||
|
self.tickInterval = null;
|
|||
|
/**
|
|||
|
* 坐标轴点之间的最小间距,指的是真实数据的差值
|
|||
|
* @type {Number}
|
|||
|
* @default null
|
|||
|
*/
|
|||
|
|
|||
|
self.minTickInterval = null;
|
|||
|
/**
|
|||
|
* 用于计算坐标点时逼近的数组
|
|||
|
* @type {Array}
|
|||
|
*/
|
|||
|
|
|||
|
self.snapArray = null;
|
|||
|
}
|
|||
|
/**
|
|||
|
* @protected
|
|||
|
* @override
|
|||
|
*/
|
|||
|
;
|
|||
|
|
|||
|
_proto.init = function init() {
|
|||
|
var self = this;
|
|||
|
|
|||
|
if (!self.ticks) {
|
|||
|
self.min = self.translate(self.min);
|
|||
|
self.max = self.translate(self.max);
|
|||
|
self.initTicks();
|
|||
|
} else {
|
|||
|
var ticks = self.ticks;
|
|||
|
var firstValue = self.translate(ticks[0]);
|
|||
|
var lastValue = self.translate(ticks[ticks.length - 1]);
|
|||
|
|
|||
|
if (isNil(self.min) || self.min > firstValue) {
|
|||
|
self.min = firstValue;
|
|||
|
}
|
|||
|
|
|||
|
if (isNil(self.max) || self.max < lastValue) {
|
|||
|
self.max = lastValue;
|
|||
|
}
|
|||
|
}
|
|||
|
}
|
|||
|
/**
|
|||
|
* 计算坐标点
|
|||
|
* @protected
|
|||
|
* @return {Array} 计算完成的坐标点
|
|||
|
*/
|
|||
|
;
|
|||
|
|
|||
|
_proto.calculateTicks = function calculateTicks() {
|
|||
|
var min = this.min,
|
|||
|
max = this.max,
|
|||
|
minLimit = this.minLimit,
|
|||
|
maxLimit = this.maxLimit,
|
|||
|
tickCount = this.tickCount,
|
|||
|
tickInterval = this.tickInterval,
|
|||
|
minTickInterval = this.minTickInterval,
|
|||
|
snapArray = this.snapArray;
|
|||
|
|
|||
|
if (tickCount === 1) {
|
|||
|
throw new Error('linear scale\'tickCount should not be 1');
|
|||
|
}
|
|||
|
|
|||
|
if (max < min) {
|
|||
|
throw new Error("max: " + max + " should not be less than min: " + min);
|
|||
|
}
|
|||
|
|
|||
|
var tmp = numberAuto({
|
|||
|
min: min,
|
|||
|
max: max,
|
|||
|
minLimit: minLimit,
|
|||
|
maxLimit: maxLimit,
|
|||
|
minCount: tickCount,
|
|||
|
maxCount: tickCount,
|
|||
|
interval: tickInterval,
|
|||
|
minTickInterval: minTickInterval,
|
|||
|
snapArray: snapArray
|
|||
|
});
|
|||
|
return tmp.ticks;
|
|||
|
} // 初始化ticks
|
|||
|
;
|
|||
|
|
|||
|
_proto.initTicks = function initTicks() {
|
|||
|
var self = this;
|
|||
|
var calTicks = self.calculateTicks();
|
|||
|
|
|||
|
if (self.nice) {
|
|||
|
// 如果需要优化显示的tick
|
|||
|
self.ticks = calTicks;
|
|||
|
self.min = calTicks[0];
|
|||
|
self.max = calTicks[calTicks.length - 1];
|
|||
|
} else {
|
|||
|
var ticks = [];
|
|||
|
each(calTicks, function (tick) {
|
|||
|
if (tick >= self.min && tick <= self.max) {
|
|||
|
ticks.push(tick);
|
|||
|
}
|
|||
|
}); // 如果 ticks 为空,直接输入最小值、最大值
|
|||
|
|
|||
|
if (!ticks.length) {
|
|||
|
ticks.push(self.min);
|
|||
|
ticks.push(self.max);
|
|||
|
}
|
|||
|
|
|||
|
self.ticks = ticks;
|
|||
|
}
|
|||
|
}
|
|||
|
/**
|
|||
|
* @override
|
|||
|
*/
|
|||
|
;
|
|||
|
|
|||
|
_proto.scale = function scale(value) {
|
|||
|
if (isNil(value)) {
|
|||
|
return NaN;
|
|||
|
}
|
|||
|
|
|||
|
var max = this.max;
|
|||
|
var min = this.min;
|
|||
|
|
|||
|
if (max === min) {
|
|||
|
return 0;
|
|||
|
}
|
|||
|
|
|||
|
var percent = (value - min) / (max - min);
|
|||
|
var rangeMin = this.rangeMin();
|
|||
|
var rangeMax = this.rangeMax();
|
|||
|
return rangeMin + percent * (rangeMax - rangeMin);
|
|||
|
}
|
|||
|
/**
|
|||
|
* @override
|
|||
|
*/
|
|||
|
;
|
|||
|
|
|||
|
_proto.invert = function invert(value) {
|
|||
|
var percent = (value - this.rangeMin()) / (this.rangeMax() - this.rangeMin());
|
|||
|
return this.min + percent * (this.max - this.min);
|
|||
|
};
|
|||
|
|
|||
|
return Linear;
|
|||
|
}(Base);
|
|||
|
|
|||
|
Base.Linear = Linear;
|
|||
|
module.exports = Linear;
|
|||
|
|
|||
|
/***/ }),
|
|||
|
/* 5 */
|
|||
|
/***/ (function(module, exports, __webpack_require__) {
|
|||
|
|
|||
|
/**
|
|||
|
* 判断是否数字
|
|||
|
* @return {Boolean} 是否数字
|
|||
|
*/
|
|||
|
var isType = __webpack_require__(3);
|
|||
|
|
|||
|
var isNumber = function isNumber(value) {
|
|||
|
return isType(value, 'Number');
|
|||
|
};
|
|||
|
|
|||
|
module.exports = isNumber;
|
|||
|
|
|||
|
/***/ }),
|
|||
|
/* 6 */
|
|||
|
/***/ (function(module, exports, __webpack_require__) {
|
|||
|
|
|||
|
var isType = __webpack_require__(3);
|
|||
|
|
|||
|
var isString = function isString(str) {
|
|||
|
return isType(str, 'String');
|
|||
|
};
|
|||
|
|
|||
|
module.exports = isString;
|
|||
|
|
|||
|
/***/ }),
|
|||
|
/* 7 */
|
|||
|
/***/ (function(module, exports) {
|
|||
|
|
|||
|
var _typeof = typeof Symbol === "function" && typeof Symbol.iterator === "symbol" ? function (obj) {
|
|||
|
return typeof obj;
|
|||
|
} : function (obj) {
|
|||
|
return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj;
|
|||
|
};
|
|||
|
|
|||
|
var isObject = function isObject(value) {
|
|||
|
/**
|
|||
|
* isObject({}) => true
|
|||
|
* isObject([1, 2, 3]) => true
|
|||
|
* isObject(Function) => true
|
|||
|
* isObject(null) => false
|
|||
|
*/
|
|||
|
var type = typeof value === 'undefined' ? 'undefined' : _typeof(value);
|
|||
|
return value !== null && type === 'object' || type === 'function';
|
|||
|
};
|
|||
|
|
|||
|
module.exports = isObject;
|
|||
|
|
|||
|
/***/ }),
|
|||
|
/* 8 */
|
|||
|
/***/ (function(module, exports) {
|
|||
|
|
|||
|
/**
|
|||
|
* @fileOverview 计算方法
|
|||
|
* @author dxq613@gmail.com
|
|||
|
*/
|
|||
|
// 如果小数点后面超过 10 位浮点数时进行一下处理
|
|||
|
var DECIMAL_LENGTH = 12; // 获取系数
|
|||
|
|
|||
|
function getFactor(v) {
|
|||
|
var factor = 1;
|
|||
|
|
|||
|
if (v === Infinity || v === -Infinity) {
|
|||
|
throw new Error('Not support Infinity!');
|
|||
|
}
|
|||
|
|
|||
|
if (v < 1) {
|
|||
|
var count = 0;
|
|||
|
|
|||
|
while (v < 1) {
|
|||
|
factor = factor / 10;
|
|||
|
v = v * 10;
|
|||
|
count++;
|
|||
|
} // 浮点数计算出现问题
|
|||
|
|
|||
|
|
|||
|
if (factor.toString().length > DECIMAL_LENGTH) {
|
|||
|
factor = parseFloat(factor.toFixed(count));
|
|||
|
}
|
|||
|
} else {
|
|||
|
while (v > 10) {
|
|||
|
factor = factor * 10;
|
|||
|
v = v / 10;
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
return factor;
|
|||
|
} // 取小于当前值的
|
|||
|
|
|||
|
|
|||
|
function arrayFloor(values, value) {
|
|||
|
var length = values.length;
|
|||
|
|
|||
|
if (length === 0) {
|
|||
|
return NaN;
|
|||
|
}
|
|||
|
|
|||
|
var pre = values[0];
|
|||
|
|
|||
|
if (value < values[0]) {
|
|||
|
return NaN;
|
|||
|
}
|
|||
|
|
|||
|
if (value >= values[length - 1]) {
|
|||
|
return values[length - 1];
|
|||
|
}
|
|||
|
|
|||
|
for (var i = 1; i < values.length; i++) {
|
|||
|
if (value < values[i]) {
|
|||
|
break;
|
|||
|
}
|
|||
|
|
|||
|
pre = values[i];
|
|||
|
}
|
|||
|
|
|||
|
return pre;
|
|||
|
} // 大于当前值的第一个
|
|||
|
|
|||
|
|
|||
|
function arrayCeiling(values, value) {
|
|||
|
var length = values.length;
|
|||
|
|
|||
|
if (length === 0) {
|
|||
|
return NaN;
|
|||
|
} // var pre = values[0];
|
|||
|
|
|||
|
|
|||
|
var rst;
|
|||
|
|
|||
|
if (value > values[length - 1]) {
|
|||
|
return NaN;
|
|||
|
}
|
|||
|
|
|||
|
if (value < values[0]) {
|
|||
|
return values[0];
|
|||
|
}
|
|||
|
|
|||
|
for (var i = 1; i < values.length; i++) {
|
|||
|
if (value <= values[i]) {
|
|||
|
rst = values[i];
|
|||
|
break;
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
return rst;
|
|||
|
}
|
|||
|
|
|||
|
var Util = {
|
|||
|
// 获取逼近的数值
|
|||
|
snapFactorTo: function snapFactorTo(v, arr, snapType) {
|
|||
|
// 假设 v = -512,isFloor = true
|
|||
|
if (isNaN(v)) {
|
|||
|
return NaN;
|
|||
|
}
|
|||
|
|
|||
|
var factor = 1; // 计算系数
|
|||
|
|
|||
|
if (v !== 0) {
|
|||
|
if (v < 0) {
|
|||
|
factor = -1;
|
|||
|
}
|
|||
|
|
|||
|
v = v * factor; // v = 512
|
|||
|
|
|||
|
var tmpFactor = getFactor(v);
|
|||
|
factor = factor * tmpFactor; // factor = -100
|
|||
|
|
|||
|
v = v / tmpFactor; // v = 5.12
|
|||
|
}
|
|||
|
|
|||
|
if (snapType === 'floor') {
|
|||
|
v = Util.snapFloor(arr, v); // v = 5
|
|||
|
} else if (snapType === 'ceil') {
|
|||
|
v = Util.snapCeiling(arr, v); // v = 6
|
|||
|
} else {
|
|||
|
v = Util.snapTo(arr, v); // 四舍五入 5
|
|||
|
}
|
|||
|
|
|||
|
var rst = parseFloat((v * factor).toPrecision(DECIMAL_LENGTH)); // 如果出现浮点数计算问题,需要处理一下
|
|||
|
// 如果出现浮点数计算问题,需要处理一下
|
|||
|
|
|||
|
if (Math.abs(factor) < 1 && rst.toString().length > DECIMAL_LENGTH) {
|
|||
|
var decimalVal = parseInt(1 / factor);
|
|||
|
var symbol = factor > 0 ? 1 : -1;
|
|||
|
rst = v / decimalVal * symbol;
|
|||
|
}
|
|||
|
|
|||
|
return rst;
|
|||
|
},
|
|||
|
// 获取逼近的倍数
|
|||
|
snapMultiple: function snapMultiple(v, base, snapType) {
|
|||
|
var div;
|
|||
|
|
|||
|
if (snapType === 'ceil') {
|
|||
|
div = Math.ceil(v / base);
|
|||
|
} else if (snapType === 'floor') {
|
|||
|
div = Math.floor(v / base);
|
|||
|
} else {
|
|||
|
div = Math.round(v / base);
|
|||
|
}
|
|||
|
|
|||
|
return div * base;
|
|||
|
},
|
|||
|
|
|||
|
/**
|
|||
|
* 获取逼近的值,用于对齐数据
|
|||
|
* @param {Array} values 数据集合
|
|||
|
* @param {Number} value 数值
|
|||
|
* @return {Number} 逼近的值
|
|||
|
*/
|
|||
|
snapTo: function snapTo(values, value) {
|
|||
|
// 这里假定values是升序排列
|
|||
|
var floorVal = arrayFloor(values, value);
|
|||
|
var ceilingVal = arrayCeiling(values, value);
|
|||
|
|
|||
|
if (isNaN(floorVal) || isNaN(ceilingVal)) {
|
|||
|
if (values[0] >= value) {
|
|||
|
return values[0];
|
|||
|
}
|
|||
|
|
|||
|
var last = values[values.length - 1];
|
|||
|
|
|||
|
if (last <= value) {
|
|||
|
return last;
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
if (Math.abs(value - floorVal) < Math.abs(ceilingVal - value)) {
|
|||
|
return floorVal;
|
|||
|
}
|
|||
|
|
|||
|
return ceilingVal;
|
|||
|
},
|
|||
|
|
|||
|
/**
|
|||
|
* 获取逼近的最小值,用于对齐数据
|
|||
|
* @param {Array} values 数据集合
|
|||
|
* @param {Number} value 数值
|
|||
|
* @return {Number} 逼近的最小值
|
|||
|
*/
|
|||
|
snapFloor: function snapFloor(values, value) {
|
|||
|
// 这里假定values是升序排列
|
|||
|
return arrayFloor(values, value);
|
|||
|
},
|
|||
|
|
|||
|
/**
|
|||
|
* 获取逼近的最大值,用于对齐数据
|
|||
|
* @param {Array} values 数据集合
|
|||
|
* @param {Number} value 数值
|
|||
|
* @return {Number} 逼近的最大值
|
|||
|
*/
|
|||
|
snapCeiling: function snapCeiling(values, value) {
|
|||
|
// 这里假定values是升序排列
|
|||
|
return arrayCeiling(values, value);
|
|||
|
},
|
|||
|
fixedBase: function fixedBase(v, base) {
|
|||
|
var str = base.toString();
|
|||
|
var index = str.indexOf('.');
|
|||
|
var indexOfExp = str.indexOf('e-'); // 判断是否带小数点,1.000001 1.23e-9
|
|||
|
|
|||
|
if (index < 0 && indexOfExp < 0) {
|
|||
|
// base为整数
|
|||
|
return Math.round(v);
|
|||
|
}
|
|||
|
|
|||
|
var length = indexOfExp >= 0 ? parseInt(str.substr(indexOfExp + 2), 10) : str.substr(index + 1).length;
|
|||
|
|
|||
|
if (length > 20) {
|
|||
|
length = 20;
|
|||
|
}
|
|||
|
|
|||
|
return parseFloat(v.toFixed(length));
|
|||
|
}
|
|||
|
};
|
|||
|
module.exports = Util;
|
|||
|
|
|||
|
/***/ }),
|
|||
|
/* 9 */
|
|||
|
/***/ (function(module, exports, __webpack_require__) {
|
|||
|
|
|||
|
function _inheritsLoose(subClass, superClass) { subClass.prototype = Object.create(superClass.prototype); subClass.prototype.constructor = subClass; subClass.__proto__ = superClass; }
|
|||
|
|
|||
|
var Base = __webpack_require__(0);
|
|||
|
|
|||
|
var catAuto = __webpack_require__(10);
|
|||
|
|
|||
|
var each = __webpack_require__(1);
|
|||
|
|
|||
|
var isNumber = __webpack_require__(5);
|
|||
|
|
|||
|
var isString = __webpack_require__(6);
|
|||
|
|
|||
|
var Category = /*#__PURE__*/function (_Base) {
|
|||
|
_inheritsLoose(Category, _Base);
|
|||
|
|
|||
|
function Category() {
|
|||
|
return _Base.apply(this, arguments) || this;
|
|||
|
}
|
|||
|
|
|||
|
var _proto = Category.prototype;
|
|||
|
|
|||
|
_proto._initDefaultCfg = function _initDefaultCfg() {
|
|||
|
_Base.prototype._initDefaultCfg.call(this);
|
|||
|
|
|||
|
this.type = 'cat';
|
|||
|
/**
|
|||
|
* 是否分类度量
|
|||
|
* @type {Boolean}
|
|||
|
*/
|
|||
|
|
|||
|
this.isCategory = true;
|
|||
|
this.isRounding = true; // 是否进行取整操作
|
|||
|
}
|
|||
|
/**
|
|||
|
* @override
|
|||
|
*/
|
|||
|
;
|
|||
|
|
|||
|
_proto.init = function init() {
|
|||
|
var self = this;
|
|||
|
var values = self.values;
|
|||
|
var tickCount = self.tickCount;
|
|||
|
each(values, function (v, i) {
|
|||
|
values[i] = v.toString();
|
|||
|
});
|
|||
|
|
|||
|
if (!self.ticks) {
|
|||
|
var ticks = values;
|
|||
|
|
|||
|
if (tickCount) {
|
|||
|
var temp = catAuto({
|
|||
|
maxCount: tickCount,
|
|||
|
data: values,
|
|||
|
isRounding: self.isRounding
|
|||
|
});
|
|||
|
ticks = temp.ticks;
|
|||
|
}
|
|||
|
|
|||
|
this.ticks = ticks;
|
|||
|
}
|
|||
|
}
|
|||
|
/**
|
|||
|
* @override
|
|||
|
*/
|
|||
|
;
|
|||
|
|
|||
|
_proto.getText = function getText(value) {
|
|||
|
if (this.values.indexOf(value) === -1 && isNumber(value)) {
|
|||
|
value = this.values[Math.round(value)];
|
|||
|
}
|
|||
|
|
|||
|
return _Base.prototype.getText.call(this, value);
|
|||
|
}
|
|||
|
/**
|
|||
|
* @override
|
|||
|
*/
|
|||
|
;
|
|||
|
|
|||
|
_proto.translate = function translate(value) {
|
|||
|
var index = this.values.indexOf(value);
|
|||
|
|
|||
|
if (index === -1 && isNumber(value)) {
|
|||
|
index = value;
|
|||
|
} else if (index === -1) {
|
|||
|
index = NaN;
|
|||
|
}
|
|||
|
|
|||
|
return index;
|
|||
|
}
|
|||
|
/**
|
|||
|
* @override
|
|||
|
*/
|
|||
|
;
|
|||
|
|
|||
|
_proto.scale = function scale(value) {
|
|||
|
var rangeMin = this.rangeMin();
|
|||
|
var rangeMax = this.rangeMax();
|
|||
|
var percent;
|
|||
|
|
|||
|
if (isString(value) || this.values.indexOf(value) !== -1) {
|
|||
|
value = this.translate(value);
|
|||
|
}
|
|||
|
|
|||
|
if (this.values.length > 1) {
|
|||
|
percent = value / (this.values.length - 1);
|
|||
|
} else {
|
|||
|
percent = value;
|
|||
|
}
|
|||
|
|
|||
|
return rangeMin + percent * (rangeMax - rangeMin);
|
|||
|
}
|
|||
|
/**
|
|||
|
* @override
|
|||
|
*/
|
|||
|
;
|
|||
|
|
|||
|
_proto.invert = function invert(value) {
|
|||
|
if (isString(value)) {
|
|||
|
// 如果已经是字符串
|
|||
|
return value;
|
|||
|
}
|
|||
|
|
|||
|
var min = this.rangeMin();
|
|||
|
var max = this.rangeMax(); // 归一到 范围内
|
|||
|
|
|||
|
if (value < min) {
|
|||
|
value = min;
|
|||
|
}
|
|||
|
|
|||
|
if (value > max) {
|
|||
|
value = max;
|
|||
|
}
|
|||
|
|
|||
|
var percent = (value - min) / (max - min);
|
|||
|
var index = Math.round(percent * (this.values.length - 1)) % this.values.length;
|
|||
|
index = index || 0;
|
|||
|
return this.values[index];
|
|||
|
};
|
|||
|
|
|||
|
return Category;
|
|||
|
}(Base);
|
|||
|
|
|||
|
Base.Cat = Category;
|
|||
|
module.exports = Category;
|
|||
|
|
|||
|
/***/ }),
|
|||
|
/* 10 */
|
|||
|
/***/ (function(module, exports, __webpack_require__) {
|
|||
|
|
|||
|
/**
|
|||
|
* @fileOverview 计算分类的的坐标点
|
|||
|
* @author dxq613@gmail.com
|
|||
|
*/
|
|||
|
var each = __webpack_require__(1);
|
|||
|
|
|||
|
var MAX_COUNT = 8;
|
|||
|
var SUB_COUNT = 4; // 控制个数不能过小
|
|||
|
|
|||
|
function getSimpleArray(data) {
|
|||
|
var arr = [];
|
|||
|
each(data, function (sub) {
|
|||
|
arr = arr.concat(sub);
|
|||
|
});
|
|||
|
return arr;
|
|||
|
}
|
|||
|
|
|||
|
function getGreatestFactor(count, number) {
|
|||
|
var i;
|
|||
|
|
|||
|
for (i = number; i > 0; i--) {
|
|||
|
if (count % i === 0) {
|
|||
|
break;
|
|||
|
}
|
|||
|
} // 如果是素数,没有可以整除的数字
|
|||
|
|
|||
|
|
|||
|
if (i === 1) {
|
|||
|
for (i = number; i > 0; i--) {
|
|||
|
if ((count - 1) % i === 0) {
|
|||
|
break;
|
|||
|
}
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
return i;
|
|||
|
}
|
|||
|
|
|||
|
module.exports = function (info) {
|
|||
|
var rst = {};
|
|||
|
var ticks = [];
|
|||
|
var isRounding = info.isRounding;
|
|||
|
var categories = getSimpleArray(info.data);
|
|||
|
var length = categories.length;
|
|||
|
var maxCount = info.maxCount || MAX_COUNT;
|
|||
|
var tickCount;
|
|||
|
|
|||
|
if (isRounding) {
|
|||
|
// 取整操作
|
|||
|
tickCount = getGreatestFactor(length - 1, maxCount - 1) + 1; // 如果计算出来只有两个坐标点,则直接使用传入的 maxCount
|
|||
|
|
|||
|
if (tickCount === 2) {
|
|||
|
tickCount = maxCount;
|
|||
|
} else if (tickCount < maxCount - SUB_COUNT) {
|
|||
|
tickCount = maxCount - SUB_COUNT;
|
|||
|
}
|
|||
|
} else {
|
|||
|
tickCount = maxCount;
|
|||
|
}
|
|||
|
|
|||
|
if (!isRounding && length <= tickCount + tickCount / 2) {
|
|||
|
ticks = [].concat(categories);
|
|||
|
} else {
|
|||
|
var step = parseInt(length / (tickCount - 1), 10);
|
|||
|
var groups = categories.map(function (e, i) {
|
|||
|
return i % step === 0 ? categories.slice(i, i + step) : null;
|
|||
|
}).filter(function (e) {
|
|||
|
return e;
|
|||
|
});
|
|||
|
|
|||
|
for (var i = 1, groupLen = groups.length; i < groupLen && (isRounding ? i * step < length - step : i < tickCount - 1); i++) {
|
|||
|
ticks.push(groups[i][0]);
|
|||
|
}
|
|||
|
|
|||
|
if (categories.length) {
|
|||
|
ticks.unshift(categories[0]);
|
|||
|
var last = categories[length - 1];
|
|||
|
|
|||
|
if (ticks.indexOf(last) === -1) {
|
|||
|
ticks.push(last);
|
|||
|
}
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
rst.categories = categories;
|
|||
|
rst.ticks = ticks;
|
|||
|
return rst;
|
|||
|
};
|
|||
|
|
|||
|
/***/ }),
|
|||
|
/* 11 */
|
|||
|
/***/ (function(module, exports, __webpack_require__) {
|
|||
|
|
|||
|
var __WEBPACK_AMD_DEFINE_RESULT__;(function (main) {
|
|||
|
'use strict';
|
|||
|
/**
|
|||
|
* Parse or format dates
|
|||
|
* @class fecha
|
|||
|
*/
|
|||
|
|
|||
|
var fecha = {};
|
|||
|
var token = /d{1,4}|M{1,4}|YY(?:YY)?|S{1,3}|Do|ZZ|([HhMsDm])\1?|[aA]|"[^"]*"|'[^']*'/g;
|
|||
|
var twoDigits = /\d\d?/;
|
|||
|
var threeDigits = /\d{3}/;
|
|||
|
var fourDigits = /\d{4}/;
|
|||
|
var word = /[0-9]*['a-z\u00A0-\u05FF\u0700-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF]+|[\u0600-\u06FF\/]+(\s*?[\u0600-\u06FF]+){1,2}/i;
|
|||
|
var literal = /\[([^]*?)\]/gm;
|
|||
|
|
|||
|
var noop = function () {};
|
|||
|
|
|||
|
function shorten(arr, sLen) {
|
|||
|
var newArr = [];
|
|||
|
|
|||
|
for (var i = 0, len = arr.length; i < len; i++) {
|
|||
|
newArr.push(arr[i].substr(0, sLen));
|
|||
|
}
|
|||
|
|
|||
|
return newArr;
|
|||
|
}
|
|||
|
|
|||
|
function monthUpdate(arrName) {
|
|||
|
return function (d, v, i18n) {
|
|||
|
var index = i18n[arrName].indexOf(v.charAt(0).toUpperCase() + v.substr(1).toLowerCase());
|
|||
|
|
|||
|
if (~index) {
|
|||
|
d.month = index;
|
|||
|
}
|
|||
|
};
|
|||
|
}
|
|||
|
|
|||
|
function pad(val, len) {
|
|||
|
val = String(val);
|
|||
|
len = len || 2;
|
|||
|
|
|||
|
while (val.length < len) {
|
|||
|
val = '0' + val;
|
|||
|
}
|
|||
|
|
|||
|
return val;
|
|||
|
}
|
|||
|
|
|||
|
var dayNames = ['Sunday', 'Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday', 'Saturday'];
|
|||
|
var monthNames = ['January', 'February', 'March', 'April', 'May', 'June', 'July', 'August', 'September', 'October', 'November', 'December'];
|
|||
|
var monthNamesShort = shorten(monthNames, 3);
|
|||
|
var dayNamesShort = shorten(dayNames, 3);
|
|||
|
fecha.i18n = {
|
|||
|
dayNamesShort: dayNamesShort,
|
|||
|
dayNames: dayNames,
|
|||
|
monthNamesShort: monthNamesShort,
|
|||
|
monthNames: monthNames,
|
|||
|
amPm: ['am', 'pm'],
|
|||
|
DoFn: function DoFn(D) {
|
|||
|
return D + ['th', 'st', 'nd', 'rd'][D % 10 > 3 ? 0 : (D - D % 10 !== 10) * D % 10];
|
|||
|
}
|
|||
|
};
|
|||
|
var formatFlags = {
|
|||
|
D: function (dateObj) {
|
|||
|
return dateObj.getDate();
|
|||
|
},
|
|||
|
DD: function (dateObj) {
|
|||
|
return pad(dateObj.getDate());
|
|||
|
},
|
|||
|
Do: function (dateObj, i18n) {
|
|||
|
return i18n.DoFn(dateObj.getDate());
|
|||
|
},
|
|||
|
d: function (dateObj) {
|
|||
|
return dateObj.getDay();
|
|||
|
},
|
|||
|
dd: function (dateObj) {
|
|||
|
return pad(dateObj.getDay());
|
|||
|
},
|
|||
|
ddd: function (dateObj, i18n) {
|
|||
|
return i18n.dayNamesShort[dateObj.getDay()];
|
|||
|
},
|
|||
|
dddd: function (dateObj, i18n) {
|
|||
|
return i18n.dayNames[dateObj.getDay()];
|
|||
|
},
|
|||
|
M: function (dateObj) {
|
|||
|
return dateObj.getMonth() + 1;
|
|||
|
},
|
|||
|
MM: function (dateObj) {
|
|||
|
return pad(dateObj.getMonth() + 1);
|
|||
|
},
|
|||
|
MMM: function (dateObj, i18n) {
|
|||
|
return i18n.monthNamesShort[dateObj.getMonth()];
|
|||
|
},
|
|||
|
MMMM: function (dateObj, i18n) {
|
|||
|
return i18n.monthNames[dateObj.getMonth()];
|
|||
|
},
|
|||
|
YY: function (dateObj) {
|
|||
|
return String(dateObj.getFullYear()).substr(2);
|
|||
|
},
|
|||
|
YYYY: function (dateObj) {
|
|||
|
return pad(dateObj.getFullYear(), 4);
|
|||
|
},
|
|||
|
h: function (dateObj) {
|
|||
|
return dateObj.getHours() % 12 || 12;
|
|||
|
},
|
|||
|
hh: function (dateObj) {
|
|||
|
return pad(dateObj.getHours() % 12 || 12);
|
|||
|
},
|
|||
|
H: function (dateObj) {
|
|||
|
return dateObj.getHours();
|
|||
|
},
|
|||
|
HH: function (dateObj) {
|
|||
|
return pad(dateObj.getHours());
|
|||
|
},
|
|||
|
m: function (dateObj) {
|
|||
|
return dateObj.getMinutes();
|
|||
|
},
|
|||
|
mm: function (dateObj) {
|
|||
|
return pad(dateObj.getMinutes());
|
|||
|
},
|
|||
|
s: function (dateObj) {
|
|||
|
return dateObj.getSeconds();
|
|||
|
},
|
|||
|
ss: function (dateObj) {
|
|||
|
return pad(dateObj.getSeconds());
|
|||
|
},
|
|||
|
S: function (dateObj) {
|
|||
|
return Math.round(dateObj.getMilliseconds() / 100);
|
|||
|
},
|
|||
|
SS: function (dateObj) {
|
|||
|
return pad(Math.round(dateObj.getMilliseconds() / 10), 2);
|
|||
|
},
|
|||
|
SSS: function (dateObj) {
|
|||
|
return pad(dateObj.getMilliseconds(), 3);
|
|||
|
},
|
|||
|
a: function (dateObj, i18n) {
|
|||
|
return dateObj.getHours() < 12 ? i18n.amPm[0] : i18n.amPm[1];
|
|||
|
},
|
|||
|
A: function (dateObj, i18n) {
|
|||
|
return dateObj.getHours() < 12 ? i18n.amPm[0].toUpperCase() : i18n.amPm[1].toUpperCase();
|
|||
|
},
|
|||
|
ZZ: function (dateObj) {
|
|||
|
var o = dateObj.getTimezoneOffset();
|
|||
|
return (o > 0 ? '-' : '+') + pad(Math.floor(Math.abs(o) / 60) * 100 + Math.abs(o) % 60, 4);
|
|||
|
}
|
|||
|
};
|
|||
|
var parseFlags = {
|
|||
|
D: [twoDigits, function (d, v) {
|
|||
|
d.day = v;
|
|||
|
}],
|
|||
|
Do: [new RegExp(twoDigits.source + word.source), function (d, v) {
|
|||
|
d.day = parseInt(v, 10);
|
|||
|
}],
|
|||
|
M: [twoDigits, function (d, v) {
|
|||
|
d.month = v - 1;
|
|||
|
}],
|
|||
|
YY: [twoDigits, function (d, v) {
|
|||
|
var da = new Date(),
|
|||
|
cent = +('' + da.getFullYear()).substr(0, 2);
|
|||
|
d.year = '' + (v > 68 ? cent - 1 : cent) + v;
|
|||
|
}],
|
|||
|
h: [twoDigits, function (d, v) {
|
|||
|
d.hour = v;
|
|||
|
}],
|
|||
|
m: [twoDigits, function (d, v) {
|
|||
|
d.minute = v;
|
|||
|
}],
|
|||
|
s: [twoDigits, function (d, v) {
|
|||
|
d.second = v;
|
|||
|
}],
|
|||
|
YYYY: [fourDigits, function (d, v) {
|
|||
|
d.year = v;
|
|||
|
}],
|
|||
|
S: [/\d/, function (d, v) {
|
|||
|
d.millisecond = v * 100;
|
|||
|
}],
|
|||
|
SS: [/\d{2}/, function (d, v) {
|
|||
|
d.millisecond = v * 10;
|
|||
|
}],
|
|||
|
SSS: [threeDigits, function (d, v) {
|
|||
|
d.millisecond = v;
|
|||
|
}],
|
|||
|
d: [twoDigits, noop],
|
|||
|
ddd: [word, noop],
|
|||
|
MMM: [word, monthUpdate('monthNamesShort')],
|
|||
|
MMMM: [word, monthUpdate('monthNames')],
|
|||
|
a: [word, function (d, v, i18n) {
|
|||
|
var val = v.toLowerCase();
|
|||
|
|
|||
|
if (val === i18n.amPm[0]) {
|
|||
|
d.isPm = false;
|
|||
|
} else if (val === i18n.amPm[1]) {
|
|||
|
d.isPm = true;
|
|||
|
}
|
|||
|
}],
|
|||
|
ZZ: [/([\+\-]\d\d:?\d\d|Z)/, function (d, v) {
|
|||
|
if (v === 'Z') v = '+00:00';
|
|||
|
var parts = (v + '').match(/([\+\-]|\d\d)/gi),
|
|||
|
minutes;
|
|||
|
|
|||
|
if (parts) {
|
|||
|
minutes = +(parts[1] * 60) + parseInt(parts[2], 10);
|
|||
|
d.timezoneOffset = parts[0] === '+' ? minutes : -minutes;
|
|||
|
}
|
|||
|
}]
|
|||
|
};
|
|||
|
parseFlags.dd = parseFlags.d;
|
|||
|
parseFlags.dddd = parseFlags.ddd;
|
|||
|
parseFlags.DD = parseFlags.D;
|
|||
|
parseFlags.mm = parseFlags.m;
|
|||
|
parseFlags.hh = parseFlags.H = parseFlags.HH = parseFlags.h;
|
|||
|
parseFlags.MM = parseFlags.M;
|
|||
|
parseFlags.ss = parseFlags.s;
|
|||
|
parseFlags.A = parseFlags.a; // Some common format strings
|
|||
|
|
|||
|
fecha.masks = {
|
|||
|
default: 'ddd MMM DD YYYY HH:mm:ss',
|
|||
|
shortDate: 'M/D/YY',
|
|||
|
mediumDate: 'MMM D, YYYY',
|
|||
|
longDate: 'MMMM D, YYYY',
|
|||
|
fullDate: 'dddd, MMMM D, YYYY',
|
|||
|
shortTime: 'HH:mm',
|
|||
|
mediumTime: 'HH:mm:ss',
|
|||
|
longTime: 'HH:mm:ss.SSS'
|
|||
|
};
|
|||
|
/***
|
|||
|
* Format a date
|
|||
|
* @method format
|
|||
|
* @param {Date|number} dateObj
|
|||
|
* @param {string} mask Format of the date, i.e. 'mm-dd-yy' or 'shortDate'
|
|||
|
*/
|
|||
|
|
|||
|
fecha.format = function (dateObj, mask, i18nSettings) {
|
|||
|
var i18n = i18nSettings || fecha.i18n;
|
|||
|
|
|||
|
if (typeof dateObj === 'number') {
|
|||
|
dateObj = new Date(dateObj);
|
|||
|
}
|
|||
|
|
|||
|
if (Object.prototype.toString.call(dateObj) !== '[object Date]' || isNaN(dateObj.getTime())) {
|
|||
|
throw new Error('Invalid Date in fecha.format');
|
|||
|
}
|
|||
|
|
|||
|
mask = fecha.masks[mask] || mask || fecha.masks['default'];
|
|||
|
var literals = []; // Make literals inactive by replacing them with ??
|
|||
|
|
|||
|
mask = mask.replace(literal, function ($0, $1) {
|
|||
|
literals.push($1);
|
|||
|
return '??';
|
|||
|
}); // Apply formatting rules
|
|||
|
|
|||
|
mask = mask.replace(token, function ($0) {
|
|||
|
return $0 in formatFlags ? formatFlags[$0](dateObj, i18n) : $0.slice(1, $0.length - 1);
|
|||
|
}); // Inline literal values back into the formatted value
|
|||
|
|
|||
|
return mask.replace(/\?\?/g, function () {
|
|||
|
return literals.shift();
|
|||
|
});
|
|||
|
};
|
|||
|
/**
|
|||
|
* Parse a date string into an object, changes - into /
|
|||
|
* @method parse
|
|||
|
* @param {string} dateStr Date string
|
|||
|
* @param {string} format Date parse format
|
|||
|
* @returns {Date|boolean}
|
|||
|
*/
|
|||
|
|
|||
|
|
|||
|
fecha.parse = function (dateStr, format, i18nSettings) {
|
|||
|
var i18n = i18nSettings || fecha.i18n;
|
|||
|
|
|||
|
if (typeof format !== 'string') {
|
|||
|
throw new Error('Invalid format in fecha.parse');
|
|||
|
}
|
|||
|
|
|||
|
format = fecha.masks[format] || format; // Avoid regular expression denial of service, fail early for really long strings
|
|||
|
// https://www.owasp.org/index.php/Regular_expression_Denial_of_Service_-_ReDoS
|
|||
|
|
|||
|
if (dateStr.length > 1000) {
|
|||
|
return false;
|
|||
|
}
|
|||
|
|
|||
|
var isValid = true;
|
|||
|
var dateInfo = {};
|
|||
|
format.replace(token, function ($0) {
|
|||
|
if (parseFlags[$0]) {
|
|||
|
var info = parseFlags[$0];
|
|||
|
var index = dateStr.search(info[0]);
|
|||
|
|
|||
|
if (!~index) {
|
|||
|
isValid = false;
|
|||
|
} else {
|
|||
|
dateStr.replace(info[0], function (result) {
|
|||
|
info[1](dateInfo, result, i18n);
|
|||
|
dateStr = dateStr.substr(index + result.length);
|
|||
|
return result;
|
|||
|
});
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
return parseFlags[$0] ? '' : $0.slice(1, $0.length - 1);
|
|||
|
});
|
|||
|
|
|||
|
if (!isValid) {
|
|||
|
return false;
|
|||
|
}
|
|||
|
|
|||
|
var today = new Date();
|
|||
|
|
|||
|
if (dateInfo.isPm === true && dateInfo.hour != null && +dateInfo.hour !== 12) {
|
|||
|
dateInfo.hour = +dateInfo.hour + 12;
|
|||
|
} else if (dateInfo.isPm === false && +dateInfo.hour === 12) {
|
|||
|
dateInfo.hour = 0;
|
|||
|
}
|
|||
|
|
|||
|
var date;
|
|||
|
|
|||
|
if (dateInfo.timezoneOffset != null) {
|
|||
|
dateInfo.minute = +(dateInfo.minute || 0) - +dateInfo.timezoneOffset;
|
|||
|
date = new Date(Date.UTC(dateInfo.year || today.getFullYear(), dateInfo.month || 0, dateInfo.day || 1, dateInfo.hour || 0, dateInfo.minute || 0, dateInfo.second || 0, dateInfo.millisecond || 0));
|
|||
|
} else {
|
|||
|
date = new Date(dateInfo.year || today.getFullYear(), dateInfo.month || 0, dateInfo.day || 1, dateInfo.hour || 0, dateInfo.minute || 0, dateInfo.second || 0, dateInfo.millisecond || 0);
|
|||
|
}
|
|||
|
|
|||
|
return date;
|
|||
|
};
|
|||
|
/* istanbul ignore next */
|
|||
|
|
|||
|
|
|||
|
if (typeof module !== 'undefined' && module.exports) {
|
|||
|
module.exports = fecha;
|
|||
|
} else if (true) {
|
|||
|
!(__WEBPACK_AMD_DEFINE_RESULT__ = (function () {
|
|||
|
return fecha;
|
|||
|
}).call(exports, __webpack_require__, exports, module),
|
|||
|
__WEBPACK_AMD_DEFINE_RESULT__ !== undefined && (module.exports = __WEBPACK_AMD_DEFINE_RESULT__));
|
|||
|
} else {
|
|||
|
main.fecha = fecha;
|
|||
|
}
|
|||
|
})(this);
|
|||
|
|
|||
|
/***/ }),
|
|||
|
/* 12 */
|
|||
|
/***/ (function(module, exports, __webpack_require__) {
|
|||
|
|
|||
|
/**
|
|||
|
* @fileOverview 提取公共代码到util方法
|
|||
|
* @author dxq613@gmail.com
|
|||
|
*/
|
|||
|
var isString = __webpack_require__(6);
|
|||
|
|
|||
|
var isDate = __webpack_require__(22);
|
|||
|
|
|||
|
module.exports = {
|
|||
|
toTimeStamp: function toTimeStamp(value) {
|
|||
|
if (isString(value)) {
|
|||
|
if (value.indexOf('T') > 0) {
|
|||
|
value = new Date(value).getTime();
|
|||
|
} else {
|
|||
|
value = new Date(value.replace(/-/ig, '/')).getTime();
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
if (isDate(value)) {
|
|||
|
value = value.getTime();
|
|||
|
}
|
|||
|
|
|||
|
return value;
|
|||
|
}
|
|||
|
};
|
|||
|
|
|||
|
/***/ }),
|
|||
|
/* 13 */
|
|||
|
/***/ (function(module, exports, __webpack_require__) {
|
|||
|
|
|||
|
/**
|
|||
|
* @fileOverview Scale entry, used to reference all the scales
|
|||
|
* @author dxq613@gmail.com
|
|||
|
*/
|
|||
|
var lowerFirst = __webpack_require__(14);
|
|||
|
|
|||
|
var Base = __webpack_require__(0);
|
|||
|
|
|||
|
Base.Linear = __webpack_require__(4);
|
|||
|
Base.Identity = __webpack_require__(19);
|
|||
|
Base.Cat = __webpack_require__(9);
|
|||
|
Base.Time = __webpack_require__(20);
|
|||
|
Base.TimeCat = __webpack_require__(23);
|
|||
|
Base.Log = __webpack_require__(24);
|
|||
|
Base.Pow = __webpack_require__(25);
|
|||
|
|
|||
|
var _loop = function _loop(k) {
|
|||
|
if (Base.hasOwnProperty(k)) {
|
|||
|
var methodName = lowerFirst(k);
|
|||
|
|
|||
|
Base[methodName] = function (cfg) {
|
|||
|
return new Base[k](cfg);
|
|||
|
};
|
|||
|
}
|
|||
|
};
|
|||
|
|
|||
|
for (var k in Base) {
|
|||
|
_loop(k);
|
|||
|
}
|
|||
|
|
|||
|
var CAT_ARR = ['cat', 'timeCat'];
|
|||
|
|
|||
|
Base.isCategory = function (type) {
|
|||
|
return CAT_ARR.indexOf(type) >= 0;
|
|||
|
};
|
|||
|
|
|||
|
module.exports = Base;
|
|||
|
|
|||
|
/***/ }),
|
|||
|
/* 14 */
|
|||
|
/***/ (function(module, exports, __webpack_require__) {
|
|||
|
|
|||
|
var toString = __webpack_require__(15);
|
|||
|
|
|||
|
var lowerFirst = function lowerFirst(value) {
|
|||
|
var str = toString(value);
|
|||
|
return str.charAt(0).toLowerCase() + str.substring(1);
|
|||
|
};
|
|||
|
|
|||
|
module.exports = lowerFirst;
|
|||
|
|
|||
|
/***/ }),
|
|||
|
/* 15 */
|
|||
|
/***/ (function(module, exports, __webpack_require__) {
|
|||
|
|
|||
|
var isNil = __webpack_require__(2);
|
|||
|
|
|||
|
function toString(value) {
|
|||
|
if (isNil(value)) return '';
|
|||
|
return value.toString();
|
|||
|
}
|
|||
|
|
|||
|
module.exports = toString;
|
|||
|
|
|||
|
/***/ }),
|
|||
|
/* 16 */
|
|||
|
/***/ (function(module, exports) {
|
|||
|
|
|||
|
function _mix(dist, obj) {
|
|||
|
for (var key in obj) {
|
|||
|
if (obj.hasOwnProperty(key) && key !== 'constructor' && obj[key] !== undefined) {
|
|||
|
dist[key] = obj[key];
|
|||
|
}
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
var mix = function mix(dist, src1, src2, src3) {
|
|||
|
if (src1) _mix(dist, src1);
|
|||
|
if (src2) _mix(dist, src2);
|
|||
|
if (src3) _mix(dist, src3);
|
|||
|
return dist;
|
|||
|
};
|
|||
|
|
|||
|
module.exports = mix;
|
|||
|
|
|||
|
/***/ }),
|
|||
|
/* 17 */
|
|||
|
/***/ (function(module, exports, __webpack_require__) {
|
|||
|
|
|||
|
var isType = __webpack_require__(3);
|
|||
|
|
|||
|
var isArray = Array.isArray ? Array.isArray : function (value) {
|
|||
|
return isType(value, 'Array');
|
|||
|
};
|
|||
|
module.exports = isArray;
|
|||
|
|
|||
|
/***/ }),
|
|||
|
/* 18 */
|
|||
|
/***/ (function(module, exports, __webpack_require__) {
|
|||
|
|
|||
|
/**
|
|||
|
* @fileOverview 自动计算数字坐标轴
|
|||
|
* @author dxq613@gmail.com
|
|||
|
*/
|
|||
|
var isNil = __webpack_require__(2);
|
|||
|
|
|||
|
var isNumber = __webpack_require__(5);
|
|||
|
|
|||
|
var AutoUtil = __webpack_require__(8);
|
|||
|
|
|||
|
var MIN_COUNT = 5;
|
|||
|
var MAX_COUNT = 7;
|
|||
|
var SNAP_COUNT_ARRAY = [1, 1.2, 1.5, 1.6, 2, 2.2, 2.4, 2.5, 3, 4, 5, 6, 7.5, 8, 10];
|
|||
|
var SNAP_ARRAY = [1, 2, 4, 5, 10];
|
|||
|
var EPS = 1e-12;
|
|||
|
|
|||
|
module.exports = function (info) {
|
|||
|
var min = info.min;
|
|||
|
var max = info.max;
|
|||
|
var interval = info.interval;
|
|||
|
var minTickInterval = info.minTickInterval;
|
|||
|
var ticks = [];
|
|||
|
var minCount = info.minCount || MIN_COUNT;
|
|||
|
var maxCount = info.maxCount || MAX_COUNT;
|
|||
|
var isFixedCount = minCount === maxCount; // 是否限定死了个数
|
|||
|
|
|||
|
var minLimit = isNil(info.minLimit) ? -Infinity : info.minLimit; // 限定的最小值
|
|||
|
|
|||
|
var maxLimit = isNil(info.maxLimit) ? Infinity : info.maxLimit; // 限定最大值
|
|||
|
|
|||
|
var avgCount = (minCount + maxCount) / 2;
|
|||
|
var count = avgCount; // 用户传入的逼近数组
|
|||
|
|
|||
|
var snapArray = info.snapArray ? info.snapArray : isFixedCount ? SNAP_COUNT_ARRAY : SNAP_ARRAY; // 如果限定大小范围,同时大小范围等于用户传入的范围,同时限定了个数,interval 按照个数均分
|
|||
|
|
|||
|
if (min === minLimit && max === maxLimit && isFixedCount) {
|
|||
|
interval = (max - min) / (count - 1);
|
|||
|
}
|
|||
|
|
|||
|
if (isNil(min)) {
|
|||
|
min = 0;
|
|||
|
}
|
|||
|
|
|||
|
if (isNil(max)) {
|
|||
|
max = 0;
|
|||
|
}
|
|||
|
|
|||
|
if (Math.abs(max - min) < EPS) {
|
|||
|
if (min === 0) {
|
|||
|
max = 1;
|
|||
|
} else {
|
|||
|
if (min > 0) {
|
|||
|
min = 0;
|
|||
|
} else {
|
|||
|
max = 0;
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
if (max - min < 5 && !interval && max - min >= 1) {
|
|||
|
interval = 1;
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
if (isNil(interval)) {
|
|||
|
// 计算间距
|
|||
|
var temp = (max - min) / (avgCount - 1);
|
|||
|
interval = AutoUtil.snapFactorTo(temp, snapArray, 'ceil');
|
|||
|
|
|||
|
if (maxCount !== minCount) {
|
|||
|
count = parseInt((max - min) / interval, 10);
|
|||
|
|
|||
|
if (count > maxCount) {
|
|||
|
count = maxCount;
|
|||
|
}
|
|||
|
|
|||
|
if (count < minCount) {
|
|||
|
count = minCount;
|
|||
|
} // 不确定tick的个数时,使得tick偏小
|
|||
|
|
|||
|
|
|||
|
interval = AutoUtil.snapFactorTo((max - min) / (count - 1), snapArray);
|
|||
|
}
|
|||
|
} // interval should not be less than minTickInterval
|
|||
|
|
|||
|
|
|||
|
if (isNumber(minTickInterval) && interval < minTickInterval) {
|
|||
|
interval = minTickInterval;
|
|||
|
}
|
|||
|
|
|||
|
if (info.interval || maxCount !== minCount) {
|
|||
|
// 校正 max 和 min
|
|||
|
max = Math.min(AutoUtil.snapMultiple(max, interval, 'ceil'), maxLimit); // 向上逼近
|
|||
|
|
|||
|
min = Math.max(AutoUtil.snapMultiple(min, interval, 'floor'), minLimit); // 向下逼近
|
|||
|
|
|||
|
count = Math.round((max - min) / interval);
|
|||
|
min = AutoUtil.fixedBase(min, interval); // 当min为负数的时候,fixedBase后,min可能会大于minLimit,导致最终产出的tick是大于minLimit的,所以必须进行修正
|
|||
|
|
|||
|
max = AutoUtil.fixedBase(max, interval);
|
|||
|
var prevMin = null;
|
|||
|
|
|||
|
while (min > minLimit && minLimit > -Infinity && (prevMin === null || min < prevMin)) {
|
|||
|
// 保证计算出来的刻度最小值 min, 不大于数据最小值 min
|
|||
|
prevMin = min;
|
|||
|
min = AutoUtil.fixedBase(min - interval, interval);
|
|||
|
}
|
|||
|
} else {
|
|||
|
avgCount = parseInt(avgCount, 10); // 取整
|
|||
|
|
|||
|
var avg = (max + min) / 2;
|
|||
|
var avgTick = AutoUtil.snapMultiple(avg, interval, 'ceil');
|
|||
|
var sideCount = Math.floor((avgCount - 2) / 2);
|
|||
|
var maxTick = avgTick + sideCount * interval;
|
|||
|
var minTick;
|
|||
|
|
|||
|
if (avgCount % 2 === 0) {
|
|||
|
minTick = avgTick - sideCount * interval;
|
|||
|
} else {
|
|||
|
minTick = avgTick - (sideCount + 1) * interval;
|
|||
|
}
|
|||
|
|
|||
|
var prevMaxTick = null; // 如果减去intervl, fixBase后,新的minTick没有大于之前的值,就退出,防止死循环
|
|||
|
|
|||
|
while (maxTick < max && (prevMaxTick === null || maxTick > prevMaxTick)) {
|
|||
|
// 保证计算出来的刻度最大值 maxTick 不小于数据最大值 max
|
|||
|
prevMaxTick = maxTick;
|
|||
|
maxTick = AutoUtil.fixedBase(maxTick + interval, interval);
|
|||
|
}
|
|||
|
|
|||
|
var prevMinTick = null; // 如果减去intervl, fixBase后,新的minTick没有小于之前的值,就退出,防止死循环
|
|||
|
|
|||
|
while (minTick > min && (prevMinTick === null || minTick < prevMinTick)) {
|
|||
|
// 保证计算出来的刻度最小值 minTick 不大于数据最小值 min
|
|||
|
prevMinTick = minTick;
|
|||
|
minTick = AutoUtil.fixedBase(minTick - interval, interval); // 防止超常浮点数计算问题
|
|||
|
}
|
|||
|
|
|||
|
max = maxTick;
|
|||
|
min = minTick;
|
|||
|
}
|
|||
|
|
|||
|
max = Math.min(max, maxLimit);
|
|||
|
min = Math.max(min, minLimit);
|
|||
|
ticks.push(min);
|
|||
|
|
|||
|
for (var i = 1; i < count; i++) {
|
|||
|
var tickValue = AutoUtil.fixedBase(interval * i + min, interval);
|
|||
|
|
|||
|
if (tickValue < max) {
|
|||
|
ticks.push(tickValue);
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
if (ticks[ticks.length - 1] < max) {
|
|||
|
ticks.push(max);
|
|||
|
}
|
|||
|
|
|||
|
return {
|
|||
|
min: min,
|
|||
|
max: max,
|
|||
|
interval: interval,
|
|||
|
count: count,
|
|||
|
ticks: ticks
|
|||
|
};
|
|||
|
};
|
|||
|
|
|||
|
/***/ }),
|
|||
|
/* 19 */
|
|||
|
/***/ (function(module, exports, __webpack_require__) {
|
|||
|
|
|||
|
function _inheritsLoose(subClass, superClass) { subClass.prototype = Object.create(superClass.prototype); subClass.prototype.constructor = subClass; subClass.__proto__ = superClass; }
|
|||
|
|
|||
|
var Base = __webpack_require__(0);
|
|||
|
|
|||
|
var isNumber = __webpack_require__(5);
|
|||
|
|
|||
|
var Identity = /*#__PURE__*/function (_Base) {
|
|||
|
_inheritsLoose(Identity, _Base);
|
|||
|
|
|||
|
function Identity() {
|
|||
|
return _Base.apply(this, arguments) || this;
|
|||
|
}
|
|||
|
|
|||
|
var _proto = Identity.prototype;
|
|||
|
|
|||
|
_proto._initDefaultCfg = function _initDefaultCfg() {
|
|||
|
_Base.prototype._initDefaultCfg.call(this);
|
|||
|
|
|||
|
this.isIdentity = true;
|
|||
|
this.type = 'identity';
|
|||
|
/**
|
|||
|
* 常量值
|
|||
|
* @type {*}
|
|||
|
*/
|
|||
|
|
|||
|
this.value = null;
|
|||
|
}
|
|||
|
/**
|
|||
|
* @override
|
|||
|
*/
|
|||
|
;
|
|||
|
|
|||
|
_proto.getText = function getText() {
|
|||
|
return this.value.toString();
|
|||
|
}
|
|||
|
/**
|
|||
|
* @override
|
|||
|
*/
|
|||
|
;
|
|||
|
|
|||
|
_proto.scale = function scale(value) {
|
|||
|
if (this.value !== value && isNumber(value)) {
|
|||
|
return value;
|
|||
|
}
|
|||
|
|
|||
|
return this.range[0];
|
|||
|
}
|
|||
|
/**
|
|||
|
* @override
|
|||
|
*/
|
|||
|
;
|
|||
|
|
|||
|
_proto.invert = function invert() {
|
|||
|
return this.value;
|
|||
|
};
|
|||
|
|
|||
|
return Identity;
|
|||
|
}(Base);
|
|||
|
|
|||
|
Base.Identity = Identity;
|
|||
|
module.exports = Identity;
|
|||
|
|
|||
|
/***/ }),
|
|||
|
/* 20 */
|
|||
|
/***/ (function(module, exports, __webpack_require__) {
|
|||
|
|
|||
|
function _inheritsLoose(subClass, superClass) { subClass.prototype = Object.create(superClass.prototype); subClass.prototype.constructor = subClass; subClass.__proto__ = superClass; }
|
|||
|
|
|||
|
/**
|
|||
|
* @fileOverview The measurement of linear data scale function
|
|||
|
* @author dxq613@gmail.com
|
|||
|
*/
|
|||
|
var fecha = __webpack_require__(11);
|
|||
|
|
|||
|
var each = __webpack_require__(1);
|
|||
|
|
|||
|
var isNil = __webpack_require__(2);
|
|||
|
|
|||
|
var isString = __webpack_require__(6);
|
|||
|
|
|||
|
var Base = __webpack_require__(0);
|
|||
|
|
|||
|
var Linear = __webpack_require__(4);
|
|||
|
|
|||
|
var timeAuto = __webpack_require__(21);
|
|||
|
|
|||
|
var TimeUtil = __webpack_require__(12);
|
|||
|
/**
|
|||
|
* 时间度量的构造函数
|
|||
|
* @class Scale.Time
|
|||
|
*/
|
|||
|
|
|||
|
|
|||
|
var Time = /*#__PURE__*/function (_Linear) {
|
|||
|
_inheritsLoose(Time, _Linear);
|
|||
|
|
|||
|
function Time() {
|
|||
|
return _Linear.apply(this, arguments) || this;
|
|||
|
}
|
|||
|
|
|||
|
var _proto = Time.prototype;
|
|||
|
|
|||
|
_proto._initDefaultCfg = function _initDefaultCfg() {
|
|||
|
_Linear.prototype._initDefaultCfg.call(this);
|
|||
|
|
|||
|
this.type = 'time';
|
|||
|
this.mask = 'YYYY-MM-DD';
|
|||
|
}
|
|||
|
/**
|
|||
|
* @override
|
|||
|
*/
|
|||
|
;
|
|||
|
|
|||
|
_proto.init = function init() {
|
|||
|
var self = this;
|
|||
|
var values = self.values;
|
|||
|
|
|||
|
if (values && values.length) {
|
|||
|
// 重新计算最大最小值
|
|||
|
var timeStamps = [];
|
|||
|
var min = Infinity; // 最小值
|
|||
|
|
|||
|
var secondMin = min; // 次小值
|
|||
|
|
|||
|
var max = 0; // 使用一个循环,计算min,max,secondMin
|
|||
|
|
|||
|
each(values, function (v) {
|
|||
|
var timeStamp = self._toTimeStamp(v);
|
|||
|
|
|||
|
if (isNaN(timeStamp)) {
|
|||
|
throw new TypeError("Invalid Time: " + v);
|
|||
|
}
|
|||
|
|
|||
|
if (min > timeStamp) {
|
|||
|
secondMin = min;
|
|||
|
min = timeStamp;
|
|||
|
} else if (secondMin > timeStamp) {
|
|||
|
secondMin = timeStamp;
|
|||
|
}
|
|||
|
|
|||
|
if (max < timeStamp) {
|
|||
|
max = timeStamp;
|
|||
|
}
|
|||
|
|
|||
|
timeStamps.push(timeStamp);
|
|||
|
}); // 存在多个值时,设置最小间距
|
|||
|
|
|||
|
if (values.length > 1) {
|
|||
|
self.minTickInterval = secondMin - min;
|
|||
|
}
|
|||
|
|
|||
|
if (isNil(self.min) || self._toTimeStamp(self.min) > min) {
|
|||
|
self.min = min;
|
|||
|
}
|
|||
|
|
|||
|
if (isNil(self.max) || self._toTimeStamp(self.max) < max) {
|
|||
|
self.max = max;
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
_Linear.prototype.init.call(this);
|
|||
|
};
|
|||
|
|
|||
|
_proto.calculateTicks = function calculateTicks() {
|
|||
|
var self = this;
|
|||
|
var min = self.min;
|
|||
|
var max = self.max;
|
|||
|
var count = self.tickCount;
|
|||
|
var interval = self.tickInterval;
|
|||
|
var tmp = timeAuto({
|
|||
|
min: min,
|
|||
|
max: max,
|
|||
|
minCount: count,
|
|||
|
maxCount: count,
|
|||
|
interval: interval,
|
|||
|
minInterval: self.minTickInterval
|
|||
|
});
|
|||
|
return tmp.ticks;
|
|||
|
}
|
|||
|
/**
|
|||
|
* @override
|
|||
|
*/
|
|||
|
;
|
|||
|
|
|||
|
_proto.getText = function getText(value) {
|
|||
|
var formatter = this.formatter;
|
|||
|
value = this.translate(value);
|
|||
|
value = formatter ? formatter(value) : fecha.format(value, this.mask);
|
|||
|
return value;
|
|||
|
}
|
|||
|
/**
|
|||
|
* @override
|
|||
|
*/
|
|||
|
;
|
|||
|
|
|||
|
_proto.scale = function scale(value) {
|
|||
|
if (isString(value)) {
|
|||
|
value = this.translate(value);
|
|||
|
}
|
|||
|
|
|||
|
return _Linear.prototype.scale.call(this, value);
|
|||
|
}
|
|||
|
/**
|
|||
|
* @override
|
|||
|
*/
|
|||
|
;
|
|||
|
|
|||
|
_proto.translate = function translate(value) {
|
|||
|
return this._toTimeStamp(value);
|
|||
|
} // 将时间转换为时间戳
|
|||
|
;
|
|||
|
|
|||
|
_proto._toTimeStamp = function _toTimeStamp(value) {
|
|||
|
return TimeUtil.toTimeStamp(value);
|
|||
|
};
|
|||
|
|
|||
|
return Time;
|
|||
|
}(Linear);
|
|||
|
|
|||
|
Base.Time = Time;
|
|||
|
module.exports = Time;
|
|||
|
|
|||
|
/***/ }),
|
|||
|
/* 21 */
|
|||
|
/***/ (function(module, exports, __webpack_require__) {
|
|||
|
|
|||
|
/**
|
|||
|
* @fileOverview 计算时间坐标轴
|
|||
|
* @author dxq613@gmail.com
|
|||
|
*/
|
|||
|
var AutoUtil = __webpack_require__(8);
|
|||
|
|
|||
|
var isNil = __webpack_require__(2);
|
|||
|
|
|||
|
var MAX_COUNT = 6;
|
|||
|
var SNAP_ARRAY = [1, 2, 4, 6, 8, 12];
|
|||
|
var MINUTE_MS = 60 * 1000;
|
|||
|
var HOUR_MS = 3600 * 1000;
|
|||
|
var DAY_MS = 24 * 3600 * 1000;
|
|||
|
|
|||
|
function getYear(date) {
|
|||
|
return new Date(date).getFullYear();
|
|||
|
}
|
|||
|
|
|||
|
function createYear(year) {
|
|||
|
return new Date(year, 0, 1).getTime();
|
|||
|
}
|
|||
|
|
|||
|
function getMonth(date) {
|
|||
|
return new Date(date).getMonth();
|
|||
|
}
|
|||
|
|
|||
|
function diffMonth(min, max) {
|
|||
|
var minYear = getYear(min);
|
|||
|
var maxYear = getYear(max);
|
|||
|
var minMonth = getMonth(min);
|
|||
|
var maxMonth = getMonth(max);
|
|||
|
return (maxYear - minYear) * 12 + (maxMonth - minMonth) % 12;
|
|||
|
}
|
|||
|
|
|||
|
function creatMonth(year, month) {
|
|||
|
return new Date(year, month, 1).getTime();
|
|||
|
}
|
|||
|
|
|||
|
function diffDay(min, max) {
|
|||
|
return Math.ceil((max - min) / DAY_MS);
|
|||
|
}
|
|||
|
|
|||
|
function diffHour(min, max) {
|
|||
|
return Math.ceil((max - min) / HOUR_MS);
|
|||
|
}
|
|||
|
|
|||
|
function diffMinus(min, max) {
|
|||
|
return Math.ceil((max - min) / (60 * 1000));
|
|||
|
}
|
|||
|
|
|||
|
module.exports = function (info) {
|
|||
|
var minInterval = info.minInterval;
|
|||
|
var ticks = [];
|
|||
|
var min = info.min;
|
|||
|
var max = info.max;
|
|||
|
var interval = info.interval;
|
|||
|
var count; // 如果最大值和最小值相等,则设置最大值大于最小值一天
|
|||
|
|
|||
|
if (max === min) {
|
|||
|
max = min + DAY_MS;
|
|||
|
} // 计算间距
|
|||
|
|
|||
|
|
|||
|
if (isNil(interval)) {
|
|||
|
var innerTime = max - min;
|
|||
|
var dms = DAY_MS; // 天代表的秒
|
|||
|
|
|||
|
var yms = 365 * dms; // 年代表的秒
|
|||
|
|
|||
|
interval = parseInt(innerTime / (info.maxCount || MAX_COUNT), 10);
|
|||
|
|
|||
|
if (minInterval && minInterval > interval) {
|
|||
|
interval = minInterval;
|
|||
|
}
|
|||
|
|
|||
|
var yfactor = interval / yms;
|
|||
|
var minYear = getYear(min); // 大于半年
|
|||
|
|
|||
|
if (yfactor > 0.51) {
|
|||
|
var year = Math.ceil(yfactor); // interval = year * yms;
|
|||
|
|
|||
|
var maxYear = getYear(max);
|
|||
|
|
|||
|
for (var i = minYear; i <= maxYear + year; i = i + year) {
|
|||
|
ticks.push(createYear(i));
|
|||
|
}
|
|||
|
|
|||
|
interval = null;
|
|||
|
} else if (yfactor > 0.0834) {
|
|||
|
// 大于一个月
|
|||
|
var month = Math.ceil(yfactor / 0.0834);
|
|||
|
var mmMoth = getMonth(min);
|
|||
|
var dMonths = diffMonth(min, max);
|
|||
|
|
|||
|
for (var _i = 0; _i <= dMonths + month; _i = _i + month) {
|
|||
|
ticks.push(creatMonth(minYear, _i + mmMoth));
|
|||
|
}
|
|||
|
|
|||
|
interval = null;
|
|||
|
} else if (interval > dms * 0.5) {
|
|||
|
// 大于一天
|
|||
|
var date = new Date(min);
|
|||
|
|
|||
|
var _year = date.getFullYear();
|
|||
|
|
|||
|
var _month = date.getMonth(min);
|
|||
|
|
|||
|
var mday = date.getDate();
|
|||
|
var day = Math.ceil(interval / dms);
|
|||
|
var ddays = diffDay(min, max);
|
|||
|
interval = day * dms;
|
|||
|
|
|||
|
for (var _i2 = 0; _i2 < ddays + day; _i2 = _i2 + day) {
|
|||
|
ticks.push(new Date(_year, _month, mday + _i2).getTime());
|
|||
|
}
|
|||
|
} else if (interval > HOUR_MS) {
|
|||
|
// 大于一个小时
|
|||
|
var _date = new Date(min);
|
|||
|
|
|||
|
var _year2 = _date.getFullYear();
|
|||
|
|
|||
|
var _month2 = _date.getMonth(min);
|
|||
|
|
|||
|
var _day = _date.getDate();
|
|||
|
|
|||
|
var hour = _date.getHours();
|
|||
|
|
|||
|
var hours = AutoUtil.snapTo(SNAP_ARRAY, Math.ceil(interval / HOUR_MS));
|
|||
|
var dHours = diffHour(min, max);
|
|||
|
interval = hours * HOUR_MS;
|
|||
|
|
|||
|
for (var _i3 = 0; _i3 <= dHours + hours; _i3 = _i3 + hours) {
|
|||
|
ticks.push(new Date(_year2, _month2, _day, hour + _i3).getTime());
|
|||
|
}
|
|||
|
} else if (interval > MINUTE_MS) {
|
|||
|
// 最小单位是分钟
|
|||
|
var dMinus = diffMinus(min, max);
|
|||
|
var minutes = Math.ceil(interval / MINUTE_MS);
|
|||
|
interval = minutes * MINUTE_MS;
|
|||
|
|
|||
|
for (var _i4 = 0; _i4 <= dMinus + minutes; _i4 = _i4 + minutes) {
|
|||
|
ticks.push(min + _i4 * MINUTE_MS);
|
|||
|
}
|
|||
|
} else {
|
|||
|
if (interval < 1000) {
|
|||
|
interval = 1000;
|
|||
|
}
|
|||
|
|
|||
|
min = Math.floor(min / 1000) * 1000;
|
|||
|
var dSeconds = Math.ceil((max - min) / 1000);
|
|||
|
var seconds = Math.ceil(interval / 1000);
|
|||
|
interval = seconds * 1000;
|
|||
|
|
|||
|
for (var _i5 = 0; _i5 < dSeconds + seconds; _i5 = _i5 + seconds) {
|
|||
|
ticks.push(min + _i5 * 1000);
|
|||
|
}
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
if (!ticks.length) {
|
|||
|
min = Math.floor(min / 1000) * 1000;
|
|||
|
max = Math.ceil(max / 1000) * 1000;
|
|||
|
count = (max - min) / interval;
|
|||
|
|
|||
|
for (var _i6 = 0; _i6 <= count; _i6++) {
|
|||
|
ticks.push(AutoUtil.fixedBase(interval * _i6 + min, interval));
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
return {
|
|||
|
max: max,
|
|||
|
min: min,
|
|||
|
interval: interval,
|
|||
|
ticks: ticks,
|
|||
|
count: ticks.length
|
|||
|
};
|
|||
|
};
|
|||
|
|
|||
|
/***/ }),
|
|||
|
/* 22 */
|
|||
|
/***/ (function(module, exports, __webpack_require__) {
|
|||
|
|
|||
|
var isType = __webpack_require__(3);
|
|||
|
|
|||
|
var isDate = function isDate(value) {
|
|||
|
return isType(value, 'Date');
|
|||
|
};
|
|||
|
|
|||
|
module.exports = isDate;
|
|||
|
|
|||
|
/***/ }),
|
|||
|
/* 23 */
|
|||
|
/***/ (function(module, exports, __webpack_require__) {
|
|||
|
|
|||
|
function _inheritsLoose(subClass, superClass) { subClass.prototype = Object.create(superClass.prototype); subClass.prototype.constructor = subClass; subClass.__proto__ = superClass; }
|
|||
|
|
|||
|
/**
|
|||
|
* @fileOverview 时间数据作为分类类型
|
|||
|
* @author dxq613@gmail.com
|
|||
|
*/
|
|||
|
var Base = __webpack_require__(0);
|
|||
|
|
|||
|
var Category = __webpack_require__(9);
|
|||
|
|
|||
|
var fecha = __webpack_require__(11);
|
|||
|
|
|||
|
var catAuto = __webpack_require__(10);
|
|||
|
|
|||
|
var TimeUtil = __webpack_require__(12);
|
|||
|
|
|||
|
var each = __webpack_require__(1);
|
|||
|
|
|||
|
var isNumber = __webpack_require__(5);
|
|||
|
|
|||
|
var isObject = __webpack_require__(7);
|
|||
|
|
|||
|
var isString = __webpack_require__(6);
|
|||
|
/**
|
|||
|
* 度量的构造函数
|
|||
|
* @class Scale.TimeCategory
|
|||
|
*/
|
|||
|
|
|||
|
|
|||
|
var TimeCategory = /*#__PURE__*/function (_Category) {
|
|||
|
_inheritsLoose(TimeCategory, _Category);
|
|||
|
|
|||
|
function TimeCategory() {
|
|||
|
return _Category.apply(this, arguments) || this;
|
|||
|
}
|
|||
|
|
|||
|
var _proto = TimeCategory.prototype;
|
|||
|
|
|||
|
_proto._initDefaultCfg = function _initDefaultCfg() {
|
|||
|
_Category.prototype._initDefaultCfg.call(this);
|
|||
|
|
|||
|
this.type = 'timeCat';
|
|||
|
/**
|
|||
|
* 是否需要排序,默认进行排序
|
|||
|
* @type {Boolean}
|
|||
|
*/
|
|||
|
|
|||
|
this.sortable = true;
|
|||
|
this.tickCount = 5;
|
|||
|
/**
|
|||
|
* 时间格式化
|
|||
|
* @type {String}
|
|||
|
*/
|
|||
|
|
|||
|
this.mask = 'YYYY-MM-DD';
|
|||
|
};
|
|||
|
|
|||
|
_proto.init = function init() {
|
|||
|
var self = this;
|
|||
|
var values = this.values; // 针对时间分类类型,会将时间统一转换为时间戳
|
|||
|
|
|||
|
each(values, function (v, i) {
|
|||
|
values[i] = self._toTimeStamp(v);
|
|||
|
});
|
|||
|
|
|||
|
if (this.sortable) {
|
|||
|
// 允许排序
|
|||
|
values.sort(function (v1, v2) {
|
|||
|
return v1 - v2;
|
|||
|
});
|
|||
|
}
|
|||
|
|
|||
|
if (!self.ticks) {
|
|||
|
self.ticks = this.calculateTicks();
|
|||
|
}
|
|||
|
}
|
|||
|
/**
|
|||
|
* 计算 ticks
|
|||
|
* @return {array} 返回 ticks 数组
|
|||
|
*/
|
|||
|
;
|
|||
|
|
|||
|
_proto.calculateTicks = function calculateTicks() {
|
|||
|
var self = this;
|
|||
|
var count = self.tickCount;
|
|||
|
var ticks;
|
|||
|
|
|||
|
if (count) {
|
|||
|
var temp = catAuto({
|
|||
|
maxCount: count,
|
|||
|
data: self.values,
|
|||
|
isRounding: self.isRounding
|
|||
|
});
|
|||
|
ticks = temp.ticks;
|
|||
|
} else {
|
|||
|
ticks = self.values;
|
|||
|
}
|
|||
|
|
|||
|
return ticks;
|
|||
|
}
|
|||
|
/**
|
|||
|
* @override
|
|||
|
*/
|
|||
|
;
|
|||
|
|
|||
|
_proto.translate = function translate(value) {
|
|||
|
value = this._toTimeStamp(value);
|
|||
|
var index = this.values.indexOf(value);
|
|||
|
|
|||
|
if (index === -1) {
|
|||
|
if (isNumber(value) && value < this.values.length) {
|
|||
|
index = value;
|
|||
|
} else {
|
|||
|
index = NaN;
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
return index;
|
|||
|
}
|
|||
|
/**
|
|||
|
* @override
|
|||
|
*/
|
|||
|
;
|
|||
|
|
|||
|
_proto.scale = function scale(value) {
|
|||
|
var rangeMin = this.rangeMin();
|
|||
|
var rangeMax = this.rangeMax();
|
|||
|
var index = this.translate(value);
|
|||
|
var percent;
|
|||
|
|
|||
|
if (this.values.length === 1 || isNaN(index)) {
|
|||
|
// is index is NAN should not be set as 0
|
|||
|
percent = index;
|
|||
|
} else if (index > -1) {
|
|||
|
percent = index / (this.values.length - 1);
|
|||
|
} else {
|
|||
|
percent = 0;
|
|||
|
}
|
|||
|
|
|||
|
return rangeMin + percent * (rangeMax - rangeMin);
|
|||
|
}
|
|||
|
/**
|
|||
|
* @override
|
|||
|
*/
|
|||
|
;
|
|||
|
|
|||
|
_proto.getText = function getText(value) {
|
|||
|
var result = '';
|
|||
|
var index = this.translate(value);
|
|||
|
|
|||
|
if (index > -1) {
|
|||
|
result = this.values[index];
|
|||
|
} else {
|
|||
|
result = value;
|
|||
|
}
|
|||
|
|
|||
|
var formatter = this.formatter;
|
|||
|
result = parseInt(result, 10);
|
|||
|
result = formatter ? formatter(result) : fecha.format(result, this.mask);
|
|||
|
return result;
|
|||
|
}
|
|||
|
/**
|
|||
|
* @override
|
|||
|
*/
|
|||
|
;
|
|||
|
|
|||
|
_proto.getTicks = function getTicks() {
|
|||
|
var self = this;
|
|||
|
var ticks = this.ticks;
|
|||
|
var rst = [];
|
|||
|
each(ticks, function (tick) {
|
|||
|
var obj;
|
|||
|
|
|||
|
if (isObject(tick)) {
|
|||
|
obj = tick;
|
|||
|
} else {
|
|||
|
obj = {
|
|||
|
text: isString(tick) ? tick : self.getText(tick),
|
|||
|
value: self.scale(tick),
|
|||
|
tickValue: tick // 用于坐标轴上文本动画时确定前后帧的对应关系
|
|||
|
|
|||
|
};
|
|||
|
}
|
|||
|
|
|||
|
rst.push(obj);
|
|||
|
});
|
|||
|
return rst;
|
|||
|
} // 将时间转换为时间戳
|
|||
|
;
|
|||
|
|
|||
|
_proto._toTimeStamp = function _toTimeStamp(value) {
|
|||
|
return TimeUtil.toTimeStamp(value);
|
|||
|
};
|
|||
|
|
|||
|
return TimeCategory;
|
|||
|
}(Category);
|
|||
|
|
|||
|
Base.TimeCat = TimeCategory;
|
|||
|
module.exports = TimeCategory;
|
|||
|
|
|||
|
/***/ }),
|
|||
|
/* 24 */
|
|||
|
/***/ (function(module, exports, __webpack_require__) {
|
|||
|
|
|||
|
function _inheritsLoose(subClass, superClass) { subClass.prototype = Object.create(superClass.prototype); subClass.prototype.constructor = subClass; subClass.__proto__ = superClass; }
|
|||
|
|
|||
|
/**
|
|||
|
* @fileOverview 使用度量,进行log转换
|
|||
|
* @author dxq613@gmail.com
|
|||
|
*/
|
|||
|
var each = __webpack_require__(1);
|
|||
|
|
|||
|
var Base = __webpack_require__(0);
|
|||
|
|
|||
|
var Linear = __webpack_require__(4); // 计算log
|
|||
|
|
|||
|
|
|||
|
function log(a, b) {
|
|||
|
if (a === 1) {
|
|||
|
return 1;
|
|||
|
}
|
|||
|
|
|||
|
return Math.log(b) / Math.log(a);
|
|||
|
}
|
|||
|
/**
|
|||
|
* 度量的log计算
|
|||
|
* @class Scale.Log
|
|||
|
*/
|
|||
|
|
|||
|
|
|||
|
var Log = /*#__PURE__*/function (_Linear) {
|
|||
|
_inheritsLoose(Log, _Linear);
|
|||
|
|
|||
|
function Log() {
|
|||
|
return _Linear.apply(this, arguments) || this;
|
|||
|
}
|
|||
|
|
|||
|
var _proto = Log.prototype;
|
|||
|
|
|||
|
_proto._initDefaultCfg = function _initDefaultCfg() {
|
|||
|
_Linear.prototype._initDefaultCfg.call(this);
|
|||
|
|
|||
|
this.type = 'log';
|
|||
|
/**
|
|||
|
* @override
|
|||
|
* log 的坐标点的个数控制在10个以下
|
|||
|
* @type {Number}
|
|||
|
*/
|
|||
|
|
|||
|
this.tickCount = 10;
|
|||
|
/**
|
|||
|
* 进行log计算的基数
|
|||
|
* @type {Number}
|
|||
|
*/
|
|||
|
|
|||
|
this.base = 2; // 最小的tick,仅内部使用
|
|||
|
|
|||
|
this._minTick = null;
|
|||
|
}
|
|||
|
/**
|
|||
|
* @override
|
|||
|
*/
|
|||
|
;
|
|||
|
|
|||
|
_proto.calculateTicks = function calculateTicks() {
|
|||
|
var self = this;
|
|||
|
var base = self.base;
|
|||
|
var minTick;
|
|||
|
|
|||
|
if (self.min < 0) {
|
|||
|
throw new Error('The minimum value must be greater than zero!');
|
|||
|
}
|
|||
|
|
|||
|
var maxTick = log(base, self.max);
|
|||
|
|
|||
|
if (self.min > 0) {
|
|||
|
minTick = Math.floor(log(base, self.min));
|
|||
|
} else {
|
|||
|
var values = self.values;
|
|||
|
var positiveMin = self.max; // 查找大于0的第一个值, 如果都小于0,默认为1
|
|||
|
|
|||
|
each(values, function (value) {
|
|||
|
if (value > 0 && value < positiveMin) {
|
|||
|
positiveMin = value;
|
|||
|
}
|
|||
|
});
|
|||
|
|
|||
|
if (positiveMin === self.max) {
|
|||
|
positiveMin = self.max / base;
|
|||
|
}
|
|||
|
|
|||
|
if (positiveMin > 1) {
|
|||
|
positiveMin = 1;
|
|||
|
}
|
|||
|
|
|||
|
minTick = Math.floor(log(base, positiveMin));
|
|||
|
self._minTick = minTick;
|
|||
|
self.positiveMin = positiveMin;
|
|||
|
}
|
|||
|
|
|||
|
var count = maxTick - minTick;
|
|||
|
var tickCount = self.tickCount;
|
|||
|
var avg = Math.ceil(count / tickCount);
|
|||
|
var ticks = [];
|
|||
|
|
|||
|
for (var i = minTick; i < maxTick + avg; i = i + avg) {
|
|||
|
ticks.push(Math.pow(base, i));
|
|||
|
}
|
|||
|
|
|||
|
if (self.min === 0) {
|
|||
|
ticks.unshift(0);
|
|||
|
}
|
|||
|
|
|||
|
return ticks;
|
|||
|
} // 获取度量计算时,value占的定义域百分比
|
|||
|
;
|
|||
|
|
|||
|
_proto._getScalePercent = function _getScalePercent(value) {
|
|||
|
var max = this.max;
|
|||
|
var min = this.min;
|
|||
|
|
|||
|
if (max === min) {
|
|||
|
return 0;
|
|||
|
} // 如果值小于等于0,则按照0处理
|
|||
|
|
|||
|
|
|||
|
if (value <= 0) {
|
|||
|
return 0;
|
|||
|
}
|
|||
|
|
|||
|
var base = this.base;
|
|||
|
var positiveMin = this.positiveMin; // 如果min == 0, 则根据比0大的最小值,计算比例关系。这个最小值作为坐标轴上的第二个tick,第一个是0但是不显示
|
|||
|
|
|||
|
if (positiveMin) {
|
|||
|
min = positiveMin * 1 / base;
|
|||
|
}
|
|||
|
|
|||
|
var percent; // 如果数值小于次小值,那么就计算 value / 次小值 占整体的比例
|
|||
|
|
|||
|
if (value < positiveMin) {
|
|||
|
percent = value / positiveMin / (log(base, max) - log(base, min));
|
|||
|
} else {
|
|||
|
percent = (log(base, value) - log(base, min)) / (log(base, max) - log(base, min));
|
|||
|
}
|
|||
|
|
|||
|
return percent;
|
|||
|
}
|
|||
|
/**
|
|||
|
* @override
|
|||
|
*/
|
|||
|
;
|
|||
|
|
|||
|
_proto.scale = function scale(value) {
|
|||
|
var percent = this._getScalePercent(value);
|
|||
|
|
|||
|
var rangeMin = this.rangeMin();
|
|||
|
var rangeMax = this.rangeMax();
|
|||
|
return rangeMin + percent * (rangeMax - rangeMin);
|
|||
|
}
|
|||
|
/**
|
|||
|
* @override
|
|||
|
*/
|
|||
|
;
|
|||
|
|
|||
|
_proto.invert = function invert(value) {
|
|||
|
var base = this.base;
|
|||
|
var max = log(base, this.max);
|
|||
|
var rangeMin = this.rangeMin();
|
|||
|
var range = this.rangeMax() - rangeMin;
|
|||
|
var min;
|
|||
|
var positiveMin = this.positiveMin;
|
|||
|
|
|||
|
if (positiveMin) {
|
|||
|
if (value === 0) {
|
|||
|
return 0;
|
|||
|
}
|
|||
|
|
|||
|
min = log(base, positiveMin / base);
|
|||
|
var appendPercent = 1 / (max - min) * range; // 0 到 positiveMin的占比
|
|||
|
|
|||
|
if (value < appendPercent) {
|
|||
|
// 落到 0 - positiveMin 之间
|
|||
|
return value / appendPercent * positiveMin;
|
|||
|
}
|
|||
|
} else {
|
|||
|
min = log(base, this.min);
|
|||
|
}
|
|||
|
|
|||
|
var percent = (value - rangeMin) / range;
|
|||
|
var tmp = percent * (max - min) + min;
|
|||
|
return Math.pow(base, tmp);
|
|||
|
};
|
|||
|
|
|||
|
return Log;
|
|||
|
}(Linear);
|
|||
|
|
|||
|
Base.Log = Log;
|
|||
|
module.exports = Log;
|
|||
|
|
|||
|
/***/ }),
|
|||
|
/* 25 */
|
|||
|
/***/ (function(module, exports, __webpack_require__) {
|
|||
|
|
|||
|
function _inheritsLoose(subClass, superClass) { subClass.prototype = Object.create(superClass.prototype); subClass.prototype.constructor = subClass; subClass.__proto__ = superClass; }
|
|||
|
|
|||
|
/**
|
|||
|
* @fileOverview 使用pow进行度量计算
|
|||
|
* @author dxq613@gmail.com
|
|||
|
*/
|
|||
|
var Base = __webpack_require__(0);
|
|||
|
|
|||
|
var Linear = __webpack_require__(4); // 求以a为次幂,结果为b的基数,如 x^^a = b;求x
|
|||
|
|
|||
|
|
|||
|
function calBase(a, b) {
|
|||
|
var e = Math.E;
|
|||
|
var value = Math.pow(e, Math.log(b) / a); // 使用换底公式求底
|
|||
|
|
|||
|
return value;
|
|||
|
}
|
|||
|
/**
|
|||
|
* 度量的Pow计算
|
|||
|
* @class Scale.Log
|
|||
|
*/
|
|||
|
|
|||
|
|
|||
|
var Pow = /*#__PURE__*/function (_Linear) {
|
|||
|
_inheritsLoose(Pow, _Linear);
|
|||
|
|
|||
|
function Pow() {
|
|||
|
return _Linear.apply(this, arguments) || this;
|
|||
|
}
|
|||
|
|
|||
|
var _proto = Pow.prototype;
|
|||
|
|
|||
|
_proto._initDefaultCfg = function _initDefaultCfg() {
|
|||
|
_Linear.prototype._initDefaultCfg.call(this);
|
|||
|
|
|||
|
this.type = 'pow';
|
|||
|
/**
|
|||
|
* @override
|
|||
|
* pow 的坐标点的个数控制在10个以下
|
|||
|
* @type {Number}
|
|||
|
*/
|
|||
|
|
|||
|
this.tickCount = 10;
|
|||
|
/**
|
|||
|
* 进行pow计算的基数
|
|||
|
* @type {Number}
|
|||
|
*/
|
|||
|
|
|||
|
this.exponent = 2;
|
|||
|
}
|
|||
|
/**
|
|||
|
* @override
|
|||
|
*/
|
|||
|
;
|
|||
|
|
|||
|
_proto.calculateTicks = function calculateTicks() {
|
|||
|
var self = this;
|
|||
|
var exponent = self.exponent;
|
|||
|
var min;
|
|||
|
var max = Math.ceil(calBase(exponent, self.max));
|
|||
|
|
|||
|
if (self.min >= 0) {
|
|||
|
min = Math.floor(calBase(exponent, self.min));
|
|||
|
} else {
|
|||
|
min = 0;
|
|||
|
}
|
|||
|
|
|||
|
if (min > max) {
|
|||
|
var tmp = max;
|
|||
|
max = min;
|
|||
|
min = tmp;
|
|||
|
}
|
|||
|
|
|||
|
var count = max - min;
|
|||
|
var tickCount = self.tickCount;
|
|||
|
var avg = Math.ceil(count / tickCount);
|
|||
|
var ticks = [];
|
|||
|
|
|||
|
for (var i = min; i < max + avg; i = i + avg) {
|
|||
|
ticks.push(Math.pow(i, exponent));
|
|||
|
}
|
|||
|
|
|||
|
return ticks;
|
|||
|
} // 获取度量计算时,value占的定义域百分比
|
|||
|
;
|
|||
|
|
|||
|
_proto._getScalePercent = function _getScalePercent(value) {
|
|||
|
var max = this.max;
|
|||
|
var min = this.min;
|
|||
|
|
|||
|
if (max === min) {
|
|||
|
return 0;
|
|||
|
}
|
|||
|
|
|||
|
var exponent = this.exponent;
|
|||
|
var percent = (calBase(exponent, value) - calBase(exponent, min)) / (calBase(exponent, max) - calBase(exponent, min));
|
|||
|
return percent;
|
|||
|
}
|
|||
|
/**
|
|||
|
* @override
|
|||
|
*/
|
|||
|
;
|
|||
|
|
|||
|
_proto.scale = function scale(value) {
|
|||
|
var percent = this._getScalePercent(value);
|
|||
|
|
|||
|
var rangeMin = this.rangeMin();
|
|||
|
var rangeMax = this.rangeMax();
|
|||
|
return rangeMin + percent * (rangeMax - rangeMin);
|
|||
|
}
|
|||
|
/**
|
|||
|
* @override
|
|||
|
*/
|
|||
|
;
|
|||
|
|
|||
|
_proto.invert = function invert(value) {
|
|||
|
var percent = (value - this.rangeMin()) / (this.rangeMax() - this.rangeMin());
|
|||
|
var exponent = this.exponent;
|
|||
|
var max = calBase(exponent, this.max);
|
|||
|
var min = calBase(exponent, this.min);
|
|||
|
var tmp = percent * (max - min) + min;
|
|||
|
return Math.pow(tmp, exponent);
|
|||
|
};
|
|||
|
|
|||
|
return Pow;
|
|||
|
}(Linear);
|
|||
|
|
|||
|
Base.Pow = Pow;
|
|||
|
module.exports = Pow;
|
|||
|
|
|||
|
/***/ })
|
|||
|
/******/ ]);
|
|||
|
});
|
|||
|
//# sourceMappingURL=scale.js.map
|