UNPKG

@antv/g2plot

Version:

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

150 lines 5.97 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 color_1 = require("../../../../util/color"); function avg(arr) { var sum = 0; _.each(arr, function (value) { sum += value; }); return sum / arr.length; } function lerp(a, b, factor) { return (1 - factor) * a + factor * b; } var FunnelLabel = /** @class */ (function (_super) { tslib_1.__extends(FunnelLabel, _super); function FunnelLabel() { return _super !== null && _super.apply(this, arguments) || this; } FunnelLabel.prototype.setLabelPosition = function (point, originPoint, index) { var coord = this.get('coord'); var transposed = coord.isTransposed; var point0 = coord.convertPoint(originPoint.points[0]); var point1 = coord.convertPoint(originPoint.points[2]); var width = ((point0.x - point1.x) / 2) * (transposed ? -1 : 1); var height = ((point0.y - point1.y) / 2) * (transposed ? -1 : 1); if (transposed) { point.x -= width; } else { point.y += height; } point.textAlign = 'center'; point.textBaseline = 'middle'; }; FunnelLabel.prototype.getLabelPoint = function (labelOptions, point, index) { var total = labelOptions.text.length; function getDimValue(value, idx) { var v = value; if (_.isArray(v)) { if (labelOptions.text.length === 1) { // 如果仅一个label,多个值,取最后一个值 if (v.length <= 2) { v = v[value.length - 1]; } else { v = avg(v); } } else { v = v[idx]; } } return v; } var label = { text: labelOptions.text[index], x: 0, y: 0, start: { x: 0, y: 0 }, color: '#fff', }; label.x = getDimValue(point.x, index); label.y = getDimValue(point.y, index); this.setLabelPosition(label, point, index); var offsetPoint = this.getLabelOffset(labelOptions, index, total); if (labelOptions.offsetX) { offsetPoint.x += labelOptions.offsetX; } if (labelOptions.offsetY) { offsetPoint.y += labelOptions.offsetY; } this.transLabelPoint(label); label.start = { x: label.x, y: label.y }; label.x += offsetPoint.x; label.y += offsetPoint.y; label.color = point.color; return label; }; FunnelLabel.prototype.showLabels = function (points, shapes) { var _this = this; _super.prototype.showLabels.call(this, points, shapes); var renderer = this.get('labelsRenderer'); var labels = renderer.get('group').get('children'); var view = this.get('element').get('view'); _.each(labels, function (label, index) { var l = label; var origin = l.get('origin'); var shapeId = _this.get('element').getShapeId(origin); var shape = _this._getShape(shapeId, shapes); var adjustColor = _this.get('labelOptions').adjustColor; if (adjustColor) { _this.adjustColor(l, shape); } }); view.get('canvas').draw(); }; FunnelLabel.prototype.adjustColor = function (label, shape) { var shapeColor = shape.attr('fill'); var shapeOpacity = _.isNumber(shape.attr('opacity')) ? Math.min(Math.max(0, shape.attr('opacity')), 1) : 1; var rgb = color_1.rgb2arr(shapeColor); var gray = Math.round(rgb[0] * 0.299 + rgb[1] * 0.587 + rgb[2] * 0.114) / shapeOpacity; var fill = gray < 156 ? '#f6f6f6' : '#303030'; label.attr('fill', fill); var coord = this.get('coord'); var shapeBBox = shape.getBBox(); var _a = coord.invertMatrix(shapeBBox.x, shapeBBox.y, 1), shapeStartX = _a[0], shapeStartY = _a[1]; var _b = coord.invertMatrix(shapeBBox.width, shapeBBox.height, 0), shapeSizeX = _b[0], shapeSizeY = _b[1]; var _c = [shapeStartX + shapeSizeX, shapeStartY + shapeSizeY], shapeEndX = _c[0], shapeEndY = _c[1]; var shapeMinX = Math.min(shapeStartX, shapeEndX); var shapeMaxX = Math.max(shapeStartX, shapeEndX); var shapeMinY = Math.min(shapeStartY, shapeEndY); var shapeMaxY = Math.max(shapeStartY, shapeEndY); var compare = shape.get('__compare__'); if (compare) { var yValues = compare.yValues; label.attr({ x: compare.transpose ? (shapeMinX + shapeMaxX) / 2 : lerp(shapeMinX, shapeMaxX, yValues[0] / (yValues[0] + yValues[1])), y: compare.transpose ? lerp(shapeMinY, shapeMaxY, yValues[0] / (yValues[0] + yValues[1])) : (shapeMinY + shapeMaxY) / 2, }); } var labelBBox = label.getBBox(); var shapeContainsLabel = labelBBox.minX >= shapeMinX && labelBBox.maxX <= shapeMaxX && labelBBox.minY >= shapeMinY && labelBBox.maxY <= shapeMaxY; label.set('visible', shapeContainsLabel); }; FunnelLabel.prototype._getShape = function (shapeId, shapes) { var target; _.each(shapes, function (shape) { var s = shape; var id = s.id; if (id === shapeId) { target = s; } }); return target; }; return FunnelLabel; }(g2_1.ElementLabels)); exports.FunnelLabel = FunnelLabel; g2_1.registerElementLabels('funnelLabel', FunnelLabel); //# sourceMappingURL=funnel-label.js.map