UNPKG

@alicloud/cloud-charts

Version:

![](https://img.shields.io/npm/v/@alicloud/cloud-charts?color=%23ff8200)

217 lines (185 loc) 6.48 kB
'use strict'; import _extends from "@babel/runtime/helpers/extends"; import _inheritsLoose from "@babel/runtime/helpers/inheritsLoose"; import Base from '../common/Base'; import errorWrap from '../common/errorWrap'; import rectTooltip from '../common/rectTooltip'; import rectLegend from '../common/rectLegend'; import label from '../common/label'; import themes from '../themes/index'; import { pxToNumber, numberDecimal } from '../common/common'; import geomStyle from '../common/geomStyle'; import "./index.css"; // 3.x代码 export var Funnel = /*#__PURE__*/function (_Base) { _inheritsLoose(Funnel, _Base); function Funnel() { var _this; for (var _len = arguments.length, args = new Array(_len), _key = 0; _key < _len; _key++) { args[_key] = arguments[_key]; } _this = _Base.call.apply(_Base, [this].concat(args)) || this; _this.chartName = 'G2Funnel'; _this.legendField = 'x'; return _this; } var _proto = Funnel.prototype; _proto.getDefaultConfig = function getDefaultConfig() { return { colors: themes.order_10, legend: { position: 'top', align: '', nameFormatter: null // 可以强制覆盖,手动设置label }, tooltip: { titleFormatter: null, nameFormatter: null, valueFormatter: null }, label: false, pyramid: false, // 主方向,从上到下(vertical)、从左到右(horizontal) direction: 'vertical', // 排列位置 start,center,end align: 'center', // 尖顶漏斗图 percent: true }; }; _proto.init = function init(chart, config, data) { var defs = { type: { type: 'cat' } }; chart.scale(defs); chart.interaction('element-active'); chart.axis(false); chart.data(data); // 设置图例 rectLegend(this, chart, config, null, true); // tooltip rectTooltip(this, chart, config, { showTitle: false, showMarkers: false, showCrosshairs: false }, null, { showTitle: false, showMarkers: false, showCrosshairs: false }); // 根据传入的 direction 和 align 设置坐标系,并绘制图形 var drawType = config.direction + "-" + config.align; var geom = null; var fontSize1 = pxToNumber(themes['widgets-font-size-1']); var percentOffsetX = 0; var percentOffsetY = 0; var funnelShape = config.align === 'center' && config.pyramid ? 'pyramid' : 'funnel'; switch (drawType) { case 'vertical-left': case 'vertical-start': chart.coordinate('rect').transpose().scale(1, -1); geom = chart.interval().position('x*y').shape(funnelShape).color('x', config.colors); percentOffsetX = 3 * fontSize1; break; case 'vertical-center': chart.coordinate('rect').transpose().scale(1, -1); geom = chart.interval().adjust([{ type: 'symmetric' }]).position('x*y').shape(funnelShape).color('x', config.colors); break; case 'vertical-right': case 'vertical-end': chart.coordinate('rect').transpose().scale(-1, -1); geom = chart.interval().position('x*y').shape(funnelShape).color('x', config.colors); percentOffsetX = -3 * fontSize1; break; case 'horizontal-top': case 'horizontal-start': chart.coordinate('rect').reflect('y'); geom = chart.interval().position('x*y').shape(funnelShape).color('x', config.colors); percentOffsetY = 3 * fontSize1; break; case 'horizontal-center': geom = chart.interval().position('x*y').shape(funnelShape).color('x', config.colors).adjust([{ type: 'symmetric' }]); break; // case 'horizontal-bottom': // case 'horizontal-end': // 和 default 时相同 default: geom = chart.interval().position('x*y').shape(funnelShape).color('x', config.colors); percentOffsetY = -3 * fontSize1; } geomStyle(geom, config.geomStyle); if (config.label) { label({ geom: geom, config: config, useCustomOffset: true, componentConfig: { labelLine: { style: { lineWidth: 1, stroke: themes['widgets-axis-line'] } }, content: function content(v, item, index) { if (typeof config.label === 'boolean') { return v['y']; } if (config.label.labelFormatter) { return config.label.labelFormatter(v['y'], item, index); } return v['y']; } } }); } // 绘制辅助线,辅助背景区域 renderGuide(chart, config, data, percentOffsetX, percentOffsetY); }; return Funnel; }(Base); function renderGuide(chart, config, data, percentOffsetX, percentOffsetY) { // 中间标签文本 chart.annotation().clear(true); var configPercent = config.percent; if (!configPercent) { return; } if (configPercent === true) { configPercent = {}; } var _configPercent = configPercent, labelFormatter = _configPercent.labelFormatter, _configPercent$offset = _configPercent.offsetX, offsetX = _configPercent$offset === void 0 ? 0 : _configPercent$offset, _configPercent$offset2 = _configPercent.offsetY, offsetY = _configPercent$offset2 === void 0 ? 0 : _configPercent$offset2, _configPercent$top = _configPercent.top, top = _configPercent$top === void 0 ? true : _configPercent$top, _configPercent$style = _configPercent.style, style = _configPercent$style === void 0 ? {} : _configPercent$style; var positionY = config.align === 'center' ? 'center' : 'start'; data.forEach(function (d, i) { var content = numberDecimal(100 * d.y / data[0].y) + "%"; if (labelFormatter) { content = labelFormatter(d.y / data[0].y, d, i); } chart.annotation().text({ top: top, position: [d.x, positionY], offsetX: percentOffsetX + offsetX, offsetY: percentOffsetY + offsetY, content: content, // 显示的文本内容 style: _extends({ fill: themes['widgets-label-text'], fontSize: pxToNumber(themes['widgets-font-size-1']), textAlign: 'center', shadowBlur: 2, shadowColor: 'rgba(255, 255, 255, .3)' }, style) }); }); } var Wfunnel = errorWrap(Funnel); export default Wfunnel;