dynamic-height.js 4.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124
  1. import { __assign } from "tslib";
  2. import { get, isArray, map, maxBy, reduce } from '@antv/util';
  3. import { geometry as baseGeometry } from '../../../adaptor/geometries/base';
  4. import { flow } from '../../../utils';
  5. import { getTooltipMapping } from '../../../utils/tooltip';
  6. import { FUNNEL_CONVERSATION, FUNNEL_PERCENT, FUNNEL_TOTAL_PERCENT, PLOYGON_X, PLOYGON_Y } from '../constant';
  7. import { conversionTagComponent } from './common';
  8. /**
  9. * 动态高度漏斗图
  10. * @param params
  11. * 需求: 每个漏斗项的高度根据 yfield 等比生成。漏斗上下宽度比为2,即斜率为 2。
  12. * 实现方式: 使用 g2 多边形,data -> 点坐标 -> 绘制
  13. * 以漏斗底部中心点为坐标轴原点,漏斗在 -0.5 <= x <= 0.5, 0 <= y <= 1 的正方形中绘制
  14. * 先计算第一象限的点, 第二象限的点即为镜像 x 轴取反。
  15. * 第一象限共需计算 data.length + 1 个点,在 y = 4x - 1 上。首尾分别是[0.5, 1], [0.25, 0]。根据 data 计算出 y 值,从而得到 y 值
  16. */
  17. /**
  18. * 处理数据
  19. * @param params
  20. */
  21. function field(params) {
  22. var chart = params.chart, options = params.options;
  23. var _a = options.data, data = _a === void 0 ? [] : _a, yField = options.yField;
  24. // 计算各数据项所占高度
  25. var sum = reduce(data, function (total, item) {
  26. return total + (item[yField] || 0);
  27. }, 0);
  28. var max = maxBy(data, yField)[yField];
  29. var formatData = map(data, function (row, index) {
  30. // 储存四个点 x,y 坐标,方向为顺时针,即 [左上, 右上,右下,左下]
  31. var x = [];
  32. var y = [];
  33. row[FUNNEL_TOTAL_PERCENT] = (row[yField] || 0) / sum;
  34. // 获取左上角,右上角坐标
  35. if (index) {
  36. var preItemX = data[index - 1][PLOYGON_X];
  37. var preItemY = data[index - 1][PLOYGON_Y];
  38. x[0] = preItemX[3];
  39. y[0] = preItemY[3];
  40. x[1] = preItemX[2];
  41. y[1] = preItemY[2];
  42. }
  43. else {
  44. x[0] = -0.5;
  45. y[0] = 1;
  46. x[1] = 0.5;
  47. y[1] = 1;
  48. }
  49. // 获取右下角坐标
  50. y[2] = y[1] - row[FUNNEL_TOTAL_PERCENT];
  51. x[2] = (y[2] + 1) / 4;
  52. y[3] = y[2];
  53. x[3] = -x[2];
  54. // 赋值
  55. row[PLOYGON_X] = x;
  56. row[PLOYGON_Y] = y;
  57. row[FUNNEL_PERCENT] = (row[yField] || 0) / max;
  58. row[FUNNEL_CONVERSATION] = [get(data, [index - 1, yField]), row[yField]];
  59. return row;
  60. });
  61. chart.data(formatData);
  62. return params;
  63. }
  64. /**
  65. * geometry处理
  66. * @param params
  67. */
  68. function geometry(params) {
  69. var chart = params.chart, options = params.options;
  70. var xField = options.xField, yField = options.yField, color = options.color, tooltip = options.tooltip, label = options.label, funnelStyle = options.funnelStyle, state = options.state;
  71. var _a = getTooltipMapping(tooltip, [xField, yField]), fields = _a.fields, formatter = _a.formatter;
  72. // 绘制漏斗图
  73. baseGeometry({
  74. chart: chart,
  75. options: {
  76. type: 'polygon',
  77. xField: PLOYGON_X,
  78. yField: PLOYGON_Y,
  79. colorField: xField,
  80. tooltipFields: isArray(fields) && fields.concat([FUNNEL_PERCENT, FUNNEL_CONVERSATION]),
  81. label: label,
  82. state: state,
  83. mapping: {
  84. tooltip: formatter,
  85. color: color,
  86. style: funnelStyle,
  87. },
  88. },
  89. });
  90. return params;
  91. }
  92. /**
  93. * 转置处理
  94. * @param params
  95. */
  96. function transpose(params) {
  97. var chart = params.chart, options = params.options;
  98. var isTransposed = options.isTransposed;
  99. chart.coordinate({
  100. type: 'rect',
  101. actions: isTransposed ? [['transpose'], ['reflect', 'x']] : [],
  102. });
  103. return params;
  104. }
  105. /**
  106. * 转化率组件
  107. * @param params
  108. */
  109. function conversionTag(params) {
  110. var getLineCoordinate = function (datum, datumIndex, data, initLineOption) {
  111. return __assign(__assign({}, initLineOption), { start: [datum[PLOYGON_X][1], datum[PLOYGON_Y][1]], end: [datum[PLOYGON_X][1] + 0.05, datum[PLOYGON_Y][1]] });
  112. };
  113. conversionTagComponent(getLineCoordinate)(params);
  114. return params;
  115. }
  116. /**
  117. * 动态高度漏斗
  118. * @param chart
  119. * @param options
  120. */
  121. export function dynamicHeightFunnel(params) {
  122. return flow(field, geometry, transpose, conversionTag)(params);
  123. }
  124. //# sourceMappingURL=dynamic-height.js.map