UNPKG

echarts

Version:

Apache ECharts is a powerful, interactive charting and data visualization library for browser

291 lines (287 loc) 13.4 kB
/* * Licensed to the Apache Software Foundation (ASF) under one * or more contributor license agreements. See the NOTICE file * distributed with this work for additional information * regarding copyright ownership. The ASF licenses this file * to you under the Apache License, Version 2.0 (the * "License"); you may not use this file except in compliance * with the License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, * software distributed under the License is distributed on an * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY * KIND, either express or implied. See the License for the * specific language governing permissions and limitations * under the License. */ /** * AUTO-GENERATED FILE. DO NOT MODIFY. */ /* * Licensed to the Apache Software Foundation (ASF) under one * or more contributor license agreements. See the NOTICE file * distributed with this work for additional information * regarding copyright ownership. The ASF licenses this file * to you under the Apache License, Version 2.0 (the * "License"); you may not use this file except in compliance * with the License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, * software distributed under the License is distributed on an * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY * KIND, either express or implied. See the License for the * specific language governing permissions and limitations * under the License. */ // import * as echarts from '../../core/echarts.js'; // import { createHashMap, each, HashMap, hasOwn, keys, map } from 'zrender/lib/core/util.js'; // import SeriesModel from '../../model/Series.js'; // import { // isCartesian2DDeclaredSeries, findAxisModels, isCartesian2DInjectedAsDataCoordSys // } from './cartesianAxisHelper.js'; // import { getDataDimensionsOnAxis } from '../axisHelper.js'; // import { AxisBaseModel } from '../AxisBaseModel.js'; // import type Axis from '../Axis.js'; // import GlobalModel from '../../model/Global.js'; // import { Dictionary } from '../../util/types.js'; // import { // AXIS_EXTENT_INFO_BUILD_FROM_DATA_ZOOM, ensureScaleRawExtentInfo, ScaleRawExtentInfo, ScaleRawExtentResult // } from '../scaleRawExtentInfo.js'; // import { initExtentForUnion, unionExtentFromNumber } from '../../util/model.js'; /** * @obsolete * PENDING: * - This file is not used anywhere currently. * - This is a similar behavior to `dataZoom`, but historically supported separately. * Can it be merged into `dataZoom`? * - The impl need to be fixed, @see #15050 , and, * - Remove side-effect. * - Need to fix the case: * series_a => * x_m (category): dataExtent: [3,8] * y_i: * series_b => * x_m (category): dataExtent: [4,6] * y_j: * series_c => * x_m (category): dataExtent: [5,7] * y_j: * dataZoom control y_i, so series_a is excluded. * So x_m.condExtent = [4,6] U [5,7] = [4,7] , and use it to call ensureScaleRawExtentInfo. * (incorrect?, supposed to be [3,8]?) * * See test case `test/axis-filter-extent.html`. * * The responsibility of this processor: * Enable category axis to use the specified `min`/`max` to shrink the extent of the orthogonal axis in * Cartesian2D. That is, if some data item on a category axis is out of the range of `min`/`max`, the * extent of the orthogonal axis will exclude the data items. * A typical case is bar-racing, where bars are sorted dynamically and may only need to * displayed part of the whole bars. * * IMPL_MEMO: * - For each triple xAxis-yAxis-series, if either xAxis or yAxis is controlled by a dataZoom, * the triple should be ignored in this processor. * - Input: * - Cartesian series data ("series approximate extent" has been prepared). * - Axis original `ScaleRawExtentInfo` * (the content comes from ec option and "series approximate extent"). * - Modify(result): * - `ScaleRawExtentInfo#min/max` of the determined "target axis". * - "series approximate extent". */ // The priority is just after dataZoom processor. // echarts.registerProcessor(echarts.PRIORITY.PROCESSOR.FILTER + 10, { // getTargetSeries: function (ecModel) { // const seriesModelMap = createHashMap<SeriesModel>(); // ecModel.eachSeries(function (seriesModel: SeriesModel) { // isCartesian2DDeclaredSeries(seriesModel) && seriesModelMap.set(seriesModel.uid, seriesModel); // }); // return seriesModelMap; // }, // overallReset: function (ecModel, api) { // const seriesRecords = [] as SeriesRecord[]; // const axisRecordMap = createHashMap<AxisRecord>(); // prepareDataExtentOnAxis(ecModel, axisRecordMap, seriesRecords); // calculateFilteredExtent(axisRecordMap, seriesRecords); // shrinkAxisExtent(axisRecordMap); // } // }); // type AxisRecord = { // rawExtentInfo?: ScaleRawExtentInfo; // rawExtentResult?: ScaleRawExtentResult; // tarExtent?: number[]; // }; // type SeriesRecord = { // seriesModel: SeriesModel; // xAxisModel: AxisBaseModel; // yAxisModel: AxisBaseModel; // }; // function prepareDataExtentOnAxis( // ecModel: GlobalModel, // axisRecordMap: HashMap<AxisRecord>, // seriesRecords: SeriesRecord[] // ): void { // ecModel.eachSeries(function (seriesModel: SeriesModel) { // // If pie (or other similar series) use cartesian2d, the logic below is // // probably wrong, therefore skip it temporarily. // // TODO: support union extent in this case. // // e.g. make a fake seriesData by series.coord/series.center, and it can be // // performed by data processing (such as, filter), and applied here. // if (!isCartesian2DInjectedAsDataCoordSys(seriesModel)) { // return; // } // const axesModelMap = findAxisModels(seriesModel); // const xAxisModel = axesModelMap.xAxisModel; // const yAxisModel = axesModelMap.yAxisModel; // const xAxis = xAxisModel.axis; // const yAxis = yAxisModel.axis; // const xRawExtentInfo = ensureScaleRawExtentInfo(xAxis); // const yRawExtentInfo = ensureScaleRawExtentInfo(yAxis); // // If either axis controlled by other filter like "dataZoom", // // use the rule of dataZoom rather than adopting the rules here. // if ( // (xRawExtentInfo && xRawExtentInfo.from === AXIS_EXTENT_INFO_BUILD_FROM_DATA_ZOOM) // || (yRawExtentInfo && yRawExtentInfo.from === AXIS_EXTENT_INFO_BUILD_FROM_DATA_ZOOM) // ) { // return; // } // seriesRecords.push({ // seriesModel: seriesModel, // xAxisModel: xAxisModel, // yAxisModel: yAxisModel // }); // }); // } // function calculateFilteredExtent( // axisRecordMap: HashMap<AxisRecord>, // seriesRecords: SeriesRecord[] // ) { // each(seriesRecords, function (seriesRecord) { // const xAxisModel = seriesRecord.xAxisModel; // const yAxisModel = seriesRecord.yAxisModel; // const xAxis = xAxisModel.axis; // const yAxis = yAxisModel.axis; // const xAxisRecord = prepareAxisRecord(axisRecordMap, xAxisModel); // const yAxisRecord = prepareAxisRecord(axisRecordMap, yAxisModel); // xAxisRecord.rawExtentInfo = ensureScaleRawExtentInfo(xAxis); // yAxisRecord.rawExtentInfo = ensureScaleRawExtentInfo(yAxis); // xAxisRecord.rawExtentResult = xAxisRecord.rawExtentInfo.calculate(); // yAxisRecord.rawExtentResult = yAxisRecord.rawExtentInfo.calculate(); // const data = seriesRecord.seriesModel.getData(); // // For duplication removal. // // key: series data dimension corresponding to the condition axis. // const condDimMap: Dictionary<boolean> = {}; // // key: series data dimension corresponding to the target axis. // const tarDimMap: Dictionary<boolean> = {}; // let condAxis: Axis; // let tarAxisRecord: AxisRecord; // function addCondition(axis: Axis, axisRecord: AxisRecord) { // // But for simplicity and safety and performance, we only adopt this // // feature on category axis at present. // const rawExtentResult = axisRecord.rawExtentResult; // if (axis.type === 'category' // && (rawExtentResult.dataMinMax[0] < rawExtentResult.resultMinMax[0] // || rawExtentResult.resultMinMax[1] < rawExtentResult.dataMinMax[1] // ) // ) { // each(getDataDimensionsOnAxis(data, axis.dim), function (dataDim) { // if (!hasOwn(condDimMap, dataDim)) { // condDimMap[dataDim] = true; // condAxis = axis; // } // }); // } // } // function addTarget(axis: Axis, axisRecord: AxisRecord) { // const rawExtentResult = axisRecord.rawExtentResult; // const fixMinMax = rawExtentResult.fixMinMax; // if (axis.type !== 'category' // && (!fixMinMax[0] || !fixMinMax[1]) // ) { // each(getDataDimensionsOnAxis(data, axis.dim), function (dataDim) { // if (!hasOwn(condDimMap, dataDim) && !hasOwn(tarDimMap, dataDim)) { // tarDimMap[dataDim] = true; // tarAxisRecord = axisRecord; // } // }); // } // } // addCondition(xAxis, xAxisRecord); // addCondition(yAxis, yAxisRecord); // addTarget(xAxis, xAxisRecord); // addTarget(yAxis, yAxisRecord); // const condDims = keys(condDimMap); // const tarDims = keys(tarDimMap); // const tarDimExtents = map(tarDims, function () { // return initExtentForUnion(); // }); // const condDimsLen = condDims.length; // const tarDimsLen = tarDims.length; // if (!condDimsLen || !tarDimsLen) { // return; // } // const singleCondDim = condDimsLen === 1 ? condDims[0] : null; // const singleTarDim = tarDimsLen === 1 ? tarDims[0] : null; // const dataLen = data.count(); // // Time consuming, because this is a "block task". // // Simple optimization for the vast majority of cases. // if (singleCondDim && singleTarDim) { // for (let dataIdx = 0; dataIdx < dataLen; dataIdx++) { // const condVal = data.get(singleCondDim, dataIdx) as number; // if (condAxis.scale.contain(condVal)) { // unionExtentFromNumber(tarDimExtents[0], data.get(singleTarDim, dataIdx) as number); // } // } // } // else { // for (let dataIdx = 0; dataIdx < dataLen; dataIdx++) { // for (let j = 0; j < condDimsLen; j++) { // const condVal = data.get(condDims[j], dataIdx) as number; // if (condAxis.scale.contain(condVal)) { // for (let k = 0; k < tarDimsLen; k++) { // unionExtentFromNumber(tarDimExtents[k], data.get(tarDims[k], dataIdx) as number); // } // // Any one dim is in range means satisfied. // break; // } // } // } // } // each(tarDimExtents, function (tarDimExtent, i) { // // FIXME: if there has been approximateExtent set? // data.setApproximateExtent(tarDimExtent as [number, number], tarDims[i]); // const tarAxisExtent = tarAxisRecord.tarExtent = tarAxisRecord.tarExtent || initExtentForUnion(); // unionExtentFromNumber(tarAxisExtent, tarDimExtent[0]); // unionExtentFromNumber(tarAxisExtent, tarDimExtent[1]); // }); // }); // } // function shrinkAxisExtent(axisRecordMap: HashMap<AxisRecord>) { // axisRecordMap.each(function (axisRecord) { // const tarAxisExtent = axisRecord.tarExtent; // if (tarAxisExtent) { // const rawExtentResult = axisRecord.rawExtentResult; // const fixMinMax = rawExtentResult.fixMinMax; // // const rawExtentInfo = axisRecord.rawExtentInfo; // // Shrink the original extent. // if (!fixMinMax[0] && tarAxisExtent[0] > rawExtentResult.resultMinMax[0]) { // // rawExtentInfo.modifyDataMinMax('min', tarAxisExtent[0]); // } // if (!fixMinMax[1] && tarAxisExtent[1] < rawExtentResult.resultMinMax[1]) { // // rawExtentInfo.modifyDataMinMax('max', tarAxisExtent[1]); // } // } // }); // } // function prepareAxisRecord( // axisRecordMap: HashMap<AxisRecord>, // axisModel: AxisBaseModel // ): AxisRecord { // return axisRecordMap.get(axisModel.uid) // || axisRecordMap.set(axisModel.uid, {}); // }