adaptor.js 9.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276
  1. "use strict";
  2. Object.defineProperty(exports, "__esModule", { value: true });
  3. exports.adaptor = exports.tooltip = exports.meta = exports.transformOptions = void 0;
  4. var tslib_1 = require("tslib");
  5. var util_1 = require("@antv/util");
  6. var brush_1 = require("../../adaptor/brush");
  7. var common_1 = require("../../adaptor/common");
  8. var geometries_1 = require("../../adaptor/geometries");
  9. var utils_1 = require("../../utils");
  10. var util_2 = require("./util");
  11. /**
  12. * 散点图默认美观
  13. * ① data.length === 1 ② 所有数据 y 值相等 ③ 所有数据 x 值相等
  14. * @param params
  15. * @returns params
  16. */
  17. function transformOptions(options) {
  18. var _a = options.data, data = _a === void 0 ? [] : _a, xField = options.xField, yField = options.yField;
  19. if (data.length) {
  20. // x y 字段知否只有一个值,如果只有一个值,则进行优化
  21. var isOneX = true;
  22. var isOneY = true;
  23. var prev = data[0];
  24. var curr = void 0;
  25. for (var i = 1; i < data.length; i++) {
  26. curr = data[i];
  27. if (prev[xField] !== curr[xField]) {
  28. isOneX = false;
  29. }
  30. if (prev[yField] !== curr[yField]) {
  31. isOneY = false;
  32. }
  33. // 如果都不是 oneValue,那么可提前跳出循环
  34. if (!isOneX && !isOneY) {
  35. break;
  36. }
  37. prev = curr;
  38. }
  39. var keys = [];
  40. isOneX && keys.push(xField);
  41. isOneY && keys.push(yField);
  42. var meta_1 = (0, utils_1.pick)((0, util_2.getMeta)(options), keys);
  43. return (0, utils_1.deepAssign)({}, options, { meta: meta_1 });
  44. }
  45. return options;
  46. }
  47. exports.transformOptions = transformOptions;
  48. /**
  49. * 字段
  50. * @param params
  51. */
  52. function geometry(params) {
  53. var chart = params.chart, options = params.options;
  54. var data = options.data, type = options.type, color = options.color, shape = options.shape, pointStyle = options.pointStyle, shapeField = options.shapeField, colorField = options.colorField, xField = options.xField, yField = options.yField, sizeField = options.sizeField;
  55. var size = options.size;
  56. var tooltip = options.tooltip;
  57. if (sizeField) {
  58. if (!size) {
  59. size = [2, 8];
  60. }
  61. if ((0, util_1.isNumber)(size)) {
  62. size = [size, size];
  63. }
  64. }
  65. if (tooltip && !tooltip.fields) {
  66. tooltip = tslib_1.__assign(tslib_1.__assign({}, tooltip), { fields: [xField, yField, colorField, sizeField, shapeField] });
  67. }
  68. // 数据
  69. chart.data(data);
  70. // geometry
  71. (0, geometries_1.point)((0, utils_1.deepAssign)({}, params, {
  72. options: {
  73. seriesField: colorField,
  74. point: {
  75. color: color,
  76. shape: shape,
  77. size: size,
  78. style: pointStyle,
  79. },
  80. tooltip: tooltip,
  81. },
  82. }));
  83. var geometry = (0, utils_1.findGeometry)(chart, 'point');
  84. // 数据调整
  85. if (type) {
  86. geometry.adjust(type);
  87. }
  88. return params;
  89. }
  90. /**
  91. * meta 配置
  92. * @param params
  93. */
  94. function meta(params) {
  95. var _a;
  96. var options = params.options;
  97. var xAxis = options.xAxis, yAxis = options.yAxis, xField = options.xField, yField = options.yField;
  98. var newOptions = transformOptions(options);
  99. return (0, utils_1.flow)((0, common_1.scale)((_a = {},
  100. _a[xField] = xAxis,
  101. _a[yField] = yAxis,
  102. _a)))((0, utils_1.deepAssign)({}, params, { options: newOptions }));
  103. }
  104. exports.meta = meta;
  105. /**
  106. * axis 配置
  107. * @param params
  108. */
  109. function axis(params) {
  110. var chart = params.chart, options = params.options;
  111. var xAxis = options.xAxis, yAxis = options.yAxis, xField = options.xField, yField = options.yField;
  112. chart.axis(xField, xAxis);
  113. chart.axis(yField, yAxis);
  114. return params;
  115. }
  116. /**
  117. * legend 配置
  118. * @param params
  119. */
  120. function legend(params) {
  121. var chart = params.chart, options = params.options;
  122. var legend = options.legend, colorField = options.colorField, shapeField = options.shapeField, sizeField = options.sizeField, shapeLegend = options.shapeLegend, sizeLegend = options.sizeLegend;
  123. /** legend 不为 false, 则展示图例, 优先展示 color 分类图例 */
  124. var showLegend = legend !== false;
  125. if (colorField) {
  126. chart.legend(colorField, showLegend ? legend : false);
  127. }
  128. // 优先取 shapeLegend, 否则取 legend
  129. if (shapeField) {
  130. if (shapeLegend) {
  131. chart.legend(shapeField, shapeLegend);
  132. }
  133. else {
  134. chart.legend(shapeField, shapeLegend === false ? false : legend);
  135. }
  136. }
  137. if (sizeField) {
  138. chart.legend(sizeField, sizeLegend ? sizeLegend : false);
  139. }
  140. /** 默认不展示 shape 图例,当 shapeLegend 为 undefined 也不展示图例 */
  141. /** 默认没有 sizeField,则隐藏连续图例 */
  142. if (!showLegend && !shapeLegend && !sizeLegend) {
  143. chart.legend(false);
  144. }
  145. return params;
  146. }
  147. /**
  148. * 数据标签
  149. * @param params
  150. */
  151. function label(params) {
  152. var chart = params.chart, options = params.options;
  153. var label = options.label, yField = options.yField;
  154. var scatterGeometry = (0, utils_1.findGeometry)(chart, 'point');
  155. // label 为 false, 空 则不显示 label
  156. if (!label) {
  157. scatterGeometry.label(false);
  158. }
  159. else {
  160. var callback = label.callback, cfg = tslib_1.__rest(label, ["callback"]);
  161. scatterGeometry.label({
  162. fields: [yField],
  163. callback: callback,
  164. cfg: (0, utils_1.transformLabel)(cfg),
  165. });
  166. }
  167. return params;
  168. }
  169. /**
  170. * annotation 配置
  171. * - 特殊 annotation: quadrant(四象限)
  172. * @param params
  173. */
  174. function scatterAnnotation(params) {
  175. var options = params.options;
  176. var quadrant = options.quadrant;
  177. var annotationOptions = [];
  178. if (quadrant) {
  179. var _a = quadrant.xBaseline, xBaseline = _a === void 0 ? 0 : _a, _b = quadrant.yBaseline, yBaseline = _b === void 0 ? 0 : _b, labels_1 = quadrant.labels, regionStyle_1 = quadrant.regionStyle, lineStyle = quadrant.lineStyle;
  180. var defaultConfig_1 = (0, util_2.getQuadrantDefaultConfig)(xBaseline, yBaseline);
  181. // 仅支持四象限
  182. var quadrants = new Array(4).join(',').split(',');
  183. quadrants.forEach(function (_, index) {
  184. annotationOptions.push(tslib_1.__assign(tslib_1.__assign({ type: 'region', top: false }, defaultConfig_1.regionStyle[index].position), { style: (0, utils_1.deepAssign)({}, defaultConfig_1.regionStyle[index].style, regionStyle_1 === null || regionStyle_1 === void 0 ? void 0 : regionStyle_1[index]) }), tslib_1.__assign({ type: 'text', top: true }, (0, utils_1.deepAssign)({}, defaultConfig_1.labelStyle[index], labels_1 === null || labels_1 === void 0 ? void 0 : labels_1[index])));
  185. });
  186. // 生成坐标轴
  187. annotationOptions.push({
  188. type: 'line',
  189. top: false,
  190. start: ['min', yBaseline],
  191. end: ['max', yBaseline],
  192. style: (0, utils_1.deepAssign)({}, defaultConfig_1.lineStyle, lineStyle),
  193. }, {
  194. type: 'line',
  195. top: false,
  196. start: [xBaseline, 'min'],
  197. end: [xBaseline, 'max'],
  198. style: (0, utils_1.deepAssign)({}, defaultConfig_1.lineStyle, lineStyle),
  199. });
  200. }
  201. return (0, utils_1.flow)((0, common_1.annotation)(annotationOptions))(params);
  202. }
  203. // 趋势线
  204. function regressionLine(params) {
  205. var options = params.options, chart = params.chart;
  206. var regressionLine = options.regressionLine;
  207. if (regressionLine) {
  208. var style_1 = regressionLine.style, _a = regressionLine.equationStyle, equationStyle_1 = _a === void 0 ? {} : _a, _b = regressionLine.top, top_1 = _b === void 0 ? false : _b, _c = regressionLine.showEquation, showEquation_1 = _c === void 0 ? false : _c;
  209. var defaultStyle_1 = {
  210. stroke: '#9ba29a',
  211. lineWidth: 2,
  212. opacity: 0.5,
  213. };
  214. var defaulEquationStyle_1 = {
  215. x: 20,
  216. y: 20,
  217. textAlign: 'left',
  218. textBaseline: 'middle',
  219. fontSize: 14,
  220. fillOpacity: 0.5,
  221. };
  222. chart.annotation().shape({
  223. top: top_1,
  224. render: function (container, view) {
  225. var group = container.addGroup({
  226. id: "".concat(chart.id, "-regression-line"),
  227. name: 'regression-line-group',
  228. });
  229. var _a = (0, util_2.getPath)({
  230. view: view,
  231. options: options,
  232. }), path = _a[0], equation = _a[1];
  233. group.addShape('path', {
  234. name: 'regression-line',
  235. attrs: tslib_1.__assign(tslib_1.__assign({ path: path }, defaultStyle_1), style_1),
  236. });
  237. if (showEquation_1) {
  238. group.addShape('text', {
  239. name: 'regression-equation',
  240. attrs: tslib_1.__assign(tslib_1.__assign(tslib_1.__assign({}, defaulEquationStyle_1), equationStyle_1), { text: equation }),
  241. });
  242. }
  243. },
  244. });
  245. }
  246. return params;
  247. }
  248. /**
  249. * tooltip 配置
  250. * @param params
  251. */
  252. function tooltip(params) {
  253. var chart = params.chart, options = params.options;
  254. var tooltip = options.tooltip;
  255. if (tooltip) {
  256. chart.tooltip(tooltip);
  257. }
  258. else if (tooltip === false) {
  259. chart.tooltip(false);
  260. }
  261. return params;
  262. }
  263. exports.tooltip = tooltip;
  264. /**
  265. * 散点图适配器
  266. * @param chart
  267. * @param options
  268. */
  269. function adaptor(params) {
  270. // flow 的方式处理所有的配置到 G2 API
  271. return (0, utils_1.flow)(geometry, meta, axis, legend, tooltip, label,
  272. // 需要在 interaction 前面
  273. brush_1.brushInteraction, common_1.slider, common_1.scrollbar, common_1.interaction, scatterAnnotation, common_1.animation, common_1.theme, regressionLine)(params);
  274. }
  275. exports.adaptor = adaptor;
  276. //# sourceMappingURL=adaptor.js.map