MCPcopy
hub / github.com/apache/echarts / funnelLayout

Function funnelLayout

src/chart/funnel/funnelLayout.ts:252–397  ·  view source on GitHub ↗
(ecModel: GlobalModel, api: ExtensionAPI)

Source from the content-addressed store, hash-verified

250export const funnelLayoutStageHandler = createSimpleOverallStageHandler(SERIES_TYPE_FUNNEL, funnelLayout);
251
252function funnelLayout(ecModel: GlobalModel, api: ExtensionAPI) {
253 ecModel.eachSeriesByType(SERIES_TYPE_FUNNEL, function (seriesModel: FunnelSeriesModel) {
254 const data = seriesModel.getData();
255 const valueDim = data.mapDimension('value');
256 const sort = seriesModel.get('sort');
257
258 const layoutRef = layout.createBoxLayoutReference(seriesModel, api);
259 const viewRect = layout.getLayoutRect(seriesModel.getBoxLayoutParams(), layoutRef.refContainer);
260
261 const isHorizontal = isOrientHorizontal(seriesModel);
262 const viewWidth = viewRect.width;
263 const viewHeight = viewRect.height;
264 let indices = getSortedIndices(data, sort);
265 let x = viewRect.x;
266 let y = viewRect.y;
267
268 const sizeExtent = isHorizontal ? [
269 parsePercent(seriesModel.get('minSize'), viewHeight),
270 parsePercent(seriesModel.get('maxSize'), viewHeight)
271 ] : [
272 parsePercent(seriesModel.get('minSize'), viewWidth),
273 parsePercent(seriesModel.get('maxSize'), viewWidth)
274 ];
275 const dataExtent = data.getDataExtent(valueDim);
276 let min = seriesModel.get('min');
277 let max = seriesModel.get('max');
278 if (min == null) {
279 min = Math.min(dataExtent[0], 0);
280 }
281 if (max == null) {
282 max = dataExtent[1];
283 }
284
285 const funnelAlign = seriesModel.get('funnelAlign');
286 let gap = seriesModel.get('gap');
287 const viewSize = isHorizontal ? viewWidth : viewHeight;
288 let itemSize = (viewSize - gap * (data.count() - 1)) / data.count();
289
290 const getLinePoints = function (idx: number, offset: number) {
291 // End point index is data.count() and we assign it 0
292 if (isHorizontal) {
293 const val = data.get(valueDim, idx) as number || 0;
294 const itemHeight = linearMap(val, [min, max], sizeExtent, true);
295 let y0;
296 switch (funnelAlign) {
297 case 'top':
298 y0 = y;
299 break;
300 case 'center':
301 y0 = y + (viewHeight - itemHeight) / 2;
302 break;
303 case 'bottom':
304 y0 = y + (viewHeight - itemHeight);
305 break;
306 }
307
308 return [
309 [offset, y0],

Callers

nothing calls this directly

Calls 13

isOrientHorizontalFunction · 0.85
getSortedIndicesFunction · 0.85
getLinePointsFunction · 0.85
labelLayoutFunction · 0.85
eachSeriesByTypeMethod · 0.80
mapDimensionMethod · 0.80
getBoxLayoutParamsMethod · 0.80
getItemModelMethod · 0.80
setItemLayoutMethod · 0.80
getDataMethod · 0.65
countMethod · 0.65
getMethod · 0.45

Tested by

no test coverage detected

Used in the wild real call sites across dependent graphs

searching dependent graphs…