scale.js 61 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110111111121113111411151116111711181119112011211122112311241125112611271128112911301131113211331134113511361137113811391140114111421143114411451146114711481149115011511152115311541155115611571158115911601161116211631164116511661167116811691170117111721173117411751176117711781179118011811182118311841185118611871188118911901191119211931194119511961197119811991200120112021203120412051206120712081209121012111212121312141215121612171218121912201221122212231224122512261227122812291230123112321233123412351236123712381239124012411242124312441245124612471248124912501251125212531254125512561257125812591260126112621263126412651266126712681269127012711272127312741275127612771278127912801281128212831284128512861287128812891290129112921293129412951296129712981299130013011302130313041305130613071308130913101311131213131314131513161317131813191320132113221323132413251326132713281329133013311332133313341335133613371338133913401341134213431344134513461347134813491350135113521353135413551356135713581359136013611362136313641365136613671368136913701371137213731374137513761377137813791380138113821383138413851386138713881389139013911392139313941395139613971398139914001401140214031404140514061407140814091410141114121413141414151416141714181419142014211422142314241425142614271428142914301431143214331434143514361437143814391440144114421443144414451446144714481449145014511452145314541455145614571458145914601461146214631464146514661467146814691470147114721473147414751476147714781479148014811482148314841485148614871488148914901491149214931494149514961497149814991500150115021503150415051506150715081509151015111512151315141515151615171518151915201521152215231524152515261527152815291530153115321533153415351536153715381539154015411542154315441545154615471548154915501551155215531554155515561557155815591560156115621563156415651566156715681569157015711572157315741575157615771578157915801581158215831584158515861587158815891590159115921593159415951596159715981599160016011602160316041605160616071608160916101611161216131614161516161617161816191620162116221623162416251626162716281629163016311632163316341635163616371638163916401641164216431644164516461647164816491650165116521653165416551656165716581659166016611662166316641665166616671668166916701671167216731674167516761677167816791680168116821683168416851686168716881689169016911692169316941695169616971698169917001701170217031704170517061707170817091710171117121713171417151716171717181719172017211722172317241725172617271728172917301731173217331734173517361737173817391740174117421743174417451746174717481749175017511752175317541755175617571758175917601761176217631764176517661767176817691770177117721773177417751776177717781779178017811782178317841785178617871788178917901791179217931794179517961797179817991800180118021803180418051806180718081809181018111812181318141815181618171818181918201821182218231824182518261827182818291830183118321833183418351836183718381839184018411842184318441845184618471848184918501851185218531854185518561857185818591860186118621863186418651866186718681869187018711872187318741875187618771878187918801881188218831884188518861887188818891890189118921893189418951896189718981899190019011902190319041905190619071908190919101911191219131914191519161917191819191920192119221923192419251926192719281929193019311932193319341935193619371938193919401941194219431944194519461947194819491950195119521953195419551956195719581959196019611962196319641965196619671968196919701971197219731974197519761977197819791980198119821983198419851986198719881989199019911992199319941995199619971998199920002001200220032004200520062007200820092010201120122013201420152016201720182019202020212022202320242025202620272028202920302031203220332034203520362037203820392040204120422043204420452046204720482049205020512052205320542055205620572058205920602061206220632064206520662067206820692070207120722073207420752076207720782079208020812082208320842085208620872088208920902091209220932094209520962097209820992100210121022103210421052106210721082109211021112112211321142115211621172118211921202121212221232124212521262127212821292130213121322133213421352136213721382139214021412142214321442145214621472148214921502151215221532154215521562157215821592160216121622163216421652166216721682169217021712172217321742175217621772178217921802181218221832184218521862187218821892190219121922193219421952196219721982199220022012202220322042205220622072208220922102211221222132214221522162217221822192220222122222223222422252226222722282229223022312232223322342235223622372238223922402241224222432244224522462247224822492250225122522253225422552256225722582259226022612262226322642265226622672268226922702271227222732274227522762277227822792280228122822283228422852286228722882289229022912292229322942295229622972298229923002301230223032304230523062307230823092310231123122313231423152316231723182319232023212322232323242325232623272328232923302331233223332334233523362337233823392340234123422343234423452346234723482349235023512352235323542355235623572358235923602361236223632364236523662367236823692370237123722373237423752376237723782379238023812382238323842385238623872388238923902391239223932394239523962397239823992400240124022403240424052406240724082409241024112412241324142415241624172418241924202421242224232424242524262427242824292430243124322433243424352436243724382439244024412442244324442445244624472448244924502451245224532454245524562457245824592460246124622463246424652466246724682469247024712472247324742475247624772478247924802481248224832484248524862487248824892490249124922493249424952496249724982499250025012502250325042505250625072508250925102511251225132514251525162517251825192520252125222523252425252526252725282529253025312532253325342535253625372538253925402541254225432544254525462547254825492550255125522553255425552556255725582559256025612562256325642565256625672568256925702571257225732574257525762577257825792580258125822583258425852586258725882589259025912592259325942595259625972598259926002601260226032604260526062607260826092610261126122613261426152616261726182619262026212622262326242625262626272628262926302631263226332634263526362637263826392640264126422643264426452646264726482649265026512652265326542655265626572658265926602661266226632664266526662667266826692670267126722673267426752676267726782679268026812682268326842685268626872688268926902691269226932694269526962697269826992700270127022703270427052706
  1. (function webpackUniversalModuleDefinition(root, factory) {
  2. if(typeof exports === 'object' && typeof module === 'object')
  3. module.exports = factory();
  4. else if(typeof define === 'function' && define.amd)
  5. define([], factory);
  6. else if(typeof exports === 'object')
  7. exports["scale"] = factory();
  8. else
  9. root["scale"] = factory();
  10. })(typeof self !== 'undefined' ? self : this, function() {
  11. return /******/ (function(modules) { // webpackBootstrap
  12. /******/ // The module cache
  13. /******/ var installedModules = {};
  14. /******/
  15. /******/ // The require function
  16. /******/ function __webpack_require__(moduleId) {
  17. /******/
  18. /******/ // Check if module is in cache
  19. /******/ if(installedModules[moduleId]) {
  20. /******/ return installedModules[moduleId].exports;
  21. /******/ }
  22. /******/ // Create a new module (and put it into the cache)
  23. /******/ var module = installedModules[moduleId] = {
  24. /******/ i: moduleId,
  25. /******/ l: false,
  26. /******/ exports: {}
  27. /******/ };
  28. /******/
  29. /******/ // Execute the module function
  30. /******/ modules[moduleId].call(module.exports, module, module.exports, __webpack_require__);
  31. /******/
  32. /******/ // Flag the module as loaded
  33. /******/ module.l = true;
  34. /******/
  35. /******/ // Return the exports of the module
  36. /******/ return module.exports;
  37. /******/ }
  38. /******/
  39. /******/
  40. /******/ // expose the modules object (__webpack_modules__)
  41. /******/ __webpack_require__.m = modules;
  42. /******/
  43. /******/ // expose the module cache
  44. /******/ __webpack_require__.c = installedModules;
  45. /******/
  46. /******/ // define getter function for harmony exports
  47. /******/ __webpack_require__.d = function(exports, name, getter) {
  48. /******/ if(!__webpack_require__.o(exports, name)) {
  49. /******/ Object.defineProperty(exports, name, {
  50. /******/ configurable: false,
  51. /******/ enumerable: true,
  52. /******/ get: getter
  53. /******/ });
  54. /******/ }
  55. /******/ };
  56. /******/
  57. /******/ // getDefaultExport function for compatibility with non-harmony modules
  58. /******/ __webpack_require__.n = function(module) {
  59. /******/ var getter = module && module.__esModule ?
  60. /******/ function getDefault() { return module['default']; } :
  61. /******/ function getModuleExports() { return module; };
  62. /******/ __webpack_require__.d(getter, 'a', getter);
  63. /******/ return getter;
  64. /******/ };
  65. /******/
  66. /******/ // Object.prototype.hasOwnProperty.call
  67. /******/ __webpack_require__.o = function(object, property) { return Object.prototype.hasOwnProperty.call(object, property); };
  68. /******/
  69. /******/ // __webpack_public_path__
  70. /******/ __webpack_require__.p = "";
  71. /******/
  72. /******/ // Load entry module and return exports
  73. /******/ return __webpack_require__(__webpack_require__.s = 13);
  74. /******/ })
  75. /************************************************************************/
  76. /******/ ([
  77. /* 0 */
  78. /***/ (function(module, exports, __webpack_require__) {
  79. var mix = __webpack_require__(16);
  80. var each = __webpack_require__(1);
  81. var isObject = __webpack_require__(7);
  82. var isNil = __webpack_require__(2);
  83. var Scale =
  84. /*#__PURE__*/
  85. function () {
  86. var _proto = Scale.prototype;
  87. _proto._initDefaultCfg = function _initDefaultCfg() {
  88. this.type = 'base';
  89. /**
  90. * 格式化函数,输出文本或者tick时的格式化函数
  91. * @type {Function}
  92. */
  93. this.formatter = null;
  94. /**
  95. * 输出的值域
  96. * @type {Array}
  97. */
  98. this.range = [0, 1];
  99. /**
  100. * 度量的标记
  101. * @type {Array}
  102. */
  103. this.ticks = null;
  104. /**
  105. * 参与度量计算的值,可选项
  106. * @type {Array}
  107. */
  108. this.values = [];
  109. };
  110. function Scale(cfg) {
  111. this._initDefaultCfg();
  112. mix(this, cfg);
  113. this.init();
  114. }
  115. /**
  116. * 度量初始化
  117. * @protected
  118. */
  119. _proto.init = function init() {}
  120. /**
  121. * 获取该度量的ticks,返回的是多个对象,
  122. * - text: tick 的文本
  123. * - value: 对应的度量转换后的值
  124. * <code>
  125. * [
  126. * {text: 0,value:0}
  127. * {text: 1,value:0.2}
  128. * {text: 2,value:0.4}
  129. * {text: 3,value:0.6}
  130. * {text: 4,value:0.8}
  131. * {text: 5,value:1}
  132. * ]
  133. * </code>
  134. * @param {Number} count 输出tick的个数的近似值,默认是 10
  135. * @return {Array} 返回 ticks 数组
  136. */
  137. ;
  138. _proto.getTicks = function getTicks() {
  139. var self = this;
  140. var ticks = self.ticks;
  141. var rst = [];
  142. each(ticks, function (tick) {
  143. var obj;
  144. if (isObject(tick)) {
  145. obj = tick;
  146. } else {
  147. obj = {
  148. text: self.getText(tick),
  149. tickValue: tick,
  150. value: self.scale(tick)
  151. };
  152. }
  153. rst.push(obj);
  154. });
  155. return rst;
  156. }
  157. /**
  158. * 获取格式化后的文本
  159. * @param {*} value 输入的数据
  160. * @param {*} key 字段的 key
  161. * @return {String} 格式化的文本
  162. */
  163. ;
  164. _proto.getText = function getText(value, key) {
  165. var formatter = this.formatter;
  166. value = formatter ? formatter(value, key) : value;
  167. if (isNil(value) || !value.toString) {
  168. value = '';
  169. }
  170. return value.toString();
  171. }
  172. /**
  173. * 输出的值域最小值
  174. * @protected
  175. * @return {Number} 返回最小的值
  176. */
  177. ;
  178. _proto.rangeMin = function rangeMin() {
  179. return this.range[0];
  180. }
  181. /**
  182. * 输出的值域最大值
  183. * @protected
  184. * @return {Number} 返回最大的值
  185. */
  186. ;
  187. _proto.rangeMax = function rangeMax() {
  188. var range = this.range;
  189. return range[range.length - 1];
  190. }
  191. /**
  192. * 度量转换后的结果,翻转回输入域
  193. * @param {Number} value 需要翻转的数值
  194. * @return {*} 度量的输入值
  195. */
  196. ;
  197. _proto.invert = function invert(value) {
  198. return value;
  199. }
  200. /**
  201. * 将传入的值从非数值转换成数值格式,如分类字符串、时间字符串等
  202. * @param {*} value 传入的值
  203. * @return {Number} 转换的值
  204. */
  205. ;
  206. _proto.translate = function translate(value) {
  207. return value;
  208. }
  209. /**
  210. * 进行度量转换
  211. * @param {*} value 输入值
  212. * @return {Number} 输出值,在设定的输出值域之间,默认[0,1]
  213. */
  214. ;
  215. _proto.scale = function scale(value) {
  216. return value;
  217. }
  218. /**
  219. * 克隆一个新的scale,拥有跟当前scale相同的输入域、输出域等
  220. * @return {Scale} 克隆的度量
  221. */
  222. ;
  223. _proto.clone = function clone() {
  224. var self = this;
  225. var constr = self.constructor;
  226. var cfg = {};
  227. each(self, function (v, k) {
  228. cfg[k] = self[k];
  229. });
  230. return new constr(cfg);
  231. }
  232. /**
  233. * 更改度量的属性信息
  234. * @param {Object} info 属性信息
  235. * @chainable
  236. * @return {Scale} 返回自身的引用
  237. */
  238. ;
  239. _proto.change = function change(info) {
  240. this.ticks = null;
  241. mix(this, info);
  242. this.init();
  243. return this;
  244. };
  245. return Scale;
  246. }();
  247. module.exports = Scale;
  248. /***/ }),
  249. /* 1 */
  250. /***/ (function(module, exports, __webpack_require__) {
  251. var isObject = __webpack_require__(7);
  252. var isArray = __webpack_require__(17);
  253. var each = function each(elements, func) {
  254. if (!elements) {
  255. return;
  256. }
  257. var rst = void 0;
  258. if (isArray(elements)) {
  259. for (var i = 0, len = elements.length; i < len; i++) {
  260. rst = func(elements[i], i);
  261. if (rst === false) {
  262. break;
  263. }
  264. }
  265. } else if (isObject(elements)) {
  266. for (var k in elements) {
  267. if (elements.hasOwnProperty(k)) {
  268. rst = func(elements[k], k);
  269. if (rst === false) {
  270. break;
  271. }
  272. }
  273. }
  274. }
  275. };
  276. module.exports = each;
  277. /***/ }),
  278. /* 2 */
  279. /***/ (function(module, exports) {
  280. // isFinite,
  281. var isNil = function isNil(value) {
  282. /**
  283. * isNil(null) => true
  284. * isNil() => true
  285. */
  286. return value === null || value === undefined;
  287. };
  288. module.exports = isNil;
  289. /***/ }),
  290. /* 3 */
  291. /***/ (function(module, exports) {
  292. var toString = {}.toString;
  293. var isType = function isType(value, type) {
  294. return toString.call(value) === '[object ' + type + ']';
  295. };
  296. module.exports = isType;
  297. /***/ }),
  298. /* 4 */
  299. /***/ (function(module, exports, __webpack_require__) {
  300. function _inheritsLoose(subClass, superClass) { subClass.prototype = Object.create(superClass.prototype); subClass.prototype.constructor = subClass; subClass.__proto__ = superClass; }
  301. /**
  302. * @fileOverview The measurement of linear data scale function
  303. * @author dxq613@gmail.com
  304. */
  305. var isNil = __webpack_require__(2);
  306. var each = __webpack_require__(1);
  307. var Base = __webpack_require__(0);
  308. var numberAuto = __webpack_require__(18);
  309. /**
  310. * 线性度量
  311. * @class Scale.Linear
  312. */
  313. var Linear =
  314. /*#__PURE__*/
  315. function (_Base) {
  316. _inheritsLoose(Linear, _Base);
  317. function Linear() {
  318. return _Base.apply(this, arguments) || this;
  319. }
  320. var _proto = Linear.prototype;
  321. _proto._initDefaultCfg = function _initDefaultCfg() {
  322. _Base.prototype._initDefaultCfg.call(this);
  323. var self = this;
  324. self.type = 'linear';
  325. self.isLinear = true;
  326. /**
  327. * 是否为了用户习惯,优化min,max和ticks,如果进行优化,则会根据生成的ticks调整min,max,否则舍弃(min,max)范围之外的ticks
  328. * @type {Boolean}
  329. * @default false
  330. */
  331. self.nice = false;
  332. /**
  333. * min value of the scale
  334. * @type {Number}
  335. * @default null
  336. */
  337. self.min = null;
  338. /**
  339. * min value limitted of the scale
  340. * @type {Number}
  341. * @default null
  342. */
  343. self.minLimit = null;
  344. /**
  345. * max value of the scale
  346. * @type {Number}
  347. * @default null
  348. */
  349. self.max = null;
  350. /**
  351. * max value limitted of the scale
  352. * @type {Number}
  353. * @default null
  354. */
  355. self.maxLimit = null;
  356. /**
  357. * 自动生成标记时的个数
  358. * @type {Number}
  359. * @default null
  360. */
  361. self.tickCount = null;
  362. /**
  363. * 坐标轴点之间的间距,指的是真实数据的差值
  364. * @type {Number}
  365. * @default null
  366. */
  367. self.tickInterval = null;
  368. /**
  369. * 坐标轴点之间的最小间距,指的是真实数据的差值
  370. * @type {Number}
  371. * @default null
  372. */
  373. self.minTickInterval = null;
  374. /**
  375. * 用于计算坐标点时逼近的数组
  376. * @type {Array}
  377. */
  378. self.snapArray = null;
  379. }
  380. /**
  381. * @protected
  382. * @override
  383. */
  384. ;
  385. _proto.init = function init() {
  386. var self = this;
  387. if (!self.ticks) {
  388. self.min = self.translate(self.min);
  389. self.max = self.translate(self.max);
  390. self.initTicks();
  391. } else {
  392. var ticks = self.ticks;
  393. var firstValue = self.translate(ticks[0]);
  394. var lastValue = self.translate(ticks[ticks.length - 1]);
  395. if (isNil(self.min) || self.min > firstValue) {
  396. self.min = firstValue;
  397. }
  398. if (isNil(self.max) || self.max < lastValue) {
  399. self.max = lastValue;
  400. }
  401. }
  402. }
  403. /**
  404. * 计算坐标点
  405. * @protected
  406. * @return {Array} 计算完成的坐标点
  407. */
  408. ;
  409. _proto.calculateTicks = function calculateTicks() {
  410. var min = this.min,
  411. max = this.max,
  412. minLimit = this.minLimit,
  413. maxLimit = this.maxLimit,
  414. tickCount = this.tickCount,
  415. tickInterval = this.tickInterval,
  416. minTickInterval = this.minTickInterval,
  417. snapArray = this.snapArray;
  418. if (tickCount === 1) {
  419. throw new Error('linear scale\'tickCount should not be 1');
  420. }
  421. if (max < min) {
  422. throw new Error("max: " + max + " should not be less than min: " + min);
  423. }
  424. var tmp = numberAuto({
  425. min: min,
  426. max: max,
  427. minLimit: minLimit,
  428. maxLimit: maxLimit,
  429. minCount: tickCount,
  430. maxCount: tickCount,
  431. interval: tickInterval,
  432. minTickInterval: minTickInterval,
  433. snapArray: snapArray
  434. });
  435. return tmp.ticks;
  436. } // 初始化ticks
  437. ;
  438. _proto.initTicks = function initTicks() {
  439. var self = this;
  440. var calTicks = self.calculateTicks();
  441. if (self.nice) {
  442. // 如果需要优化显示的tick
  443. self.ticks = calTicks;
  444. self.min = calTicks[0];
  445. self.max = calTicks[calTicks.length - 1];
  446. } else {
  447. var ticks = [];
  448. each(calTicks, function (tick) {
  449. if (tick >= self.min && tick <= self.max) {
  450. ticks.push(tick);
  451. }
  452. }); // 如果 ticks 为空,直接输入最小值、最大值
  453. if (!ticks.length) {
  454. ticks.push(self.min);
  455. ticks.push(self.max);
  456. }
  457. self.ticks = ticks;
  458. }
  459. }
  460. /**
  461. * @override
  462. */
  463. ;
  464. _proto.scale = function scale(value) {
  465. if (isNil(value)) {
  466. return NaN;
  467. }
  468. var max = this.max;
  469. var min = this.min;
  470. if (max === min) {
  471. return 0;
  472. }
  473. var percent = (value - min) / (max - min);
  474. var rangeMin = this.rangeMin();
  475. var rangeMax = this.rangeMax();
  476. return rangeMin + percent * (rangeMax - rangeMin);
  477. }
  478. /**
  479. * @override
  480. */
  481. ;
  482. _proto.invert = function invert(value) {
  483. var percent = (value - this.rangeMin()) / (this.rangeMax() - this.rangeMin());
  484. return this.min + percent * (this.max - this.min);
  485. };
  486. return Linear;
  487. }(Base);
  488. Base.Linear = Linear;
  489. module.exports = Linear;
  490. /***/ }),
  491. /* 5 */
  492. /***/ (function(module, exports, __webpack_require__) {
  493. /**
  494. * 判断是否数字
  495. * @return {Boolean} 是否数字
  496. */
  497. var isType = __webpack_require__(3);
  498. var isNumber = function isNumber(value) {
  499. return isType(value, 'Number');
  500. };
  501. module.exports = isNumber;
  502. /***/ }),
  503. /* 6 */
  504. /***/ (function(module, exports, __webpack_require__) {
  505. var isType = __webpack_require__(3);
  506. var isString = function isString(str) {
  507. return isType(str, 'String');
  508. };
  509. module.exports = isString;
  510. /***/ }),
  511. /* 7 */
  512. /***/ (function(module, exports) {
  513. var _typeof = typeof Symbol === "function" && typeof Symbol.iterator === "symbol" ? function (obj) {
  514. return typeof obj;
  515. } : function (obj) {
  516. return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj;
  517. };
  518. var isObject = function isObject(value) {
  519. /**
  520. * isObject({}) => true
  521. * isObject([1, 2, 3]) => true
  522. * isObject(Function) => true
  523. * isObject(null) => false
  524. */
  525. var type = typeof value === 'undefined' ? 'undefined' : _typeof(value);
  526. return value !== null && type === 'object' || type === 'function';
  527. };
  528. module.exports = isObject;
  529. /***/ }),
  530. /* 8 */
  531. /***/ (function(module, exports) {
  532. /**
  533. * @fileOverview 计算方法
  534. * @author dxq613@gmail.com
  535. */
  536. // 如果小数点后面超过 10 位浮点数时进行一下处理
  537. var DECIMAL_LENGTH = 12; // 获取系数
  538. function getFactor(v) {
  539. var factor = 1;
  540. if (v === Infinity || v === -Infinity) {
  541. throw new Error('Not support Infinity!');
  542. }
  543. if (v < 1) {
  544. var count = 0;
  545. while (v < 1) {
  546. factor = factor / 10;
  547. v = v * 10;
  548. count++;
  549. } // 浮点数计算出现问题
  550. if (factor.toString().length > DECIMAL_LENGTH) {
  551. factor = parseFloat(factor.toFixed(count));
  552. }
  553. } else {
  554. while (v > 10) {
  555. factor = factor * 10;
  556. v = v / 10;
  557. }
  558. }
  559. return factor;
  560. } // 取小于当前值的
  561. function arrayFloor(values, value) {
  562. var length = values.length;
  563. if (length === 0) {
  564. return NaN;
  565. }
  566. var pre = values[0];
  567. if (value < values[0]) {
  568. return NaN;
  569. }
  570. if (value >= values[length - 1]) {
  571. return values[length - 1];
  572. }
  573. for (var i = 1; i < values.length; i++) {
  574. if (value < values[i]) {
  575. break;
  576. }
  577. pre = values[i];
  578. }
  579. return pre;
  580. } // 大于当前值的第一个
  581. function arrayCeiling(values, value) {
  582. var length = values.length;
  583. if (length === 0) {
  584. return NaN;
  585. } // var pre = values[0];
  586. var rst;
  587. if (value > values[length - 1]) {
  588. return NaN;
  589. }
  590. if (value < values[0]) {
  591. return values[0];
  592. }
  593. for (var i = 1; i < values.length; i++) {
  594. if (value <= values[i]) {
  595. rst = values[i];
  596. break;
  597. }
  598. }
  599. return rst;
  600. }
  601. var Util = {
  602. // 获取逼近的数值
  603. snapFactorTo: function snapFactorTo(v, arr, snapType) {
  604. // 假设 v = -512,isFloor = true
  605. if (isNaN(v)) {
  606. return NaN;
  607. }
  608. var factor = 1; // 计算系数
  609. if (v !== 0) {
  610. if (v < 0) {
  611. factor = -1;
  612. }
  613. v = v * factor; // v = 512
  614. var tmpFactor = getFactor(v);
  615. factor = factor * tmpFactor; // factor = -100
  616. v = v / tmpFactor; // v = 5.12
  617. }
  618. if (snapType === 'floor') {
  619. v = Util.snapFloor(arr, v); // v = 5
  620. } else if (snapType === 'ceil') {
  621. v = Util.snapCeiling(arr, v); // v = 6
  622. } else {
  623. v = Util.snapTo(arr, v); // 四舍五入 5
  624. }
  625. var rst = parseFloat((v * factor).toPrecision(DECIMAL_LENGTH)); // 如果出现浮点数计算问题,需要处理一下
  626. // 如果出现浮点数计算问题,需要处理一下
  627. if (Math.abs(factor) < 1 && rst.toString().length > DECIMAL_LENGTH) {
  628. var decimalVal = parseInt(1 / factor);
  629. var symbol = factor > 0 ? 1 : -1;
  630. rst = v / decimalVal * symbol;
  631. }
  632. return rst;
  633. },
  634. // 获取逼近的倍数
  635. snapMultiple: function snapMultiple(v, base, snapType) {
  636. var div;
  637. if (snapType === 'ceil') {
  638. div = Math.ceil(v / base);
  639. } else if (snapType === 'floor') {
  640. div = Math.floor(v / base);
  641. } else {
  642. div = Math.round(v / base);
  643. }
  644. return div * base;
  645. },
  646. /**
  647. * 获取逼近的值,用于对齐数据
  648. * @param {Array} values 数据集合
  649. * @param {Number} value 数值
  650. * @return {Number} 逼近的值
  651. */
  652. snapTo: function snapTo(values, value) {
  653. // 这里假定values是升序排列
  654. var floorVal = arrayFloor(values, value);
  655. var ceilingVal = arrayCeiling(values, value);
  656. if (isNaN(floorVal) || isNaN(ceilingVal)) {
  657. if (values[0] >= value) {
  658. return values[0];
  659. }
  660. var last = values[values.length - 1];
  661. if (last <= value) {
  662. return last;
  663. }
  664. }
  665. if (Math.abs(value - floorVal) < Math.abs(ceilingVal - value)) {
  666. return floorVal;
  667. }
  668. return ceilingVal;
  669. },
  670. /**
  671. * 获取逼近的最小值,用于对齐数据
  672. * @param {Array} values 数据集合
  673. * @param {Number} value 数值
  674. * @return {Number} 逼近的最小值
  675. */
  676. snapFloor: function snapFloor(values, value) {
  677. // 这里假定values是升序排列
  678. return arrayFloor(values, value);
  679. },
  680. /**
  681. * 获取逼近的最大值,用于对齐数据
  682. * @param {Array} values 数据集合
  683. * @param {Number} value 数值
  684. * @return {Number} 逼近的最大值
  685. */
  686. snapCeiling: function snapCeiling(values, value) {
  687. // 这里假定values是升序排列
  688. return arrayCeiling(values, value);
  689. },
  690. fixedBase: function fixedBase(v, base) {
  691. var str = base.toString();
  692. var index = str.indexOf('.');
  693. var indexOfExp = str.indexOf('e-'); // 判断是否带小数点,1.000001 1.23e-9
  694. if (index < 0 && indexOfExp < 0) {
  695. // base为整数
  696. return Math.round(v);
  697. }
  698. var length = indexOfExp >= 0 ? parseInt(str.substr(indexOfExp + 2), 10) : str.substr(index + 1).length;
  699. if (length > 20) {
  700. length = 20;
  701. }
  702. return parseFloat(v.toFixed(length));
  703. }
  704. };
  705. module.exports = Util;
  706. /***/ }),
  707. /* 9 */
  708. /***/ (function(module, exports, __webpack_require__) {
  709. function _inheritsLoose(subClass, superClass) { subClass.prototype = Object.create(superClass.prototype); subClass.prototype.constructor = subClass; subClass.__proto__ = superClass; }
  710. var Base = __webpack_require__(0);
  711. var catAuto = __webpack_require__(10);
  712. var each = __webpack_require__(1);
  713. var isNumber = __webpack_require__(5);
  714. var isString = __webpack_require__(6);
  715. var Category =
  716. /*#__PURE__*/
  717. function (_Base) {
  718. _inheritsLoose(Category, _Base);
  719. function Category() {
  720. return _Base.apply(this, arguments) || this;
  721. }
  722. var _proto = Category.prototype;
  723. _proto._initDefaultCfg = function _initDefaultCfg() {
  724. _Base.prototype._initDefaultCfg.call(this);
  725. this.type = 'cat';
  726. /**
  727. * 是否分类度量
  728. * @type {Boolean}
  729. */
  730. this.isCategory = true;
  731. this.isRounding = true; // 是否进行取整操作
  732. }
  733. /**
  734. * @override
  735. */
  736. ;
  737. _proto.init = function init() {
  738. var self = this;
  739. var values = self.values;
  740. var tickCount = self.tickCount;
  741. each(values, function (v, i) {
  742. values[i] = v.toString();
  743. });
  744. if (!self.ticks) {
  745. var ticks = values;
  746. if (tickCount) {
  747. var temp = catAuto({
  748. maxCount: tickCount,
  749. data: values,
  750. isRounding: self.isRounding
  751. });
  752. ticks = temp.ticks;
  753. }
  754. this.ticks = ticks;
  755. }
  756. }
  757. /**
  758. * @override
  759. */
  760. ;
  761. _proto.getText = function getText(value) {
  762. if (this.values.indexOf(value) === -1 && isNumber(value)) {
  763. value = this.values[Math.round(value)];
  764. }
  765. return _Base.prototype.getText.call(this, value);
  766. }
  767. /**
  768. * @override
  769. */
  770. ;
  771. _proto.translate = function translate(value) {
  772. var index = this.values.indexOf(value);
  773. if (index === -1 && isNumber(value)) {
  774. index = value;
  775. } else if (index === -1) {
  776. index = NaN;
  777. }
  778. return index;
  779. }
  780. /**
  781. * @override
  782. */
  783. ;
  784. _proto.scale = function scale(value) {
  785. var rangeMin = this.rangeMin();
  786. var rangeMax = this.rangeMax();
  787. var percent;
  788. if (isString(value) || this.values.indexOf(value) !== -1) {
  789. value = this.translate(value);
  790. }
  791. if (this.values.length > 1) {
  792. percent = value / (this.values.length - 1);
  793. } else {
  794. percent = value;
  795. }
  796. return rangeMin + percent * (rangeMax - rangeMin);
  797. }
  798. /**
  799. * @override
  800. */
  801. ;
  802. _proto.invert = function invert(value) {
  803. if (isString(value)) {
  804. // 如果已经是字符串
  805. return value;
  806. }
  807. var min = this.rangeMin();
  808. var max = this.rangeMax(); // 归一到 范围内
  809. if (value < min) {
  810. value = min;
  811. }
  812. if (value > max) {
  813. value = max;
  814. }
  815. var percent = (value - min) / (max - min);
  816. var index = Math.round(percent * (this.values.length - 1)) % this.values.length;
  817. index = index || 0;
  818. return this.values[index];
  819. };
  820. return Category;
  821. }(Base);
  822. Base.Cat = Category;
  823. module.exports = Category;
  824. /***/ }),
  825. /* 10 */
  826. /***/ (function(module, exports, __webpack_require__) {
  827. /**
  828. * @fileOverview 计算分类的的坐标点
  829. * @author dxq613@gmail.com
  830. */
  831. var each = __webpack_require__(1);
  832. var MAX_COUNT = 8;
  833. var SUB_COUNT = 4; // 控制个数不能过小
  834. function getSimpleArray(data) {
  835. var arr = [];
  836. each(data, function (sub) {
  837. arr = arr.concat(sub);
  838. });
  839. return arr;
  840. }
  841. function getGreatestFactor(count, number) {
  842. var i;
  843. for (i = number; i > 0; i--) {
  844. if (count % i === 0) {
  845. break;
  846. }
  847. } // 如果是素数,没有可以整除的数字
  848. if (i === 1) {
  849. for (i = number; i > 0; i--) {
  850. if ((count - 1) % i === 0) {
  851. break;
  852. }
  853. }
  854. }
  855. return i;
  856. }
  857. module.exports = function (info) {
  858. var rst = {};
  859. var ticks = [];
  860. var isRounding = info.isRounding;
  861. var categories = getSimpleArray(info.data);
  862. var length = categories.length;
  863. var maxCount = info.maxCount || MAX_COUNT;
  864. var tickCount;
  865. if (isRounding) {
  866. // 取整操作
  867. tickCount = getGreatestFactor(length - 1, maxCount - 1) + 1; // 如果计算出来只有两个坐标点,则直接使用传入的 maxCount
  868. if (tickCount === 2) {
  869. tickCount = maxCount;
  870. } else if (tickCount < maxCount - SUB_COUNT) {
  871. tickCount = maxCount - SUB_COUNT;
  872. }
  873. } else {
  874. tickCount = maxCount;
  875. }
  876. if (!isRounding && length <= tickCount + tickCount / 2) {
  877. ticks = [].concat(categories);
  878. } else {
  879. var step = parseInt(length / (tickCount - 1), 10);
  880. var groups = categories.map(function (e, i) {
  881. return i % step === 0 ? categories.slice(i, i + step) : null;
  882. }).filter(function (e) {
  883. return e;
  884. });
  885. for (var i = 1, groupLen = groups.length; i < groupLen && (isRounding ? i * step < length - step : i < tickCount - 1); i++) {
  886. ticks.push(groups[i][0]);
  887. }
  888. if (categories.length) {
  889. ticks.unshift(categories[0]);
  890. var last = categories[length - 1];
  891. if (ticks.indexOf(last) === -1) {
  892. ticks.push(last);
  893. }
  894. }
  895. }
  896. rst.categories = categories;
  897. rst.ticks = ticks;
  898. return rst;
  899. };
  900. /***/ }),
  901. /* 11 */
  902. /***/ (function(module, exports, __webpack_require__) {
  903. var __WEBPACK_AMD_DEFINE_RESULT__;(function (main) {
  904. 'use strict';
  905. /**
  906. * Parse or format dates
  907. * @class fecha
  908. */
  909. var fecha = {};
  910. var token = /d{1,4}|M{1,4}|YY(?:YY)?|S{1,3}|Do|ZZ|([HhMsDm])\1?|[aA]|"[^"]*"|'[^']*'/g;
  911. var twoDigits = /\d\d?/;
  912. var threeDigits = /\d{3}/;
  913. var fourDigits = /\d{4}/;
  914. var word = /[0-9]*['a-z\u00A0-\u05FF\u0700-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF]+|[\u0600-\u06FF\/]+(\s*?[\u0600-\u06FF]+){1,2}/i;
  915. var literal = /\[([^]*?)\]/gm;
  916. var noop = function () {};
  917. function shorten(arr, sLen) {
  918. var newArr = [];
  919. for (var i = 0, len = arr.length; i < len; i++) {
  920. newArr.push(arr[i].substr(0, sLen));
  921. }
  922. return newArr;
  923. }
  924. function monthUpdate(arrName) {
  925. return function (d, v, i18n) {
  926. var index = i18n[arrName].indexOf(v.charAt(0).toUpperCase() + v.substr(1).toLowerCase());
  927. if (~index) {
  928. d.month = index;
  929. }
  930. };
  931. }
  932. function pad(val, len) {
  933. val = String(val);
  934. len = len || 2;
  935. while (val.length < len) {
  936. val = '0' + val;
  937. }
  938. return val;
  939. }
  940. var dayNames = ['Sunday', 'Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday', 'Saturday'];
  941. var monthNames = ['January', 'February', 'March', 'April', 'May', 'June', 'July', 'August', 'September', 'October', 'November', 'December'];
  942. var monthNamesShort = shorten(monthNames, 3);
  943. var dayNamesShort = shorten(dayNames, 3);
  944. fecha.i18n = {
  945. dayNamesShort: dayNamesShort,
  946. dayNames: dayNames,
  947. monthNamesShort: monthNamesShort,
  948. monthNames: monthNames,
  949. amPm: ['am', 'pm'],
  950. DoFn: function DoFn(D) {
  951. return D + ['th', 'st', 'nd', 'rd'][D % 10 > 3 ? 0 : (D - D % 10 !== 10) * D % 10];
  952. }
  953. };
  954. var formatFlags = {
  955. D: function (dateObj) {
  956. return dateObj.getDate();
  957. },
  958. DD: function (dateObj) {
  959. return pad(dateObj.getDate());
  960. },
  961. Do: function (dateObj, i18n) {
  962. return i18n.DoFn(dateObj.getDate());
  963. },
  964. d: function (dateObj) {
  965. return dateObj.getDay();
  966. },
  967. dd: function (dateObj) {
  968. return pad(dateObj.getDay());
  969. },
  970. ddd: function (dateObj, i18n) {
  971. return i18n.dayNamesShort[dateObj.getDay()];
  972. },
  973. dddd: function (dateObj, i18n) {
  974. return i18n.dayNames[dateObj.getDay()];
  975. },
  976. M: function (dateObj) {
  977. return dateObj.getMonth() + 1;
  978. },
  979. MM: function (dateObj) {
  980. return pad(dateObj.getMonth() + 1);
  981. },
  982. MMM: function (dateObj, i18n) {
  983. return i18n.monthNamesShort[dateObj.getMonth()];
  984. },
  985. MMMM: function (dateObj, i18n) {
  986. return i18n.monthNames[dateObj.getMonth()];
  987. },
  988. YY: function (dateObj) {
  989. return String(dateObj.getFullYear()).substr(2);
  990. },
  991. YYYY: function (dateObj) {
  992. return pad(dateObj.getFullYear(), 4);
  993. },
  994. h: function (dateObj) {
  995. return dateObj.getHours() % 12 || 12;
  996. },
  997. hh: function (dateObj) {
  998. return pad(dateObj.getHours() % 12 || 12);
  999. },
  1000. H: function (dateObj) {
  1001. return dateObj.getHours();
  1002. },
  1003. HH: function (dateObj) {
  1004. return pad(dateObj.getHours());
  1005. },
  1006. m: function (dateObj) {
  1007. return dateObj.getMinutes();
  1008. },
  1009. mm: function (dateObj) {
  1010. return pad(dateObj.getMinutes());
  1011. },
  1012. s: function (dateObj) {
  1013. return dateObj.getSeconds();
  1014. },
  1015. ss: function (dateObj) {
  1016. return pad(dateObj.getSeconds());
  1017. },
  1018. S: function (dateObj) {
  1019. return Math.round(dateObj.getMilliseconds() / 100);
  1020. },
  1021. SS: function (dateObj) {
  1022. return pad(Math.round(dateObj.getMilliseconds() / 10), 2);
  1023. },
  1024. SSS: function (dateObj) {
  1025. return pad(dateObj.getMilliseconds(), 3);
  1026. },
  1027. a: function (dateObj, i18n) {
  1028. return dateObj.getHours() < 12 ? i18n.amPm[0] : i18n.amPm[1];
  1029. },
  1030. A: function (dateObj, i18n) {
  1031. return dateObj.getHours() < 12 ? i18n.amPm[0].toUpperCase() : i18n.amPm[1].toUpperCase();
  1032. },
  1033. ZZ: function (dateObj) {
  1034. var o = dateObj.getTimezoneOffset();
  1035. return (o > 0 ? '-' : '+') + pad(Math.floor(Math.abs(o) / 60) * 100 + Math.abs(o) % 60, 4);
  1036. }
  1037. };
  1038. var parseFlags = {
  1039. D: [twoDigits, function (d, v) {
  1040. d.day = v;
  1041. }],
  1042. Do: [new RegExp(twoDigits.source + word.source), function (d, v) {
  1043. d.day = parseInt(v, 10);
  1044. }],
  1045. M: [twoDigits, function (d, v) {
  1046. d.month = v - 1;
  1047. }],
  1048. YY: [twoDigits, function (d, v) {
  1049. var da = new Date(),
  1050. cent = +('' + da.getFullYear()).substr(0, 2);
  1051. d.year = '' + (v > 68 ? cent - 1 : cent) + v;
  1052. }],
  1053. h: [twoDigits, function (d, v) {
  1054. d.hour = v;
  1055. }],
  1056. m: [twoDigits, function (d, v) {
  1057. d.minute = v;
  1058. }],
  1059. s: [twoDigits, function (d, v) {
  1060. d.second = v;
  1061. }],
  1062. YYYY: [fourDigits, function (d, v) {
  1063. d.year = v;
  1064. }],
  1065. S: [/\d/, function (d, v) {
  1066. d.millisecond = v * 100;
  1067. }],
  1068. SS: [/\d{2}/, function (d, v) {
  1069. d.millisecond = v * 10;
  1070. }],
  1071. SSS: [threeDigits, function (d, v) {
  1072. d.millisecond = v;
  1073. }],
  1074. d: [twoDigits, noop],
  1075. ddd: [word, noop],
  1076. MMM: [word, monthUpdate('monthNamesShort')],
  1077. MMMM: [word, monthUpdate('monthNames')],
  1078. a: [word, function (d, v, i18n) {
  1079. var val = v.toLowerCase();
  1080. if (val === i18n.amPm[0]) {
  1081. d.isPm = false;
  1082. } else if (val === i18n.amPm[1]) {
  1083. d.isPm = true;
  1084. }
  1085. }],
  1086. ZZ: [/([\+\-]\d\d:?\d\d|Z)/, function (d, v) {
  1087. if (v === 'Z') v = '+00:00';
  1088. var parts = (v + '').match(/([\+\-]|\d\d)/gi),
  1089. minutes;
  1090. if (parts) {
  1091. minutes = +(parts[1] * 60) + parseInt(parts[2], 10);
  1092. d.timezoneOffset = parts[0] === '+' ? minutes : -minutes;
  1093. }
  1094. }]
  1095. };
  1096. parseFlags.dd = parseFlags.d;
  1097. parseFlags.dddd = parseFlags.ddd;
  1098. parseFlags.DD = parseFlags.D;
  1099. parseFlags.mm = parseFlags.m;
  1100. parseFlags.hh = parseFlags.H = parseFlags.HH = parseFlags.h;
  1101. parseFlags.MM = parseFlags.M;
  1102. parseFlags.ss = parseFlags.s;
  1103. parseFlags.A = parseFlags.a; // Some common format strings
  1104. fecha.masks = {
  1105. default: 'ddd MMM DD YYYY HH:mm:ss',
  1106. shortDate: 'M/D/YY',
  1107. mediumDate: 'MMM D, YYYY',
  1108. longDate: 'MMMM D, YYYY',
  1109. fullDate: 'dddd, MMMM D, YYYY',
  1110. shortTime: 'HH:mm',
  1111. mediumTime: 'HH:mm:ss',
  1112. longTime: 'HH:mm:ss.SSS'
  1113. };
  1114. /***
  1115. * Format a date
  1116. * @method format
  1117. * @param {Date|number} dateObj
  1118. * @param {string} mask Format of the date, i.e. 'mm-dd-yy' or 'shortDate'
  1119. */
  1120. fecha.format = function (dateObj, mask, i18nSettings) {
  1121. var i18n = i18nSettings || fecha.i18n;
  1122. if (typeof dateObj === 'number') {
  1123. dateObj = new Date(dateObj);
  1124. }
  1125. if (Object.prototype.toString.call(dateObj) !== '[object Date]' || isNaN(dateObj.getTime())) {
  1126. throw new Error('Invalid Date in fecha.format');
  1127. }
  1128. mask = fecha.masks[mask] || mask || fecha.masks['default'];
  1129. var literals = []; // Make literals inactive by replacing them with ??
  1130. mask = mask.replace(literal, function ($0, $1) {
  1131. literals.push($1);
  1132. return '??';
  1133. }); // Apply formatting rules
  1134. mask = mask.replace(token, function ($0) {
  1135. return $0 in formatFlags ? formatFlags[$0](dateObj, i18n) : $0.slice(1, $0.length - 1);
  1136. }); // Inline literal values back into the formatted value
  1137. return mask.replace(/\?\?/g, function () {
  1138. return literals.shift();
  1139. });
  1140. };
  1141. /**
  1142. * Parse a date string into an object, changes - into /
  1143. * @method parse
  1144. * @param {string} dateStr Date string
  1145. * @param {string} format Date parse format
  1146. * @returns {Date|boolean}
  1147. */
  1148. fecha.parse = function (dateStr, format, i18nSettings) {
  1149. var i18n = i18nSettings || fecha.i18n;
  1150. if (typeof format !== 'string') {
  1151. throw new Error('Invalid format in fecha.parse');
  1152. }
  1153. format = fecha.masks[format] || format; // Avoid regular expression denial of service, fail early for really long strings
  1154. // https://www.owasp.org/index.php/Regular_expression_Denial_of_Service_-_ReDoS
  1155. if (dateStr.length > 1000) {
  1156. return false;
  1157. }
  1158. var isValid = true;
  1159. var dateInfo = {};
  1160. format.replace(token, function ($0) {
  1161. if (parseFlags[$0]) {
  1162. var info = parseFlags[$0];
  1163. var index = dateStr.search(info[0]);
  1164. if (!~index) {
  1165. isValid = false;
  1166. } else {
  1167. dateStr.replace(info[0], function (result) {
  1168. info[1](dateInfo, result, i18n);
  1169. dateStr = dateStr.substr(index + result.length);
  1170. return result;
  1171. });
  1172. }
  1173. }
  1174. return parseFlags[$0] ? '' : $0.slice(1, $0.length - 1);
  1175. });
  1176. if (!isValid) {
  1177. return false;
  1178. }
  1179. var today = new Date();
  1180. if (dateInfo.isPm === true && dateInfo.hour != null && +dateInfo.hour !== 12) {
  1181. dateInfo.hour = +dateInfo.hour + 12;
  1182. } else if (dateInfo.isPm === false && +dateInfo.hour === 12) {
  1183. dateInfo.hour = 0;
  1184. }
  1185. var date;
  1186. if (dateInfo.timezoneOffset != null) {
  1187. dateInfo.minute = +(dateInfo.minute || 0) - +dateInfo.timezoneOffset;
  1188. 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));
  1189. } else {
  1190. 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);
  1191. }
  1192. return date;
  1193. };
  1194. /* istanbul ignore next */
  1195. if (typeof module !== 'undefined' && module.exports) {
  1196. module.exports = fecha;
  1197. } else if (true) {
  1198. !(__WEBPACK_AMD_DEFINE_RESULT__ = (function () {
  1199. return fecha;
  1200. }).call(exports, __webpack_require__, exports, module),
  1201. __WEBPACK_AMD_DEFINE_RESULT__ !== undefined && (module.exports = __WEBPACK_AMD_DEFINE_RESULT__));
  1202. } else {
  1203. main.fecha = fecha;
  1204. }
  1205. })(this);
  1206. /***/ }),
  1207. /* 12 */
  1208. /***/ (function(module, exports, __webpack_require__) {
  1209. /**
  1210. * @fileOverview 提取公共代码到util方法
  1211. * @author dxq613@gmail.com
  1212. */
  1213. var isString = __webpack_require__(6);
  1214. var isDate = __webpack_require__(22);
  1215. module.exports = {
  1216. toTimeStamp: function toTimeStamp(value) {
  1217. if (isString(value)) {
  1218. if (value.indexOf('T') > 0) {
  1219. value = new Date(value).getTime();
  1220. } else {
  1221. value = new Date(value.replace(/-/ig, '/')).getTime();
  1222. }
  1223. }
  1224. if (isDate(value)) {
  1225. value = value.getTime();
  1226. }
  1227. return value;
  1228. }
  1229. };
  1230. /***/ }),
  1231. /* 13 */
  1232. /***/ (function(module, exports, __webpack_require__) {
  1233. /**
  1234. * @fileOverview Scale entry, used to reference all the scales
  1235. * @author dxq613@gmail.com
  1236. */
  1237. var lowerFirst = __webpack_require__(14);
  1238. var Base = __webpack_require__(0);
  1239. Base.Linear = __webpack_require__(4);
  1240. Base.Identity = __webpack_require__(19);
  1241. Base.Cat = __webpack_require__(9);
  1242. Base.Time = __webpack_require__(20);
  1243. Base.TimeCat = __webpack_require__(23);
  1244. Base.Log = __webpack_require__(24);
  1245. Base.Pow = __webpack_require__(25);
  1246. var _loop = function _loop(k) {
  1247. if (Base.hasOwnProperty(k)) {
  1248. var methodName = lowerFirst(k);
  1249. Base[methodName] = function (cfg) {
  1250. return new Base[k](cfg);
  1251. };
  1252. }
  1253. };
  1254. for (var k in Base) {
  1255. _loop(k);
  1256. }
  1257. var CAT_ARR = ['cat', 'timeCat'];
  1258. Base.isCategory = function (type) {
  1259. return CAT_ARR.indexOf(type) >= 0;
  1260. };
  1261. module.exports = Base;
  1262. /***/ }),
  1263. /* 14 */
  1264. /***/ (function(module, exports, __webpack_require__) {
  1265. var toString = __webpack_require__(15);
  1266. var lowerFirst = function lowerFirst(value) {
  1267. var str = toString(value);
  1268. return str.charAt(0).toLowerCase() + str.substring(1);
  1269. };
  1270. module.exports = lowerFirst;
  1271. /***/ }),
  1272. /* 15 */
  1273. /***/ (function(module, exports, __webpack_require__) {
  1274. var isNil = __webpack_require__(2);
  1275. function toString(value) {
  1276. if (isNil(value)) return '';
  1277. return value.toString();
  1278. }
  1279. module.exports = toString;
  1280. /***/ }),
  1281. /* 16 */
  1282. /***/ (function(module, exports) {
  1283. function _mix(dist, obj) {
  1284. for (var key in obj) {
  1285. if (obj.hasOwnProperty(key) && key !== 'constructor' && obj[key] !== undefined) {
  1286. dist[key] = obj[key];
  1287. }
  1288. }
  1289. }
  1290. var mix = function mix(dist, src1, src2, src3) {
  1291. if (src1) _mix(dist, src1);
  1292. if (src2) _mix(dist, src2);
  1293. if (src3) _mix(dist, src3);
  1294. return dist;
  1295. };
  1296. module.exports = mix;
  1297. /***/ }),
  1298. /* 17 */
  1299. /***/ (function(module, exports, __webpack_require__) {
  1300. var isType = __webpack_require__(3);
  1301. var isArray = Array.isArray ? Array.isArray : function (value) {
  1302. return isType(value, 'Array');
  1303. };
  1304. module.exports = isArray;
  1305. /***/ }),
  1306. /* 18 */
  1307. /***/ (function(module, exports, __webpack_require__) {
  1308. /**
  1309. * @fileOverview 自动计算数字坐标轴
  1310. * @author dxq613@gmail.com
  1311. */
  1312. var isNil = __webpack_require__(2);
  1313. var isNumber = __webpack_require__(5);
  1314. var AutoUtil = __webpack_require__(8);
  1315. var MIN_COUNT = 5;
  1316. var MAX_COUNT = 7;
  1317. var SNAP_COUNT_ARRAY = [0, 1, 1.2, 1.5, 1.6, 2, 2.2, 2.4, 2.5, 3, 4, 5, 6, 7.5, 8, 10];
  1318. var SNAP_ARRAY = [0, 1, 2, 4, 5, 10];
  1319. var EPS = 1e-12;
  1320. module.exports = function (info) {
  1321. var min = info.min;
  1322. var max = info.max;
  1323. var interval = info.interval;
  1324. var minTickInterval = info.minTickInterval;
  1325. var ticks = [];
  1326. var minCount = info.minCount || MIN_COUNT;
  1327. var maxCount = info.maxCount || MAX_COUNT;
  1328. var isFixedCount = minCount === maxCount; // 是否限定死了个数
  1329. var minLimit = isNil(info.minLimit) ? -Infinity : info.minLimit; // 限定的最小值
  1330. var maxLimit = isNil(info.maxLimit) ? Infinity : info.maxLimit; // 限定最大值
  1331. var avgCount = (minCount + maxCount) / 2;
  1332. var count = avgCount; // 用户传入的逼近数组
  1333. var snapArray = info.snapArray ? info.snapArray : isFixedCount ? SNAP_COUNT_ARRAY : SNAP_ARRAY; // 如果限定大小范围,同时大小范围等于用户传入的范围,同时限定了个数,interval 按照个数均分
  1334. if (min === minLimit && max === maxLimit && isFixedCount) {
  1335. interval = (max - min) / (count - 1);
  1336. }
  1337. if (isNil(min)) {
  1338. min = 0;
  1339. }
  1340. if (isNil(max)) {
  1341. max = 0;
  1342. }
  1343. if (Math.abs(max - min) < EPS) {
  1344. if (min === 0) {
  1345. max = 1;
  1346. } else {
  1347. if (min > 0) {
  1348. min = 0;
  1349. } else {
  1350. max = 0;
  1351. }
  1352. }
  1353. if (max - min < 5 && !interval && max - min >= 1) {
  1354. interval = 1;
  1355. }
  1356. }
  1357. if (isNil(interval)) {
  1358. // 计算间距
  1359. var temp = (max - min) / (avgCount - 1);
  1360. interval = AutoUtil.snapFactorTo(temp, snapArray, 'ceil');
  1361. if (maxCount !== minCount) {
  1362. count = parseInt((max - min) / interval, 10);
  1363. if (count > maxCount) {
  1364. count = maxCount;
  1365. }
  1366. if (count < minCount) {
  1367. count = minCount;
  1368. } // 不确定tick的个数时,使得tick偏小
  1369. interval = AutoUtil.snapFactorTo((max - min) / (count - 1), snapArray, 'floor');
  1370. }
  1371. } // interval should not be less than minTickInterval
  1372. if (isNumber(minTickInterval) && interval < minTickInterval) {
  1373. interval = minTickInterval;
  1374. }
  1375. if (info.interval || maxCount !== minCount) {
  1376. // 校正 max 和 min
  1377. max = Math.min(AutoUtil.snapMultiple(max, interval, 'ceil'), maxLimit); // 向上逼近
  1378. min = Math.max(AutoUtil.snapMultiple(min, interval, 'floor'), minLimit); // 向下逼近
  1379. count = Math.round((max - min) / interval);
  1380. min = AutoUtil.fixedBase(min, interval);
  1381. max = AutoUtil.fixedBase(max, interval);
  1382. } else {
  1383. avgCount = parseInt(avgCount, 10); // 取整
  1384. var avg = (max + min) / 2;
  1385. var avgTick = AutoUtil.snapMultiple(avg, interval, 'ceil');
  1386. var sideCount = Math.floor((avgCount - 2) / 2);
  1387. var maxTick = avgTick + sideCount * interval;
  1388. var minTick;
  1389. if (avgCount % 2 === 0) {
  1390. minTick = avgTick - sideCount * interval;
  1391. } else {
  1392. minTick = avgTick - (sideCount + 1) * interval;
  1393. }
  1394. var prevMaxTick = null; // 如果减去intervl, fixBase后,新的minTick没有大于之前的值,就退出,防止死循环
  1395. while (maxTick < max && (prevMaxTick === null || maxTick > prevMaxTick)) {
  1396. // 保证计算出来的刻度最大值 maxTick 不小于数据最大值 max
  1397. prevMaxTick = maxTick;
  1398. maxTick = AutoUtil.fixedBase(maxTick + interval, interval);
  1399. }
  1400. var prevMinTick = null; // 如果减去intervl, fixBase后,新的minTick没有小于之前的值,就退出,防止死循环
  1401. while (minTick > min && (prevMinTick === null || minTick < prevMinTick)) {
  1402. // 保证计算出来的刻度最小值 minTick 不小于数据最大值 min
  1403. prevMinTick = minTick;
  1404. minTick = AutoUtil.fixedBase(minTick - interval, interval); // 防止超常浮点数计算问题
  1405. }
  1406. max = maxTick;
  1407. min = minTick;
  1408. }
  1409. max = Math.min(max, maxLimit);
  1410. min = Math.max(min, minLimit);
  1411. ticks.push(min);
  1412. for (var i = 1; i < count; i++) {
  1413. var tickValue = AutoUtil.fixedBase(interval * i + min, interval);
  1414. if (tickValue < max) {
  1415. ticks.push(tickValue);
  1416. }
  1417. }
  1418. if (ticks[ticks.length - 1] < max) {
  1419. ticks.push(max);
  1420. }
  1421. return {
  1422. min: min,
  1423. max: max,
  1424. interval: interval,
  1425. count: count,
  1426. ticks: ticks
  1427. };
  1428. };
  1429. /***/ }),
  1430. /* 19 */
  1431. /***/ (function(module, exports, __webpack_require__) {
  1432. function _inheritsLoose(subClass, superClass) { subClass.prototype = Object.create(superClass.prototype); subClass.prototype.constructor = subClass; subClass.__proto__ = superClass; }
  1433. var Base = __webpack_require__(0);
  1434. var isNumber = __webpack_require__(5);
  1435. var Identity =
  1436. /*#__PURE__*/
  1437. function (_Base) {
  1438. _inheritsLoose(Identity, _Base);
  1439. function Identity() {
  1440. return _Base.apply(this, arguments) || this;
  1441. }
  1442. var _proto = Identity.prototype;
  1443. _proto._initDefaultCfg = function _initDefaultCfg() {
  1444. _Base.prototype._initDefaultCfg.call(this);
  1445. this.isIdentity = true;
  1446. this.type = 'identity';
  1447. /**
  1448. * 常量值
  1449. * @type {*}
  1450. */
  1451. this.value = null;
  1452. }
  1453. /**
  1454. * @override
  1455. */
  1456. ;
  1457. _proto.getText = function getText() {
  1458. return this.value.toString();
  1459. }
  1460. /**
  1461. * @override
  1462. */
  1463. ;
  1464. _proto.scale = function scale(value) {
  1465. if (this.value !== value && isNumber(value)) {
  1466. return value;
  1467. }
  1468. return this.range[0];
  1469. }
  1470. /**
  1471. * @override
  1472. */
  1473. ;
  1474. _proto.invert = function invert() {
  1475. return this.value;
  1476. };
  1477. return Identity;
  1478. }(Base);
  1479. Base.Identity = Identity;
  1480. module.exports = Identity;
  1481. /***/ }),
  1482. /* 20 */
  1483. /***/ (function(module, exports, __webpack_require__) {
  1484. function _inheritsLoose(subClass, superClass) { subClass.prototype = Object.create(superClass.prototype); subClass.prototype.constructor = subClass; subClass.__proto__ = superClass; }
  1485. /**
  1486. * @fileOverview The measurement of linear data scale function
  1487. * @author dxq613@gmail.com
  1488. */
  1489. var fecha = __webpack_require__(11);
  1490. var each = __webpack_require__(1);
  1491. var isNil = __webpack_require__(2);
  1492. var isString = __webpack_require__(6);
  1493. var Base = __webpack_require__(0);
  1494. var Linear = __webpack_require__(4);
  1495. var timeAuto = __webpack_require__(21);
  1496. var TimeUtil = __webpack_require__(12);
  1497. /**
  1498. * 时间度量的构造函数
  1499. * @class Scale.Time
  1500. */
  1501. var Time =
  1502. /*#__PURE__*/
  1503. function (_Linear) {
  1504. _inheritsLoose(Time, _Linear);
  1505. function Time() {
  1506. return _Linear.apply(this, arguments) || this;
  1507. }
  1508. var _proto = Time.prototype;
  1509. _proto._initDefaultCfg = function _initDefaultCfg() {
  1510. _Linear.prototype._initDefaultCfg.call(this);
  1511. this.type = 'time';
  1512. this.mask = 'YYYY-MM-DD';
  1513. }
  1514. /**
  1515. * @override
  1516. */
  1517. ;
  1518. _proto.init = function init() {
  1519. var self = this;
  1520. var values = self.values;
  1521. if (values && values.length) {
  1522. // 重新计算最大最小值
  1523. var timeStamps = [];
  1524. var min = Infinity; // 最小值
  1525. var secondMin = min; // 次小值
  1526. var max = 0; // 使用一个循环,计算min,max,secondMin
  1527. each(values, function (v) {
  1528. var timeStamp = self._toTimeStamp(v);
  1529. if (isNaN(timeStamp)) {
  1530. throw new TypeError("Invalid Time: " + v);
  1531. }
  1532. if (min > timeStamp) {
  1533. secondMin = min;
  1534. min = timeStamp;
  1535. } else if (secondMin > timeStamp) {
  1536. secondMin = timeStamp;
  1537. }
  1538. if (max < timeStamp) {
  1539. max = timeStamp;
  1540. }
  1541. timeStamps.push(timeStamp);
  1542. }); // 存在多个值时,设置最小间距
  1543. if (values.length > 1) {
  1544. self.minTickInterval = secondMin - min;
  1545. }
  1546. if (isNil(self.min) || self._toTimeStamp(self.min) > min) {
  1547. self.min = min;
  1548. }
  1549. if (isNil(self.max) || self._toTimeStamp(self.max) < max) {
  1550. self.max = max;
  1551. }
  1552. }
  1553. _Linear.prototype.init.call(this);
  1554. };
  1555. _proto.calculateTicks = function calculateTicks() {
  1556. var self = this;
  1557. var min = self.min;
  1558. var max = self.max;
  1559. var count = self.tickCount;
  1560. var interval = self.tickInterval;
  1561. var tmp = timeAuto({
  1562. min: min,
  1563. max: max,
  1564. minCount: count,
  1565. maxCount: count,
  1566. interval: interval,
  1567. minInterval: self.minTickInterval
  1568. });
  1569. return tmp.ticks;
  1570. }
  1571. /**
  1572. * @override
  1573. */
  1574. ;
  1575. _proto.getText = function getText(value) {
  1576. var formatter = this.formatter;
  1577. value = this.translate(value);
  1578. value = formatter ? formatter(value) : fecha.format(value, this.mask);
  1579. return value;
  1580. }
  1581. /**
  1582. * @override
  1583. */
  1584. ;
  1585. _proto.scale = function scale(value) {
  1586. if (isString(value)) {
  1587. value = this.translate(value);
  1588. }
  1589. return _Linear.prototype.scale.call(this, value);
  1590. }
  1591. /**
  1592. * @override
  1593. */
  1594. ;
  1595. _proto.translate = function translate(value) {
  1596. return this._toTimeStamp(value);
  1597. } // 将时间转换为时间戳
  1598. ;
  1599. _proto._toTimeStamp = function _toTimeStamp(value) {
  1600. return TimeUtil.toTimeStamp(value);
  1601. };
  1602. return Time;
  1603. }(Linear);
  1604. Base.Time = Time;
  1605. module.exports = Time;
  1606. /***/ }),
  1607. /* 21 */
  1608. /***/ (function(module, exports, __webpack_require__) {
  1609. /**
  1610. * @fileOverview 计算时间坐标轴
  1611. * @author dxq613@gmail.com
  1612. */
  1613. var AutoUtil = __webpack_require__(8);
  1614. var isNil = __webpack_require__(2);
  1615. var MAX_COUNT = 6;
  1616. var SNAP_ARRAY = [1, 2, 4, 6, 8, 12];
  1617. var MINUTE_MS = 60 * 1000;
  1618. var HOUR_MS = 3600 * 1000;
  1619. var DAY_MS = 24 * 3600 * 1000;
  1620. function getYear(date) {
  1621. return new Date(date).getFullYear();
  1622. }
  1623. function createYear(year) {
  1624. return new Date(year, 0, 1).getTime();
  1625. }
  1626. function getMonth(date) {
  1627. return new Date(date).getMonth();
  1628. }
  1629. function diffMonth(min, max) {
  1630. var minYear = getYear(min);
  1631. var maxYear = getYear(max);
  1632. var minMonth = getMonth(min);
  1633. var maxMonth = getMonth(max);
  1634. return (maxYear - minYear) * 12 + (maxMonth - minMonth) % 12;
  1635. }
  1636. function creatMonth(year, month) {
  1637. return new Date(year, month, 1).getTime();
  1638. }
  1639. function diffDay(min, max) {
  1640. return Math.ceil((max - min) / DAY_MS);
  1641. }
  1642. function diffHour(min, max) {
  1643. return Math.ceil((max - min) / HOUR_MS);
  1644. }
  1645. function diffMinus(min, max) {
  1646. return Math.ceil((max - min) / (60 * 1000));
  1647. }
  1648. module.exports = function (info) {
  1649. var minInterval = info.minInterval;
  1650. var ticks = [];
  1651. var min = info.min;
  1652. var max = info.max;
  1653. var interval = info.interval;
  1654. var count; // 如果最大值和最小值相等,则设置最大值大于最小值一天
  1655. if (max === min) {
  1656. max = min + DAY_MS;
  1657. } // 计算间距
  1658. if (isNil(interval)) {
  1659. var innerTime = max - min;
  1660. var dms = DAY_MS; // 天代表的秒
  1661. var yms = 365 * dms; // 年代表的秒
  1662. interval = parseInt(innerTime / (info.maxCount || MAX_COUNT), 10);
  1663. if (minInterval && minInterval > interval) {
  1664. interval = minInterval;
  1665. }
  1666. var yfactor = interval / yms;
  1667. var minYear = getYear(min); // 大于半年
  1668. if (yfactor > 0.51) {
  1669. var year = Math.ceil(yfactor); // interval = year * yms;
  1670. var maxYear = getYear(max);
  1671. for (var i = minYear; i <= maxYear + year; i = i + year) {
  1672. ticks.push(createYear(i));
  1673. }
  1674. interval = null;
  1675. } else if (yfactor > 0.0834) {
  1676. // 大于一个月
  1677. var month = Math.ceil(yfactor / 0.0834);
  1678. var mmMoth = getMonth(min);
  1679. var dMonths = diffMonth(min, max);
  1680. for (var _i = 0; _i <= dMonths + month; _i = _i + month) {
  1681. ticks.push(creatMonth(minYear, _i + mmMoth));
  1682. }
  1683. interval = null;
  1684. } else if (interval > dms * 0.5) {
  1685. // 大于一天
  1686. var date = new Date(min);
  1687. var _year = date.getFullYear();
  1688. var _month = date.getMonth(min);
  1689. var mday = date.getDate();
  1690. var day = Math.ceil(interval / dms);
  1691. var ddays = diffDay(min, max);
  1692. interval = day * dms;
  1693. for (var _i2 = 0; _i2 < ddays + day; _i2 = _i2 + day) {
  1694. ticks.push(new Date(_year, _month, mday + _i2).getTime());
  1695. }
  1696. } else if (interval > HOUR_MS) {
  1697. // 大于一个小时
  1698. var _date = new Date(min);
  1699. var _year2 = _date.getFullYear();
  1700. var _month2 = _date.getMonth(min);
  1701. var _day = _date.getDate();
  1702. var hour = _date.getHours();
  1703. var hours = AutoUtil.snapTo(SNAP_ARRAY, Math.ceil(interval / HOUR_MS));
  1704. var dHours = diffHour(min, max);
  1705. interval = hours * HOUR_MS;
  1706. for (var _i3 = 0; _i3 <= dHours + hours; _i3 = _i3 + hours) {
  1707. ticks.push(new Date(_year2, _month2, _day, hour + _i3).getTime());
  1708. }
  1709. } else if (interval > MINUTE_MS) {
  1710. // 最小单位是分钟
  1711. var dMinus = diffMinus(min, max);
  1712. var minutes = Math.ceil(interval / MINUTE_MS);
  1713. interval = minutes * MINUTE_MS;
  1714. for (var _i4 = 0; _i4 <= dMinus + minutes; _i4 = _i4 + minutes) {
  1715. ticks.push(min + _i4 * MINUTE_MS);
  1716. }
  1717. } else {
  1718. if (interval < 1000) {
  1719. interval = 1000;
  1720. }
  1721. min = Math.floor(min / 1000) * 1000;
  1722. var dSeconds = Math.ceil((max - min) / 1000);
  1723. var seconds = Math.ceil(interval / 1000);
  1724. interval = seconds * 1000;
  1725. for (var _i5 = 0; _i5 < dSeconds + seconds; _i5 = _i5 + seconds) {
  1726. ticks.push(min + _i5 * 1000);
  1727. }
  1728. }
  1729. }
  1730. if (!ticks.length) {
  1731. min = Math.floor(min / 1000) * 1000;
  1732. max = Math.ceil(max / 1000) * 1000;
  1733. count = (max - min) / interval;
  1734. for (var _i6 = 0; _i6 <= count; _i6++) {
  1735. ticks.push(AutoUtil.fixedBase(interval * _i6 + min, interval));
  1736. }
  1737. }
  1738. return {
  1739. max: max,
  1740. min: min,
  1741. interval: interval,
  1742. ticks: ticks,
  1743. count: ticks.length
  1744. };
  1745. };
  1746. /***/ }),
  1747. /* 22 */
  1748. /***/ (function(module, exports, __webpack_require__) {
  1749. var isType = __webpack_require__(3);
  1750. var isDate = function isDate(value) {
  1751. return isType(value, 'Date');
  1752. };
  1753. module.exports = isDate;
  1754. /***/ }),
  1755. /* 23 */
  1756. /***/ (function(module, exports, __webpack_require__) {
  1757. function _inheritsLoose(subClass, superClass) { subClass.prototype = Object.create(superClass.prototype); subClass.prototype.constructor = subClass; subClass.__proto__ = superClass; }
  1758. /**
  1759. * @fileOverview 时间数据作为分类类型
  1760. * @author dxq613@gmail.com
  1761. */
  1762. var Base = __webpack_require__(0);
  1763. var Category = __webpack_require__(9);
  1764. var fecha = __webpack_require__(11);
  1765. var catAuto = __webpack_require__(10);
  1766. var TimeUtil = __webpack_require__(12);
  1767. var each = __webpack_require__(1);
  1768. var isNumber = __webpack_require__(5);
  1769. var isObject = __webpack_require__(7);
  1770. var isString = __webpack_require__(6);
  1771. /**
  1772. * 度量的构造函数
  1773. * @class Scale.TimeCategory
  1774. */
  1775. var TimeCategory =
  1776. /*#__PURE__*/
  1777. function (_Category) {
  1778. _inheritsLoose(TimeCategory, _Category);
  1779. function TimeCategory() {
  1780. return _Category.apply(this, arguments) || this;
  1781. }
  1782. var _proto = TimeCategory.prototype;
  1783. _proto._initDefaultCfg = function _initDefaultCfg() {
  1784. _Category.prototype._initDefaultCfg.call(this);
  1785. this.type = 'timeCat';
  1786. /**
  1787. * 是否需要排序,默认进行排序
  1788. * @type {Boolean}
  1789. */
  1790. this.sortable = true;
  1791. this.tickCount = 5;
  1792. /**
  1793. * 时间格式化
  1794. * @type {String}
  1795. */
  1796. this.mask = 'YYYY-MM-DD';
  1797. };
  1798. _proto.init = function init() {
  1799. var self = this;
  1800. var values = this.values; // 针对时间分类类型,会将时间统一转换为时间戳
  1801. each(values, function (v, i) {
  1802. values[i] = self._toTimeStamp(v);
  1803. });
  1804. if (this.sortable) {
  1805. // 允许排序
  1806. values.sort(function (v1, v2) {
  1807. return v1 - v2;
  1808. });
  1809. }
  1810. if (!self.ticks) {
  1811. self.ticks = this.calculateTicks();
  1812. }
  1813. }
  1814. /**
  1815. * 计算 ticks
  1816. * @return {array} 返回 ticks 数组
  1817. */
  1818. ;
  1819. _proto.calculateTicks = function calculateTicks() {
  1820. var self = this;
  1821. var count = self.tickCount;
  1822. var ticks;
  1823. if (count) {
  1824. var temp = catAuto({
  1825. maxCount: count,
  1826. data: self.values,
  1827. isRounding: self.isRounding
  1828. });
  1829. ticks = temp.ticks;
  1830. } else {
  1831. ticks = self.values;
  1832. }
  1833. return ticks;
  1834. }
  1835. /**
  1836. * @override
  1837. */
  1838. ;
  1839. _proto.translate = function translate(value) {
  1840. value = this._toTimeStamp(value);
  1841. var index = this.values.indexOf(value);
  1842. if (index === -1) {
  1843. if (isNumber(value) && value < this.values.length) {
  1844. index = value;
  1845. } else {
  1846. index = NaN;
  1847. }
  1848. }
  1849. return index;
  1850. }
  1851. /**
  1852. * @override
  1853. */
  1854. ;
  1855. _proto.scale = function scale(value) {
  1856. var rangeMin = this.rangeMin();
  1857. var rangeMax = this.rangeMax();
  1858. var index = this.translate(value);
  1859. var percent;
  1860. if (this.values.length === 1 || isNaN(index)) {
  1861. // is index is NAN should not be set as 0
  1862. percent = index;
  1863. } else if (index > -1) {
  1864. percent = index / (this.values.length - 1);
  1865. } else {
  1866. percent = 0;
  1867. }
  1868. return rangeMin + percent * (rangeMax - rangeMin);
  1869. }
  1870. /**
  1871. * @override
  1872. */
  1873. ;
  1874. _proto.getText = function getText(value) {
  1875. var result = '';
  1876. var index = this.translate(value);
  1877. if (index > -1) {
  1878. result = this.values[index];
  1879. } else {
  1880. result = value;
  1881. }
  1882. var formatter = this.formatter;
  1883. result = parseInt(result, 10);
  1884. result = formatter ? formatter(result) : fecha.format(result, this.mask);
  1885. return result;
  1886. }
  1887. /**
  1888. * @override
  1889. */
  1890. ;
  1891. _proto.getTicks = function getTicks() {
  1892. var self = this;
  1893. var ticks = this.ticks;
  1894. var rst = [];
  1895. each(ticks, function (tick) {
  1896. var obj;
  1897. if (isObject(tick)) {
  1898. obj = tick;
  1899. } else {
  1900. obj = {
  1901. text: isString(tick) ? tick : self.getText(tick),
  1902. value: self.scale(tick),
  1903. tickValue: tick // 用于坐标轴上文本动画时确定前后帧的对应关系
  1904. };
  1905. }
  1906. rst.push(obj);
  1907. });
  1908. return rst;
  1909. } // 将时间转换为时间戳
  1910. ;
  1911. _proto._toTimeStamp = function _toTimeStamp(value) {
  1912. return TimeUtil.toTimeStamp(value);
  1913. };
  1914. return TimeCategory;
  1915. }(Category);
  1916. Base.TimeCat = TimeCategory;
  1917. module.exports = TimeCategory;
  1918. /***/ }),
  1919. /* 24 */
  1920. /***/ (function(module, exports, __webpack_require__) {
  1921. function _inheritsLoose(subClass, superClass) { subClass.prototype = Object.create(superClass.prototype); subClass.prototype.constructor = subClass; subClass.__proto__ = superClass; }
  1922. /**
  1923. * @fileOverview 使用度量,进行log转换
  1924. * @author dxq613@gmail.com
  1925. */
  1926. var each = __webpack_require__(1);
  1927. var Base = __webpack_require__(0);
  1928. var Linear = __webpack_require__(4); // 计算log
  1929. function log(a, b) {
  1930. if (a === 1) {
  1931. return 1;
  1932. }
  1933. return Math.log(b) / Math.log(a);
  1934. }
  1935. /**
  1936. * 度量的log计算
  1937. * @class Scale.Log
  1938. */
  1939. var Log =
  1940. /*#__PURE__*/
  1941. function (_Linear) {
  1942. _inheritsLoose(Log, _Linear);
  1943. function Log() {
  1944. return _Linear.apply(this, arguments) || this;
  1945. }
  1946. var _proto = Log.prototype;
  1947. _proto._initDefaultCfg = function _initDefaultCfg() {
  1948. _Linear.prototype._initDefaultCfg.call(this);
  1949. this.type = 'log';
  1950. /**
  1951. * @override
  1952. * log 的坐标点的个数控制在10个以下
  1953. * @type {Number}
  1954. */
  1955. this.tickCount = 10;
  1956. /**
  1957. * 进行log计算的基数
  1958. * @type {Number}
  1959. */
  1960. this.base = 2; // 最小的tick,仅内部使用
  1961. this._minTick = null;
  1962. }
  1963. /**
  1964. * @override
  1965. */
  1966. ;
  1967. _proto.calculateTicks = function calculateTicks() {
  1968. var self = this;
  1969. var base = self.base;
  1970. var minTick;
  1971. if (self.min < 0) {
  1972. throw new Error('The minimum value must be greater than zero!');
  1973. }
  1974. var maxTick = log(base, self.max);
  1975. if (self.min > 0) {
  1976. minTick = Math.floor(log(base, self.min));
  1977. } else {
  1978. var values = self.values;
  1979. var positiveMin = self.max; // 查找大于0的第一个值, 如果都小于0,默认为1
  1980. each(values, function (value) {
  1981. if (value > 0 && value < positiveMin) {
  1982. positiveMin = value;
  1983. }
  1984. });
  1985. if (positiveMin === self.max) {
  1986. positiveMin = self.max / base;
  1987. }
  1988. if (positiveMin > 1) {
  1989. positiveMin = 1;
  1990. }
  1991. minTick = Math.floor(log(base, positiveMin));
  1992. self._minTick = minTick;
  1993. self.positiveMin = positiveMin;
  1994. }
  1995. var count = maxTick - minTick;
  1996. var tickCount = self.tickCount;
  1997. var avg = Math.ceil(count / tickCount);
  1998. var ticks = [];
  1999. for (var i = minTick; i < maxTick + avg; i = i + avg) {
  2000. ticks.push(Math.pow(base, i));
  2001. }
  2002. if (self.min === 0) {
  2003. ticks.unshift(0);
  2004. }
  2005. return ticks;
  2006. } // 获取度量计算时,value占的定义域百分比
  2007. ;
  2008. _proto._getScalePercent = function _getScalePercent(value) {
  2009. var max = this.max;
  2010. var min = this.min;
  2011. if (max === min) {
  2012. return 0;
  2013. } // 如果值小于等于0,则按照0处理
  2014. if (value <= 0) {
  2015. return 0;
  2016. }
  2017. var base = this.base;
  2018. var positiveMin = this.positiveMin; // 如果min == 0, 则根据比0大的最小值,计算比例关系。这个最小值作为坐标轴上的第二个tick,第一个是0但是不显示
  2019. if (positiveMin) {
  2020. min = positiveMin * 1 / base;
  2021. }
  2022. var percent; // 如果数值小于次小值,那么就计算 value / 次小值 占整体的比例
  2023. if (value < positiveMin) {
  2024. percent = value / positiveMin / (log(base, max) - log(base, min));
  2025. } else {
  2026. percent = (log(base, value) - log(base, min)) / (log(base, max) - log(base, min));
  2027. }
  2028. return percent;
  2029. }
  2030. /**
  2031. * @override
  2032. */
  2033. ;
  2034. _proto.scale = function scale(value) {
  2035. var percent = this._getScalePercent(value);
  2036. var rangeMin = this.rangeMin();
  2037. var rangeMax = this.rangeMax();
  2038. return rangeMin + percent * (rangeMax - rangeMin);
  2039. }
  2040. /**
  2041. * @override
  2042. */
  2043. ;
  2044. _proto.invert = function invert(value) {
  2045. var base = this.base;
  2046. var max = log(base, this.max);
  2047. var rangeMin = this.rangeMin();
  2048. var range = this.rangeMax() - rangeMin;
  2049. var min;
  2050. var positiveMin = this.positiveMin;
  2051. if (positiveMin) {
  2052. if (value === 0) {
  2053. return 0;
  2054. }
  2055. min = log(base, positiveMin / base);
  2056. var appendPercent = 1 / (max - min) * range; // 0 到 positiveMin的占比
  2057. if (value < appendPercent) {
  2058. // 落到 0 - positiveMin 之间
  2059. return value / appendPercent * positiveMin;
  2060. }
  2061. } else {
  2062. min = log(base, this.min);
  2063. }
  2064. var percent = (value - rangeMin) / range;
  2065. var tmp = percent * (max - min) + min;
  2066. return Math.pow(base, tmp);
  2067. };
  2068. return Log;
  2069. }(Linear);
  2070. Base.Log = Log;
  2071. module.exports = Log;
  2072. /***/ }),
  2073. /* 25 */
  2074. /***/ (function(module, exports, __webpack_require__) {
  2075. function _inheritsLoose(subClass, superClass) { subClass.prototype = Object.create(superClass.prototype); subClass.prototype.constructor = subClass; subClass.__proto__ = superClass; }
  2076. /**
  2077. * @fileOverview 使用pow进行度量计算
  2078. * @author dxq613@gmail.com
  2079. */
  2080. var Base = __webpack_require__(0);
  2081. var Linear = __webpack_require__(4); // 求以a为次幂,结果为b的基数,如 x^^a = b;求x
  2082. function calBase(a, b) {
  2083. var e = Math.E;
  2084. var value = Math.pow(e, Math.log(b) / a); // 使用换底公式求底
  2085. return value;
  2086. }
  2087. /**
  2088. * 度量的Pow计算
  2089. * @class Scale.Log
  2090. */
  2091. var Pow =
  2092. /*#__PURE__*/
  2093. function (_Linear) {
  2094. _inheritsLoose(Pow, _Linear);
  2095. function Pow() {
  2096. return _Linear.apply(this, arguments) || this;
  2097. }
  2098. var _proto = Pow.prototype;
  2099. _proto._initDefaultCfg = function _initDefaultCfg() {
  2100. _Linear.prototype._initDefaultCfg.call(this);
  2101. this.type = 'pow';
  2102. /**
  2103. * @override
  2104. * pow 的坐标点的个数控制在10个以下
  2105. * @type {Number}
  2106. */
  2107. this.tickCount = 10;
  2108. /**
  2109. * 进行pow计算的基数
  2110. * @type {Number}
  2111. */
  2112. this.exponent = 2;
  2113. }
  2114. /**
  2115. * @override
  2116. */
  2117. ;
  2118. _proto.calculateTicks = function calculateTicks() {
  2119. var self = this;
  2120. var exponent = self.exponent;
  2121. var min;
  2122. var max = Math.ceil(calBase(exponent, self.max));
  2123. if (self.min >= 0) {
  2124. min = Math.floor(calBase(exponent, self.min));
  2125. } else {
  2126. min = 0;
  2127. }
  2128. if (min > max) {
  2129. var tmp = max;
  2130. max = min;
  2131. min = tmp;
  2132. }
  2133. var count = max - min;
  2134. var tickCount = self.tickCount;
  2135. var avg = Math.ceil(count / tickCount);
  2136. var ticks = [];
  2137. for (var i = min; i < max + avg; i = i + avg) {
  2138. ticks.push(Math.pow(i, exponent));
  2139. }
  2140. return ticks;
  2141. } // 获取度量计算时,value占的定义域百分比
  2142. ;
  2143. _proto._getScalePercent = function _getScalePercent(value) {
  2144. var max = this.max;
  2145. var min = this.min;
  2146. if (max === min) {
  2147. return 0;
  2148. }
  2149. var exponent = this.exponent;
  2150. var percent = (calBase(exponent, value) - calBase(exponent, min)) / (calBase(exponent, max) - calBase(exponent, min));
  2151. return percent;
  2152. }
  2153. /**
  2154. * @override
  2155. */
  2156. ;
  2157. _proto.scale = function scale(value) {
  2158. var percent = this._getScalePercent(value);
  2159. var rangeMin = this.rangeMin();
  2160. var rangeMax = this.rangeMax();
  2161. return rangeMin + percent * (rangeMax - rangeMin);
  2162. }
  2163. /**
  2164. * @override
  2165. */
  2166. ;
  2167. _proto.invert = function invert(value) {
  2168. var percent = (value - this.rangeMin()) / (this.rangeMax() - this.rangeMin());
  2169. var exponent = this.exponent;
  2170. var max = calBase(exponent, this.max);
  2171. var min = calBase(exponent, this.min);
  2172. var tmp = percent * (max - min) + min;
  2173. return Math.pow(tmp, exponent);
  2174. };
  2175. return Pow;
  2176. }(Linear);
  2177. Base.Pow = Pow;
  2178. module.exports = Pow;
  2179. /***/ })
  2180. /******/ ]);
  2181. });
  2182. //# sourceMappingURL=scale.js.map