utils.js 3.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778
  1. import { groupBy } from '@antv/util';
  2. /**
  3. * bidirectional-bar 处理数据, 通过 SERIES_FIELD_KEY 字段分成左右数据
  4. * @param xField
  5. * @param yField
  6. * @param data
  7. */
  8. export function transformData(xField, yField, seriesField, data, reverse) {
  9. var hopeData = [];
  10. yField.forEach(function (d) {
  11. data.forEach(function (k) {
  12. var _a;
  13. var obj = (_a = {},
  14. _a[xField] = k[xField],
  15. _a[seriesField] = d,
  16. _a[d] = k[d],
  17. _a);
  18. hopeData.push(obj);
  19. });
  20. });
  21. var groupData = Object.values(groupBy(hopeData, seriesField));
  22. var _a = groupData[0], data1 = _a === void 0 ? [] : _a, _b = groupData[1], data2 = _b === void 0 ? [] : _b;
  23. return reverse ? [data1.reverse(), data2.reverse()] : [data1, data2];
  24. }
  25. /**
  26. * 是否横向,默认空为横向
  27. * @param layout
  28. */
  29. export function isHorizontal(layout) {
  30. return layout !== 'vertical';
  31. }
  32. /**
  33. * 多 view 进行同步 padding 的自定义逻辑
  34. * @param chart
  35. * @param views
  36. * @param p
  37. */
  38. export function syncViewPadding(chart, views, p) {
  39. var v1 = views[0], v2 = views[1];
  40. var p1 = v1.autoPadding;
  41. var p2 = v2.autoPadding;
  42. var _a = chart.__axisPosition, layout = _a.layout, position = _a.position;
  43. // 目前只能根据布局的比例来判断 layout
  44. if (isHorizontal(layout) && position === 'top') {
  45. /**
  46. * 保证 v1 的 left 和 v2 right 的间隔相等,因为 v1 有轴
  47. * position top 即为 v1 左边,中间间距设置就为 0
  48. */
  49. v1.autoPadding = p.instance(p1.top, 0, p1.bottom, p1.left);
  50. v2.autoPadding = p.instance(p2.top, p1.left, p2.bottom, 0);
  51. }
  52. if (isHorizontal(layout) && position === 'bottom') {
  53. /**
  54. * 保证 v1 的 left 和 v2 right 的间隔相等,因为 v1 有轴
  55. * position bottom 即为 v1 的右边,v1 right = right / 2 v2 left = right / 2
  56. * + 5 是为了 让那个轴不要太贴近了,更好看
  57. */
  58. v1.autoPadding = p.instance(p1.top, p1.right / 2 + 5, p1.bottom, p1.left);
  59. v2.autoPadding = p.instance(p2.top, p2.right, p2.bottom, p1.right / 2 + 5);
  60. }
  61. if (!isHorizontal(layout) && position === 'bottom') {
  62. /**
  63. * 保证 v1 的 left 和 v2 left 的间隔相等 left 取最大值
  64. * position bottom 即为 v1 下边,v1 bottom = bottom / 2 v2 top = bottom / 2
  65. * + 5 是为了 让那个轴不要太贴近了,更好看
  66. */
  67. var left = p1.left >= p2.left ? p1.left : p2.left;
  68. v1.autoPadding = p.instance(p1.top, p1.right, p1.bottom / 2 + 5, left);
  69. v2.autoPadding = p.instance(p1.bottom / 2 + 5, p2.right, p2.bottom, left);
  70. }
  71. // 垂直状态,不建议设置position 为 top, 还是做个兼容处理
  72. if (!isHorizontal(layout) && position === 'top') {
  73. var left = p1.left >= p2.left ? p1.left : p2.left;
  74. v1.autoPadding = p.instance(p1.top, p1.right, 0, left);
  75. v2.autoPadding = p.instance(0, p2.right, p1.top, left);
  76. }
  77. }
  78. //# sourceMappingURL=utils.js.map