UNPKG

@antv/g2plot

Version:

G2 Plot, a market of plots built with the Grammar of Graphics'

127 lines 5.24 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); var tslib_1 = require("tslib"); var _ = tslib_1.__importStar(require("@antv/util")); var g2_1 = require("@antv/g2"); var shape_1 = require("@antv/g2/lib/element/util/shape"); // 获取填充图形的图形属性 function _getFillAttrs(cfg) { var defaultAttrs = g2_1.Global.theme.shape.interval.rect.default; var attrs = _.mix({}, defaultAttrs, cfg.style); shape_1.setFillStyle(attrs, cfg); return attrs; } // 根据数据点生成矩形的四个关键点 function _getRectPoints(cfg, isPyramid) { if (isPyramid === void 0) { isPyramid = false; } var x = cfg.x, y = cfg.y, y0 = cfg.y0, size = cfg.size; // 有 4 种情况, // 1. x, y 都不是数组 // 2. y是数组,x不是 // 3. x是数组,y不是 // 4. x, y 都是数组 var yMin; var yMax; if (_.isArray(y)) { yMin = y[0]; yMax = y[1]; } else { yMin = y0; yMax = y; } var xMin; var xMax; if (_.isArray(x)) { xMin = x[0]; xMax = x[1]; } else { xMin = x - size / 2; xMax = x + size / 2; } var points = [ { x: xMin, y: yMin }, { x: xMin, y: yMax }, ]; if (isPyramid) { // 绘制尖底漏斗图 // 金字塔漏斗图的关键点 // 1 // | 2 // 0 points.push({ x: xMax, y: (yMax + yMin) / 2, }); } else { // 矩形的四个关键点,结构如下(左下角顺时针连接) // 1 ---- 2 // | | // 0 ---- 3 points.push({ x: xMax, y: yMax }, { x: xMax, y: yMin }); } return points; } // 根据关键点绘制漏斗图的 path function _getFunnelPath(cfg, compare) { var path = []; var points = cfg.points, nextPoints = cfg.nextPoints; if (compare) { // 对比漏斗 var yValues = compare.yValues, yValuesMax = compare.yValuesMax, yValuesNext = compare.yValuesNext; var originY = (points[0].y + points[1].y) / 2; var yValueTotal_1 = yValues[0] + yValues[1]; var yRatios = yValues.map(function (yValue) { return yValue / yValueTotal_1 / 0.5; }); var yOffset = (yValuesMax[0] / (yValuesMax[0] + yValuesMax[1]) - 0.5) * 0.9; var spacing = 0.001; if (!_.isNil(nextPoints)) { var yValueTotalNext_1 = yValuesNext[0] + yValuesNext[1]; var yRatiosNext = yValuesNext.map(function (yValueNext) { return yValueNext / yValueTotalNext_1 / 0.5; }); path.push(['M', points[0].x, yOffset + (points[0].y - originY) * yRatios[0] + originY - spacing], ['L', points[1].x, yOffset + originY - spacing], ['L', nextPoints[1].x, yOffset + originY - spacing], ['L', nextPoints[0].x, yOffset + (nextPoints[3].y - originY) * yRatiosNext[0] + originY - spacing], ['Z']); path.push(['M', points[0].x, yOffset + originY + spacing], ['L', points[1].x, yOffset + (points[1].y - originY) * yRatios[1] + originY + spacing], ['L', nextPoints[1].x, yOffset + (nextPoints[2].y - originY) * yRatiosNext[1] + originY + spacing], ['L', nextPoints[0].x, yOffset + originY + spacing], ['Z']); } else { path.push(['M', points[0].x, yOffset + (points[0].y - originY) * yRatios[0] + originY], ['L', points[1].x, yOffset + originY], ['L', points[2].x, yOffset + originY], ['L', points[3].x, yOffset + (points[3].y - originY) * yRatios[0] + originY], ['Z']); path.push(['M', points[0].x, yOffset + 0.002 + originY], ['L', points[1].x, yOffset + 0.002 + (points[1].y - originY) * yRatios[1] + originY], ['L', points[2].x, yOffset + 0.002 + (points[2].y - originY) * yRatios[1] + originY], ['L', points[3].x, yOffset + 0.002 + originY], ['Z']); } } else { // 标准漏斗 if (!_.isNil(nextPoints)) { path.push(['M', points[0].x, points[0].y], ['L', points[1].x, points[1].y], ['L', nextPoints[1].x, nextPoints[1].y], ['L', nextPoints[0].x, nextPoints[0].y], ['Z']); } else { path.push(['M', points[0].x, points[0].y], ['L', points[1].x, points[1].y], ['L', points[2].x, points[2].y], ['L', points[3].x, points[3].y], ['Z']); } } return path; } g2_1.registerShape('interval', 'funnel-basic-rect', { getPoints: function (pointInfo) { pointInfo.size = pointInfo.size * 1.8; // 调整面积 return _getRectPoints(pointInfo); }, draw: function (cfg, container) { var _a; var attrs = _getFillAttrs(cfg); var compare = _.get(cfg, 'origin._origin.__compare__'); var path = _getFunnelPath(cfg, compare); path = this.parsePath(path); return container.addShape('path', (_a = { attrs: tslib_1.__assign(tslib_1.__assign({}, attrs), { path: path }) }, _a['__compare__'] = compare, _a)); }, getMarkerStyle: function (markerCfg) { var markerStyle = { symbol: 'square', radius: 4, }; shape_1.setFillStyle(markerStyle, markerCfg); return markerStyle; }, }); //# sourceMappingURL=funnel-basic-rect.js.map