adaptor.js 7.6 KB

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