compare.js 5.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140
  1. import { get, isArray, isNumber, map } from '@antv/util';
  2. import { geometry as baseGeometry } from '../../../adaptor/geometries/base';
  3. import { deepAssign, flow } from '../../../utils';
  4. import { getTooltipMapping } from '../../../utils/tooltip';
  5. import { FUNNEL_CONVERSATION, FUNNEL_MAPPING_VALUE, FUNNEL_PERCENT } from '../constant';
  6. import { conversionTagComponent, transformData } from './common';
  7. /**
  8. * 处理字段数据
  9. * @param params
  10. */
  11. function field(params) {
  12. var _a;
  13. var chart = params.chart, options = params.options;
  14. var _b = options.data, data = _b === void 0 ? [] : _b, yField = options.yField;
  15. // 绘制漏斗图
  16. chart.data(data);
  17. chart.scale((_a = {},
  18. _a[yField] = {
  19. sync: true,
  20. },
  21. _a));
  22. return params;
  23. }
  24. /**
  25. * geometry处理
  26. * @param params
  27. */
  28. function geometry(params) {
  29. var chart = params.chart, options = params.options;
  30. var data = options.data, xField = options.xField, yField = options.yField, color = options.color, compareField = options.compareField, isTransposed = options.isTransposed, tooltip = options.tooltip, maxSize = options.maxSize, minSize = options.minSize, label = options.label, funnelStyle = options.funnelStyle, state = options.state, showFacetTitle = options.showFacetTitle;
  31. chart.facet('mirror', {
  32. fields: [compareField],
  33. // 漏斗图的转置规则与分面相反,默认是垂直布局
  34. transpose: !isTransposed,
  35. padding: isTransposed ? 0 : [32, 0, 0, 0],
  36. showTitle: showFacetTitle,
  37. eachView: function (view, facet) {
  38. var index = isTransposed ? facet.rowIndex : facet.columnIndex;
  39. if (!isTransposed) {
  40. view.coordinate({
  41. type: 'rect',
  42. actions: [['transpose'], ['scale', index === 0 ? -1 : 1, -1]],
  43. });
  44. }
  45. var formatterData = transformData(facet.data, data, {
  46. yField: yField,
  47. maxSize: maxSize,
  48. minSize: minSize,
  49. });
  50. view.data(formatterData);
  51. // 绘制图形
  52. var _a = getTooltipMapping(tooltip, [xField, yField, compareField]), fields = _a.fields, formatter = _a.formatter;
  53. var defaultFacetLabel = isTransposed
  54. ? {
  55. offset: index === 0 ? 10 : -23,
  56. position: (index === 0 ? 'bottom' : 'top'),
  57. }
  58. : {
  59. offset: 10,
  60. position: 'left',
  61. style: {
  62. textAlign: index === 0 ? 'end' : 'start',
  63. },
  64. };
  65. baseGeometry({
  66. chart: view,
  67. options: {
  68. type: 'interval',
  69. xField: xField,
  70. yField: FUNNEL_MAPPING_VALUE,
  71. colorField: xField,
  72. tooltipFields: isArray(fields) && fields.concat([FUNNEL_PERCENT, FUNNEL_CONVERSATION]),
  73. mapping: {
  74. // todo 暂时不提供 金字塔 shape,后续需要自定义下形状
  75. shape: 'funnel',
  76. tooltip: formatter,
  77. color: color,
  78. style: funnelStyle,
  79. },
  80. label: label === false ? false : deepAssign({}, defaultFacetLabel, label),
  81. state: state,
  82. },
  83. });
  84. },
  85. });
  86. return params;
  87. }
  88. export function compareConversionTag(params) {
  89. // @ts-ignore
  90. var chart = params.chart, index = params.index, options = params.options;
  91. var conversionTag = options.conversionTag, isTransposed = options.isTransposed;
  92. (isNumber(index) ? [chart] : chart.views).forEach(function (view, viewIndex) {
  93. // 获取形状位置,再转化为需要的转化率位置
  94. var dataArray = get(view, ['geometries', '0', 'dataArray'], []);
  95. var size = get(view, ['options', 'data', 'length']);
  96. var x = map(dataArray, function (item) { return get(item, ['0', 'nextPoints', '0', 'x']) * size - 0.5; });
  97. var getLineCoordinate = function (datum, datumIndex, data, initLineOption) {
  98. var ratio = (index || viewIndex) === 0 ? -1 : 1;
  99. return deepAssign({}, initLineOption, {
  100. start: [x[datumIndex - 1] || datumIndex - 0.5, datum[FUNNEL_MAPPING_VALUE]],
  101. end: [x[datumIndex - 1] || datumIndex - 0.5, datum[FUNNEL_MAPPING_VALUE] + 0.05],
  102. text: isTransposed
  103. ? {
  104. style: {
  105. textAlign: 'start',
  106. },
  107. }
  108. : {
  109. offsetX: conversionTag !== false ? ratio * conversionTag.offsetX : 0,
  110. style: {
  111. textAlign: (index || viewIndex) === 0 ? 'end' : 'start',
  112. },
  113. },
  114. });
  115. };
  116. conversionTagComponent(getLineCoordinate)(deepAssign({}, {
  117. chart: view,
  118. options: options,
  119. }));
  120. });
  121. }
  122. /**
  123. * 转化率组件
  124. * @param params
  125. */
  126. function conversionTag(params) {
  127. var chart = params.chart;
  128. // @ts-ignore
  129. chart.once('beforepaint', function () { return compareConversionTag(params); });
  130. return params;
  131. }
  132. /**
  133. * 对比漏斗
  134. * @param chart
  135. * @param options
  136. */
  137. export function compareFunnel(params) {
  138. return flow(field, geometry, conversionTag)(params);
  139. }
  140. //# sourceMappingURL=compare.js.map