UNPKG

@visactor/vchart

Version:

charts lib based @visactor/VGrammar

213 lines (206 loc) 11.4 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: !0 }), exports.LinearAxisMixin = exports.e2 = exports.e5 = exports.e10 = void 0; const vutils_1 = require("@visactor/vutils"), array_1 = require("../../../util/array"), util_1 = require("../util"), event_1 = require("../../../constant/event"), common_1 = require("../cartesian/util/common"), break_data_1 = require("./util/break-data"); exports.e10 = Math.sqrt(50), exports.e5 = Math.sqrt(10), exports.e2 = Math.sqrt(2); const DEFAULT_TICK_COUNT = 5; class LinearAxisMixin { constructor() { this._extend = {}, this._rawDomain = [], this.niceLabelFormatter = null; } getRawDomain() { return this._rawDomain; } setExtraAttrFromSpec() { (0, vutils_1.isValid)(this._spec.nice) && (this._nice = this._spec.nice), (0, vutils_1.isValid)(this._spec.zero) && (this._zero = this._spec.zero), this._expand = this._spec.expand, this._domain = (0, util_1.getLinearAxisSpecDomain)(this._spec); } transformScaleDomain() { this.setScaleNice(); } setLinearScaleNice() { var _a; if (!this._nice) return !1; let tickCount = 5; const tick = this._spec.tick || {}; if ((0, vutils_1.isValidNumber)(tick.forceTickCount)) tickCount = tick.forceTickCount; else if ((0, vutils_1.isFunction)(tick.tickCount)) { const range = this._scale.range(); let rangeSize = Math.abs((0, vutils_1.last)(range) - range[0]); if (1 === rangeSize && this._option) { rangeSize = (0, common_1.isXAxis)(this._orient) ? this._option.getChartViewRect().width : this._option.getChartViewRect().height; } tickCount = tick.tickCount({ axisLength: rangeSize, labelStyle: this._spec.label && this._spec.label.style }); } else tickCount = (0, vutils_1.isValidNumber)(tick.tickCount) ? tick.tickCount : 5; "accurateFirst" === this._spec.niceType && (tickCount = Math.max(5, tickCount)); const {min: min, max: max} = null !== (_a = this._domain) && void 0 !== _a ? _a : {}; return (0, vutils_1.isNil)(min) && (0, vutils_1.isNil)(max) && (0, vutils_1.isNil)(this._softMaxValue) && (0, vutils_1.isNil)(this._softMinValue) ? this._scale.nice(tickCount) : ((0, vutils_1.isValid)(min) || (0, vutils_1.isValid)(this._softMinValue)) && (0, vutils_1.isNil)(max) && (0, vutils_1.isNil)(this._softMaxValue) ? this._scale.niceMax(tickCount) : !(!(0, vutils_1.isNil)(min) || !(0, vutils_1.isNil)(this._softMinValue) || !(0, vutils_1.isValid)(max) && !(0, vutils_1.isValid)(this._softMaxValue)) && this._scale.niceMin(tickCount); } setLogScaleNice() { var _a; if (!this._nice) return !1; const {min: min, max: max} = null !== (_a = this._domain) && void 0 !== _a ? _a : {}; return (0, vutils_1.isNil)(min) && (0, vutils_1.isNil)(max) && (0, vutils_1.isNil)(this._softMaxValue) && (0, vutils_1.isNil)(this._softMinValue) ? this._scale.nice() : ((0, vutils_1.isValid)(min) || (0, vutils_1.isValid)(this._softMinValue)) && (0, vutils_1.isNil)(max) && (0, vutils_1.isNil)(this._softMaxValue) ? this._scale.niceMax() : !(!(0, vutils_1.isNil)(min) || !(0, vutils_1.isNil)(this._softMinValue) || !(0, vutils_1.isValid)(max) && !(0, vutils_1.isValid)(this._softMaxValue)) && this._scale.niceMin(); } setScaleNice() { return "log" === this._spec.type ? this.setLogScaleNice() : this.setLinearScaleNice(); } dataToPosition(values, cfg) { return this.valueToPosition(values[0]); } valueToPosition(value) { return this._scale.scale(value); } computeLinearDomain(data) { let domain = []; if (data.length) { const userSetBreaks = this._spec.breaks && this._spec.breaks.length; let minDomain, maxDomain, values = []; if (data.forEach((d => { const {min: min, max: max} = d; minDomain = void 0 === minDomain ? min : Math.min(minDomain, min), maxDomain = void 0 === maxDomain ? max : Math.max(maxDomain, max), userSetBreaks && (values = values.concat(d.values)); })), userSetBreaks) { const breakRanges = [], breaks = [], breakMaxLimit = (0, vutils_1.isNil)(this._domain.max) ? maxDomain : this._domain.max; for (let index = 0; index < this._spec.breaks.length; index++) { const {range: range} = this._spec.breaks[index]; range[0] <= range[1] && range[1] <= breakMaxLimit && (breakRanges.push(range), breaks.push(this._spec.breaks[index])); } if (breakRanges.sort(((a, b) => a[0] - b[0])), breakRanges.length) { const {domain: breakDomains, scope: breakScopes} = (0, break_data_1.breakData)(values, (0, array_1.combineDomains)(breakRanges), this._spec.breaks[0].scopeType); domain = (0, array_1.combineDomains)(breakDomains), this._break = { domain: breakDomains, scope: breakScopes, breakDomains: breakRanges, breaks: breaks }; } else domain = [ minDomain, maxDomain ]; } else domain = [ minDomain, maxDomain ]; } else domain[0] = 0, domain[1] = 0; return this.setSoftDomainMinMax(domain), this.expandDomain(domain), this.includeZero(domain), this.setDomainMinMax(domain), domain; } expandDomain(domain) { if (!this._expand) return; let domainMin = domain[0], domainMax = (0, vutils_1.last)(domain); domainMin === domainMax && (0 === domainMax ? domainMax = 1 : domainMax > 0 ? domainMin = 0 : domainMax < 0 && (domainMax = 0)), (0, vutils_1.isValid)(this._expand.min) && (domain[0] = domainMin - (domainMax - domainMin) * this._expand.min), (0, vutils_1.isValid)(this._expand.max) && (domain[domain.length - 1] = domainMax + (domainMax - domainMin) * this._expand.max); } niceDomain(domain) { const {min: userMin, max: userMax} = (0, util_1.getLinearAxisSpecDomain)(this._spec); if ((0, vutils_1.isValid)(userMin) || (0, vutils_1.isValid)(userMax) || "linear" !== this._spec.type) return domain; if (Math.abs((0, array_1.minInArr)(domain) - (0, array_1.maxInArr)(domain)) <= 1e-12) { let num = domain[0]; const flag = num >= 0 ? 1 : -1; if (num = Math.abs(num), num < 1) domain[0] = 0, domain[domain.length - 1] = 1; else { let step = num / 5; const power = Math.floor(Math.log(step) / Math.LN10), err = step / Math.pow(10, power); step = (err >= exports.e10 ? 10 : err >= exports.e5 ? 5 : err >= exports.e2 ? 2 : 1) * Math.pow(10, power), domain[0] = 0, domain[domain.length - 1] = 10 * step; } flag < 0 && (domain.reverse(), domain[0] *= -1, domain[domain.length - 1] *= -1); } return domain; } includeZero(domain) { this._zero && (domain[0] = Math.min(domain[0], 0), domain[domain.length - 1] = Math.max((0, vutils_1.last)(domain), 0)); } setExtendDomain(key, value) { if (void 0 === value) return void delete this._extend[key]; this._extend[key] = value; const domain = this._scale.domain(); if (this.extendDomain(domain), this.includeZero(domain), this.setDomainMinMax(domain), this.niceDomain(domain), this._scale.domain(domain, this._nice), this._nice) { !this.setScaleNice() && this._scale.rescale(); } this.event.emit(event_1.ChartEvent.scaleUpdate, { model: this, value: "domain" }); } extendDomain(domain) { let temp; const domainLast = domain.length - 1, reverse = domain[0] - domain[domainLast] > 0, min = reverse ? domainLast : 0, max = reverse ? 0 : domainLast; for (const key in this._extend) temp = this._extend[key], temp > domain[max] && (domain[max] = temp), temp < domain[min] && (domain[min] = temp); } getDomainSpec() { return this._domain; } setDomainMinMax(domain) { if (!this._domain) return; const {min: min, max: max} = this._domain; (0, vutils_1.isValid)(min) && (domain[0] = min), (0, vutils_1.isValid)(max) && (domain[domain.length - 1] = max); } setSoftDomainMinMax(domain) { const {softMin: softMin, softMax: softMax} = this._spec; if ((0, vutils_1.isValid)(softMin)) { let softMinValue = (0, vutils_1.isFunction)(softMin) ? softMin(domain) : softMin; (0, vutils_1.isNil)(softMinValue) && (softMinValue = domain[0]), softMinValue <= domain[0] && (domain[0] = softMinValue, this._softMinValue = softMinValue); } if ((0, vutils_1.isValid)(softMax)) { let softMaxValue = (0, vutils_1.isFunction)(softMax) ? softMax(domain) : softMax; (0, vutils_1.isNil)(softMaxValue) && (softMaxValue = (0, vutils_1.last)(domain)), softMaxValue >= (0, vutils_1.last)(domain) && (domain[domain.length - 1] = softMaxValue), this._softMaxValue = softMaxValue; } } setZero(zero) { this._zero !== zero && (this._zero = zero, this.updateScaleDomain()); } updateScaleDomain() { var _a; if (!this.isSeriesDataEnable()) return; !(null === (_a = this._rawDomain) || void 0 === _a ? void 0 : _a.length) && this._scale && this._updateRawDomain(); const data = this.collectData(), domain = this.computeLinearDomain(data); this.updateScaleDomainByModel(domain); } updateScaleDomainByModel(domain) { if (domain = null != domain ? domain : this._scale.domain(), this.extendDomain(domain), this.includeZero(domain), this.setDomainMinMax(domain), this.niceDomain(domain), this._scale.domain(domain, this._nice), this._nice) { !this.setScaleNice() && this._scale.rescale(); } this._updateNiceLabelFormatter(domain), this._domainAfterSpec = this._scale.domain(), this.event.emit(event_1.ChartEvent.scaleDomainUpdate, { model: this }), this.event.emit(event_1.ChartEvent.scaleUpdate, { model: this, value: "domain" }); } getDomainAfterSpec() { return this._domainAfterSpec; } _updateNiceLabelFormatter(domain) { const domainSpan = Math.abs((0, vutils_1.last)(domain) - domain[0]), n = Math.max(-Math.floor(Math.log10(domainSpan)), 0) + 2, unit = Math.pow(10, n); this.niceLabelFormatter = value => (0, vutils_1.isValidNumber)(+value) ? Math.round(+value * unit) / unit : value; } _updateRawDomain() { const data = this.collectData(0, !0), domain = this.computeLinearDomain(data); this._rawDomain = domain, this.event.emit(event_1.ChartEvent.scaleRawDomainUpdate, { model: this }); } _clearRawDomain() { this._rawDomain = []; } } exports.LinearAxisMixin = LinearAxisMixin; //# sourceMappingURL=linear-axis-mixin.js.map