dynamic-height.js 4.7 KB

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