| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124 |
- import { __assign } from "tslib";
- import { get, isArray, map, maxBy, reduce } from '@antv/util';
- import { geometry as baseGeometry } from '../../../adaptor/geometries/base';
- import { flow } from '../../../utils';
- import { getTooltipMapping } from '../../../utils/tooltip';
- import { FUNNEL_CONVERSATION, FUNNEL_PERCENT, FUNNEL_TOTAL_PERCENT, PLOYGON_X, PLOYGON_Y } from '../constant';
- import { conversionTagComponent } from './common';
- /**
- * 动态高度漏斗图
- * @param params
- * 需求: 每个漏斗项的高度根据 yfield 等比生成。漏斗上下宽度比为2,即斜率为 2。
- * 实现方式: 使用 g2 多边形,data -> 点坐标 -> 绘制
- * 以漏斗底部中心点为坐标轴原点,漏斗在 -0.5 <= x <= 0.5, 0 <= y <= 1 的正方形中绘制
- * 先计算第一象限的点, 第二象限的点即为镜像 x 轴取反。
- * 第一象限共需计算 data.length + 1 个点,在 y = 4x - 1 上。首尾分别是[0.5, 1], [0.25, 0]。根据 data 计算出 y 值,从而得到 y 值
- */
- /**
- * 处理数据
- * @param params
- */
- function field(params) {
- var chart = params.chart, options = params.options;
- var _a = options.data, data = _a === void 0 ? [] : _a, yField = options.yField;
- // 计算各数据项所占高度
- var sum = reduce(data, function (total, item) {
- return total + (item[yField] || 0);
- }, 0);
- var max = maxBy(data, yField)[yField];
- var formatData = map(data, function (row, index) {
- // 储存四个点 x,y 坐标,方向为顺时针,即 [左上, 右上,右下,左下]
- var x = [];
- var y = [];
- row[FUNNEL_TOTAL_PERCENT] = (row[yField] || 0) / sum;
- // 获取左上角,右上角坐标
- if (index) {
- var preItemX = data[index - 1][PLOYGON_X];
- var preItemY = data[index - 1][PLOYGON_Y];
- x[0] = preItemX[3];
- y[0] = preItemY[3];
- x[1] = preItemX[2];
- y[1] = preItemY[2];
- }
- else {
- x[0] = -0.5;
- y[0] = 1;
- x[1] = 0.5;
- y[1] = 1;
- }
- // 获取右下角坐标
- y[2] = y[1] - row[FUNNEL_TOTAL_PERCENT];
- x[2] = (y[2] + 1) / 4;
- y[3] = y[2];
- x[3] = -x[2];
- // 赋值
- row[PLOYGON_X] = x;
- row[PLOYGON_Y] = y;
- row[FUNNEL_PERCENT] = (row[yField] || 0) / max;
- row[FUNNEL_CONVERSATION] = [get(data, [index - 1, yField]), row[yField]];
- return row;
- });
- chart.data(formatData);
- return params;
- }
- /**
- * geometry处理
- * @param params
- */
- function geometry(params) {
- var chart = params.chart, options = params.options;
- var xField = options.xField, yField = options.yField, color = options.color, tooltip = options.tooltip, label = options.label, funnelStyle = options.funnelStyle, state = options.state;
- var _a = getTooltipMapping(tooltip, [xField, yField]), fields = _a.fields, formatter = _a.formatter;
- // 绘制漏斗图
- baseGeometry({
- chart: chart,
- options: {
- type: 'polygon',
- xField: PLOYGON_X,
- yField: PLOYGON_Y,
- colorField: xField,
- tooltipFields: isArray(fields) && fields.concat([FUNNEL_PERCENT, FUNNEL_CONVERSATION]),
- label: label,
- state: state,
- mapping: {
- tooltip: formatter,
- color: color,
- style: funnelStyle,
- },
- },
- });
- return params;
- }
- /**
- * 转置处理
- * @param params
- */
- function transpose(params) {
- var chart = params.chart, options = params.options;
- var isTransposed = options.isTransposed;
- chart.coordinate({
- type: 'rect',
- actions: isTransposed ? [['transpose'], ['reflect', 'x']] : [],
- });
- return params;
- }
- /**
- * 转化率组件
- * @param params
- */
- function conversionTag(params) {
- var getLineCoordinate = function (datum, datumIndex, data, initLineOption) {
- return __assign(__assign({}, initLineOption), { start: [datum[PLOYGON_X][1], datum[PLOYGON_Y][1]], end: [datum[PLOYGON_X][1] + 0.05, datum[PLOYGON_Y][1]] });
- };
- conversionTagComponent(getLineCoordinate)(params);
- return params;
- }
- /**
- * 动态高度漏斗
- * @param chart
- * @param options
- */
- export function dynamicHeightFunnel(params) {
- return flow(field, geometry, transpose, conversionTag)(params);
- }
- //# sourceMappingURL=dynamic-height.js.map
|