adaptor.js 8.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233
  1. "use strict";
  2. Object.defineProperty(exports, "__esModule", { value: true });
  3. exports.adaptor = exports.animation = void 0;
  4. var tslib_1 = require("tslib");
  5. var util_1 = require("@antv/util");
  6. var common_1 = require("../../adaptor/common");
  7. var geometries_1 = require("../../adaptor/geometries");
  8. var constant_1 = require("../../constant");
  9. var utils_1 = require("../../utils");
  10. var view_1 = require("../../utils/view");
  11. var constant_2 = require("./constant");
  12. var utils_2 = require("./utils");
  13. var TOOLTIP_FIELDS = ['low', 'high', 'q1', 'q3', 'median'];
  14. var adjustCfg = [
  15. {
  16. type: 'dodge',
  17. marginRatio: 1 / 32,
  18. },
  19. ];
  20. /** 处理数据 */
  21. function data(params) {
  22. var chart = params.chart, options = params.options;
  23. chart.data((0, utils_2.transformViolinData)(options));
  24. return params;
  25. }
  26. /** 小提琴轮廓 */
  27. function violinView(params) {
  28. var chart = params.chart, options = params.options;
  29. var seriesField = options.seriesField, color = options.color, _a = options.shape, shape = _a === void 0 ? 'violin' : _a, violinStyle = options.violinStyle, tooltip = options.tooltip, state = options.state;
  30. var view = chart.createView({ id: constant_2.VIOLIN_VIEW_ID });
  31. (0, geometries_1.violin)({
  32. chart: view,
  33. options: {
  34. xField: constant_2.X_FIELD,
  35. yField: constant_2.VIOLIN_Y_FIELD,
  36. seriesField: seriesField ? seriesField : constant_2.X_FIELD,
  37. sizeField: constant_2.VIOLIN_SIZE_FIELD,
  38. tooltip: tslib_1.__assign({ fields: TOOLTIP_FIELDS }, tooltip),
  39. violin: {
  40. style: violinStyle,
  41. color: color,
  42. shape: shape,
  43. },
  44. state: state,
  45. },
  46. });
  47. view.geometries[0].adjust(adjustCfg);
  48. return params;
  49. }
  50. /** 箱线 */
  51. function boxView(params) {
  52. var chart = params.chart, options = params.options;
  53. var seriesField = options.seriesField, color = options.color, tooltip = options.tooltip, box = options.box;
  54. // 如果配置 `box` 为 false ,不渲染内部箱线图
  55. if (box === false)
  56. return params;
  57. // 边缘线
  58. var minMaxView = chart.createView({ id: constant_2.MIN_MAX_VIEW_ID });
  59. (0, geometries_1.interval)({
  60. chart: minMaxView,
  61. options: {
  62. xField: constant_2.X_FIELD,
  63. yField: constant_2.MIN_MAX_FIELD,
  64. seriesField: seriesField ? seriesField : constant_2.X_FIELD,
  65. tooltip: tslib_1.__assign({ fields: TOOLTIP_FIELDS }, tooltip),
  66. state: typeof box === 'object' ? box.state : {},
  67. interval: {
  68. color: color,
  69. size: 1,
  70. style: {
  71. lineWidth: 0,
  72. },
  73. },
  74. },
  75. });
  76. minMaxView.geometries[0].adjust(adjustCfg);
  77. // 四分点位
  78. var quantileView = chart.createView({ id: constant_2.QUANTILE_VIEW_ID });
  79. (0, geometries_1.interval)({
  80. chart: quantileView,
  81. options: {
  82. xField: constant_2.X_FIELD,
  83. yField: constant_2.QUANTILE_FIELD,
  84. seriesField: seriesField ? seriesField : constant_2.X_FIELD,
  85. tooltip: tslib_1.__assign({ fields: TOOLTIP_FIELDS }, tooltip),
  86. state: typeof box === 'object' ? box.state : {},
  87. interval: {
  88. color: color,
  89. size: 8,
  90. style: {
  91. fillOpacity: 1,
  92. },
  93. },
  94. },
  95. });
  96. quantileView.geometries[0].adjust(adjustCfg);
  97. // 中位值
  98. var medianView = chart.createView({ id: constant_2.MEDIAN_VIEW_ID });
  99. (0, geometries_1.point)({
  100. chart: medianView,
  101. options: {
  102. xField: constant_2.X_FIELD,
  103. yField: constant_2.MEDIAN_FIELD,
  104. seriesField: seriesField ? seriesField : constant_2.X_FIELD,
  105. tooltip: tslib_1.__assign({ fields: TOOLTIP_FIELDS }, tooltip),
  106. state: typeof box === 'object' ? box.state : {},
  107. point: {
  108. color: color,
  109. size: 1,
  110. style: {
  111. fill: 'white',
  112. lineWidth: 0,
  113. },
  114. },
  115. },
  116. });
  117. medianView.geometries[0].adjust(adjustCfg);
  118. // 关闭辅助 view 的轴
  119. quantileView.axis(false);
  120. minMaxView.axis(false);
  121. medianView.axis(false);
  122. // 关闭辅助 view 的图例
  123. medianView.legend(false);
  124. minMaxView.legend(false);
  125. quantileView.legend(false);
  126. return params;
  127. }
  128. /**
  129. * meta 配置
  130. */
  131. function meta(params) {
  132. var _a;
  133. var chart = params.chart, options = params.options;
  134. var meta = options.meta, xAxis = options.xAxis, yAxis = options.yAxis;
  135. var baseMeta = {};
  136. var scales = (0, utils_1.deepAssign)(baseMeta, meta, (_a = {},
  137. _a[constant_2.X_FIELD] = tslib_1.__assign(tslib_1.__assign({ sync: true }, (0, utils_1.pick)(xAxis, constant_1.AXIS_META_CONFIG_KEYS)), {
  138. // fix: dodge is not support linear attribute, please use category attribute!
  139. // 强制 x 轴类型为分类类型
  140. type: 'cat' }),
  141. _a[constant_2.VIOLIN_Y_FIELD] = tslib_1.__assign({ sync: true }, (0, utils_1.pick)(yAxis, constant_1.AXIS_META_CONFIG_KEYS)),
  142. _a[constant_2.MIN_MAX_FIELD] = tslib_1.__assign({ sync: constant_2.VIOLIN_Y_FIELD }, (0, utils_1.pick)(yAxis, constant_1.AXIS_META_CONFIG_KEYS)),
  143. _a[constant_2.QUANTILE_FIELD] = tslib_1.__assign({ sync: constant_2.VIOLIN_Y_FIELD }, (0, utils_1.pick)(yAxis, constant_1.AXIS_META_CONFIG_KEYS)),
  144. _a[constant_2.MEDIAN_FIELD] = tslib_1.__assign({ sync: constant_2.VIOLIN_Y_FIELD }, (0, utils_1.pick)(yAxis, constant_1.AXIS_META_CONFIG_KEYS)),
  145. _a));
  146. chart.scale(scales);
  147. return params;
  148. }
  149. /**
  150. * axis 配置
  151. */
  152. function axis(params) {
  153. var chart = params.chart, options = params.options;
  154. var xAxis = options.xAxis, yAxis = options.yAxis;
  155. var view = (0, utils_1.findViewById)(chart, constant_2.VIOLIN_VIEW_ID);
  156. // 为 false 则是不显示轴
  157. if (xAxis === false) {
  158. view.axis(constant_2.X_FIELD, false);
  159. }
  160. else {
  161. view.axis(constant_2.X_FIELD, xAxis);
  162. }
  163. if (yAxis === false) {
  164. view.axis(constant_2.VIOLIN_Y_FIELD, false);
  165. }
  166. else {
  167. view.axis(constant_2.VIOLIN_Y_FIELD, yAxis);
  168. }
  169. chart.axis(false);
  170. return params;
  171. }
  172. /**
  173. *
  174. * @param params
  175. * @returns
  176. */
  177. function legend(params) {
  178. var chart = params.chart, options = params.options;
  179. var legend = options.legend, seriesField = options.seriesField, shape = options.shape;
  180. if (legend === false) {
  181. chart.legend(false);
  182. }
  183. else {
  184. var legendField_1 = seriesField ? seriesField : constant_2.X_FIELD;
  185. // fixme 暂不明为啥有描边
  186. var legendOptions = (0, util_1.omit)(legend, ['selected']);
  187. if (!shape || !shape.startsWith('hollow')) {
  188. if (!(0, util_1.get)(legendOptions, ['marker', 'style', 'lineWidth'])) {
  189. (0, util_1.set)(legendOptions, ['marker', 'style', 'lineWidth'], 0);
  190. }
  191. }
  192. chart.legend(legendField_1, legendOptions);
  193. // 特殊的处理 fixme G2 层得解决这个问题
  194. if ((0, util_1.get)(legend, 'selected')) {
  195. (0, util_1.each)(chart.views, function (view) { return view.legend(legendField_1, legend); });
  196. }
  197. }
  198. return params;
  199. }
  200. /**
  201. * annotation, apply to violin view.
  202. * @param params
  203. * @returns
  204. */
  205. function annotation(params) {
  206. var chart = params.chart;
  207. var violinView = (0, utils_1.findViewById)(chart, constant_2.VIOLIN_VIEW_ID);
  208. (0, common_1.annotation)()(tslib_1.__assign(tslib_1.__assign({}, params), { chart: violinView }));
  209. return params;
  210. }
  211. /**
  212. * 动画
  213. * @param params
  214. */
  215. function animation(params) {
  216. var chart = params.chart, options = params.options;
  217. var animation = options.animation;
  218. // 所有的 Geometry 都使用同一动画(各个图形如有区别,自行覆盖)
  219. (0, util_1.each)(chart.views, function (view) {
  220. (0, view_1.addViewAnimation)(view, animation);
  221. });
  222. return params;
  223. }
  224. exports.animation = animation;
  225. /**
  226. * 小提琴图适配器
  227. * @param params
  228. */
  229. function adaptor(params) {
  230. return (0, utils_1.flow)(common_1.theme, data, violinView, boxView, meta, common_1.tooltip, axis, legend, common_1.interaction, annotation, animation)(params);
  231. }
  232. exports.adaptor = adaptor;
  233. //# sourceMappingURL=adaptor.js.map