@visactor/vchart-extension 2.0.7-alpha.1 → 2.0.7-alpha.4

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (71) hide show
  1. package/build/index.js +1054 -0
  2. package/build/index.min.js +2 -2
  3. package/cjs/charts/candlestick/candlestick.js +2 -1
  4. package/cjs/charts/combination-candlestick/combination-candlestick.js +1 -2
  5. package/cjs/charts/conversion-funnel/arrow-data-transform.js +0 -1
  6. package/cjs/charts/funnel-3d/chart.js +2 -1
  7. package/cjs/components/bar-regression-line/index.d.ts +26 -0
  8. package/cjs/components/bar-regression-line/index.js +87 -0
  9. package/cjs/components/bar-regression-line/index.js.map +1 -0
  10. package/cjs/components/bar-regression-line/type.d.ts +8 -0
  11. package/cjs/components/bar-regression-line/type.js +6 -0
  12. package/cjs/components/bar-regression-line/type.js.map +1 -0
  13. package/cjs/components/histogram-regression-line/index.d.ts +22 -0
  14. package/cjs/components/histogram-regression-line/index.js +79 -0
  15. package/cjs/components/histogram-regression-line/index.js.map +1 -0
  16. package/cjs/components/histogram-regression-line/type.d.ts +8 -0
  17. package/cjs/components/histogram-regression-line/type.js +6 -0
  18. package/cjs/components/histogram-regression-line/type.js.map +1 -0
  19. package/cjs/components/regression-line/index.d.ts +2 -0
  20. package/cjs/components/regression-line/index.js +21 -0
  21. package/cjs/components/regression-line/index.js.map +1 -0
  22. package/cjs/components/regression-line/regression-line.d.ts +8 -0
  23. package/cjs/components/regression-line/regression-line.js +58 -0
  24. package/cjs/components/regression-line/regression-line.js.map +1 -0
  25. package/cjs/components/regression-line/type.d.ts +30 -0
  26. package/cjs/components/regression-line/type.js +6 -0
  27. package/cjs/components/regression-line/type.js.map +1 -0
  28. package/cjs/components/scatter-regression-line/index.d.ts +25 -0
  29. package/cjs/components/scatter-regression-line/index.js +103 -0
  30. package/cjs/components/scatter-regression-line/index.js.map +1 -0
  31. package/cjs/components/scatter-regression-line/type.d.ts +9 -0
  32. package/cjs/components/scatter-regression-line/type.js +6 -0
  33. package/cjs/components/scatter-regression-line/type.js.map +1 -0
  34. package/cjs/index.d.ts +4 -0
  35. package/cjs/index.js +3 -1
  36. package/cjs/index.js.map +1 -1
  37. package/esm/charts/candlestick/candlestick.js +2 -1
  38. package/esm/charts/combination-candlestick/combination-candlestick.js +1 -2
  39. package/esm/charts/conversion-funnel/arrow-data-transform.js +1 -2
  40. package/esm/charts/funnel-3d/chart.js +2 -1
  41. package/esm/components/bar-regression-line/index.d.ts +26 -0
  42. package/esm/components/bar-regression-line/index.js +80 -0
  43. package/esm/components/bar-regression-line/index.js.map +1 -0
  44. package/esm/components/bar-regression-line/type.d.ts +8 -0
  45. package/esm/components/bar-regression-line/type.js +2 -0
  46. package/esm/components/bar-regression-line/type.js.map +1 -0
  47. package/esm/components/histogram-regression-line/index.d.ts +22 -0
  48. package/esm/components/histogram-regression-line/index.js +75 -0
  49. package/esm/components/histogram-regression-line/index.js.map +1 -0
  50. package/esm/components/histogram-regression-line/type.d.ts +8 -0
  51. package/esm/components/histogram-regression-line/type.js +2 -0
  52. package/esm/components/histogram-regression-line/type.js.map +1 -0
  53. package/esm/components/regression-line/index.d.ts +2 -0
  54. package/esm/components/regression-line/index.js +4 -0
  55. package/esm/components/regression-line/index.js.map +1 -0
  56. package/esm/components/regression-line/regression-line.d.ts +8 -0
  57. package/esm/components/regression-line/regression-line.js +54 -0
  58. package/esm/components/regression-line/regression-line.js.map +1 -0
  59. package/esm/components/regression-line/type.d.ts +30 -0
  60. package/esm/components/regression-line/type.js +2 -0
  61. package/esm/components/regression-line/type.js.map +1 -0
  62. package/esm/components/scatter-regression-line/index.d.ts +25 -0
  63. package/esm/components/scatter-regression-line/index.js +99 -0
  64. package/esm/components/scatter-regression-line/index.js.map +1 -0
  65. package/esm/components/scatter-regression-line/type.d.ts +9 -0
  66. package/esm/components/scatter-regression-line/type.js +2 -0
  67. package/esm/components/scatter-regression-line/type.js.map +1 -0
  68. package/esm/index.d.ts +4 -0
  69. package/esm/index.js +9 -1
  70. package/esm/index.js.map +1 -1
  71. package/package.json +11 -11
@@ -22,4 +22,5 @@ const registerCandlestickChart = () => {
22
22
  (0, candlestick_1.registerCandlestickSeries)(), vchart_1.Factory.registerChart(CandlestickChart.type, CandlestickChart);
23
23
  };
24
24
 
25
- exports.registerCandlestickChart = registerCandlestickChart;
25
+ exports.registerCandlestickChart = registerCandlestickChart;
26
+ //# sourceMappingURL=candlestick.js.map
@@ -27,5 +27,4 @@ const registerCombinationCandlestickChart = () => {
27
27
  (0, candlestick_1.registerCandlestickSeries)(), vchart_1.Factory.registerChart(CombinationCandlestickChart.type, CombinationCandlestickChart);
28
28
  };
29
29
 
30
- exports.registerCombinationCandlestickChart = registerCombinationCandlestickChart;
31
- //# sourceMappingURL=combination-candlestick.js.map
30
+ exports.registerCombinationCandlestickChart = registerCombinationCandlestickChart;
@@ -95,5 +95,4 @@ function computeIndex(arrow, totalArrows) {
95
95
  return index;
96
96
  }
97
97
 
98
- //# sourceMappingURL=arrow-data-transform.js.map
99
98
  exports.conversionArrowTransform = conversionArrowTransform;
@@ -21,4 +21,5 @@ const registerFunnel3dChart = () => {
21
21
  (0, layout_1.registerLayout3d)(), (0, series_1.registerFunnel3dSeries)(), vchart_1.Factory.registerChart(Funnel3dChart.type, Funnel3dChart);
22
22
  };
23
23
 
24
- exports.registerFunnel3dChart = registerFunnel3dChart;
24
+ exports.registerFunnel3dChart = registerFunnel3dChart;
25
+ //# sourceMappingURL=chart.js.map
@@ -0,0 +1,26 @@
1
+ import type { ISpec } from '@visactor/vchart';
2
+ import type { BarRegressionLineSpec } from './type';
3
+ import type { RegressionLineData } from '../regression-line/type';
4
+ export declare function getBarRegressionLineConfig(config: Omit<BarRegressionLineSpec, 'visible'>): {
5
+ type: string;
6
+ componentType: string;
7
+ interactive: boolean;
8
+ zIndex: number;
9
+ style: {
10
+ data: (datum: any, ctx: any) => RegressionLineData[];
11
+ line: {
12
+ visible?: boolean;
13
+ style?: import("@visactor/vrender-core").ILineGraphicAttribute;
14
+ };
15
+ confidenceInterval: {
16
+ visible?: boolean;
17
+ style?: import("@visactor/vrender-core").IAreaGraphicAttribute;
18
+ };
19
+ label: {
20
+ visible?: boolean;
21
+ text: string;
22
+ style?: import("@visactor/vrender-core").ITextGraphicAttribute;
23
+ };
24
+ };
25
+ };
26
+ export declare function appendBarRegressionLineConfig(chartSpec: ISpec, spec?: BarRegressionLineSpec): void;
@@ -0,0 +1,87 @@
1
+ "use strict";
2
+
3
+ var __rest = this && this.__rest || function(s, e) {
4
+ var t = {};
5
+ for (var p in s) Object.prototype.hasOwnProperty.call(s, p) && e.indexOf(p) < 0 && (t[p] = s[p]);
6
+ if (null != s && "function" == typeof Object.getOwnPropertySymbols) {
7
+ var i = 0;
8
+ for (p = Object.getOwnPropertySymbols(s); i < p.length; i++) e.indexOf(p[i]) < 0 && Object.prototype.propertyIsEnumerable.call(s, p[i]) && (t[p[i]] = s[p[i]]);
9
+ }
10
+ return t;
11
+ };
12
+
13
+ Object.defineProperty(exports, "__esModule", {
14
+ value: !0
15
+ }), exports.appendBarRegressionLineConfig = exports.getBarRegressionLineConfig = void 0;
16
+
17
+ const vutils_1 = require("@visactor/vutils"), vchart_1 = require("@visactor/vchart"), regression_line_1 = require("../regression-line/regression-line");
18
+
19
+ function getBarRegressionLineConfig(config) {
20
+ const {color: color, line: line, confidenceInterval: confidenceInterval, label: label} = config;
21
+ return {
22
+ type: "component",
23
+ componentType: regression_line_1.REGRESSION_LINE,
24
+ interactive: !1,
25
+ zIndex: 500,
26
+ style: {
27
+ data: (datum, ctx) => {
28
+ const series = ctx.vchart.getChart().getAllSeries().filter((s => s.type === vchart_1.SeriesTypeEnum.bar)), regressionData = [];
29
+ return series && series.length && series.forEach((s => {
30
+ var _a, _b, _c;
31
+ const region = s.getRegion().getLayoutStartPoint(), start = s.getRegion().getLayoutStartPoint(), rect = s.getRegion().getLayoutRect(), yClamper = (0,
32
+ vutils_1.clamper)(start.y, start.y + rect.height), data = s.getViewData().latestData, fieldX = null === (_a = s.fieldX) || void 0 === _a ? void 0 : _a[0], fieldY = null === (_b = s.fieldY) || void 0 === _b ? void 0 : _b[0], isHorizontal = "horizontal" === s.direction, groups = s.getRawDataStatisticsByField(fieldX).values;
33
+ if (isHorizontal || !fieldX || !fieldY || !data || data.length <= 2 || groups.length <= 2) return;
34
+ const {evaluateGrid: evaluateGrid, confidenceInterval: confidenceInterval} = (0,
35
+ vutils_1.regressionPolynomial)(data, (datum => groups.indexOf(null == datum ? void 0 : datum[fieldX])), (datum => null == datum ? void 0 : datum[fieldY]), {
36
+ degree: config.degree
37
+ }), N = groups.length, lineData = evaluateGrid(N), confidenceData = confidenceInterval(N), halfBandWidth = s.getXAxisHelper().getBandwidth(0) / 2;
38
+ regressionData.push({
39
+ color: null != color ? color : null === (_c = s.getOption().globalScale.getScale("color")) || void 0 === _c ? void 0 : _c.scale(s.getSeriesKeys()[0]),
40
+ line: lineData.map((ld => {
41
+ const d = {
42
+ [fieldX]: groups[ld.x],
43
+ [fieldY]: ld.y
44
+ };
45
+ return {
46
+ x: s.dataToPositionX(d) + region.x + halfBandWidth,
47
+ y: yClamper(s.dataToPositionY(d) + region.y)
48
+ };
49
+ })),
50
+ area: confidenceData.map((c => {
51
+ const d = {
52
+ [fieldX]: groups[c.x],
53
+ [fieldY]: c.lower
54
+ };
55
+ return {
56
+ x: s.dataToPositionX(d) + region.x + halfBandWidth,
57
+ y: yClamper(s.dataToPositionY(d) + region.y),
58
+ y1: yClamper(s.dataToPositionY({
59
+ [fieldY]: c.upper
60
+ }) + region.y)
61
+ };
62
+ }))
63
+ });
64
+ })), regressionData;
65
+ },
66
+ line: line,
67
+ confidenceInterval: confidenceInterval,
68
+ label: label
69
+ }
70
+ };
71
+ }
72
+
73
+ function appendBarRegressionLineConfig(chartSpec, spec) {
74
+ var _a, _b;
75
+ spec || (spec = null !== (_a = (0, vutils_1.get)(chartSpec, regression_line_1.REGRESSION_LINE)) && void 0 !== _a ? _a : (0,
76
+ vutils_1.get)(null === (_b = chartSpec.series) || void 0 === _b ? void 0 : _b.find((s => s.type === vchart_1.SeriesTypeEnum.bar)), regression_line_1.REGRESSION_LINE));
77
+ (0, vutils_1.array)(spec).forEach((s => {
78
+ if (!1 !== s.visible) {
79
+ chartSpec.customMark || (chartSpec.customMark = []);
80
+ const {visible: visible} = s, rest = __rest(s, [ "visible" ]);
81
+ chartSpec.customMark.push(getBarRegressionLineConfig(rest));
82
+ }
83
+ }));
84
+ }
85
+
86
+ exports.getBarRegressionLineConfig = getBarRegressionLineConfig, exports.appendBarRegressionLineConfig = appendBarRegressionLineConfig;
87
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/components/bar-regression-line/index.ts"],"names":[],"mappings":"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","file":"index.js","sourcesContent":["/**\n * @description vchart 自定义组件,用于实现柱图、线图以及面积图的系列标签\n * @author zhangweixing\n */\nimport { array, clamper, get, regressionPolynomial } from '@visactor/vutils';\nimport type { Datum, ICartesianSeries, ISpec } from '@visactor/vchart';\nimport { Direction, SeriesTypeEnum } from '@visactor/vchart';\nimport type { BarRegressionLineSpec } from './type';\nimport type { RegressionLineData } from '../regression-line/type';\nimport { REGRESSION_LINE } from '../regression-line/regression-line';\n\n/**\n * 获取系列标签的 spec 配置\n * @param position 显示位置\n * @param config 系列标签的样式配置\n * @returns\n */\nexport function getBarRegressionLineConfig(config: Omit<BarRegressionLineSpec, 'visible'>) {\n const { color, line, confidenceInterval, label } = config;\n return {\n type: 'component',\n componentType: REGRESSION_LINE,\n interactive: false,\n zIndex: 500, // 高于柱子\n style: {\n data: (datum: any, ctx: any) => {\n const vchart = ctx.vchart;\n const chart = vchart.getChart();\n const series = chart.getAllSeries().filter((s: any) => s.type === SeriesTypeEnum.bar) as ICartesianSeries[];\n const regressionData: RegressionLineData[] = [];\n\n // 必须存在散点图系列\n if (series && series.length) {\n series.forEach(s => {\n const region = s.getRegion().getLayoutStartPoint();\n const start = s.getRegion().getLayoutStartPoint();\n const rect = s.getRegion().getLayoutRect();\n const yClamper = clamper(start.y, start.y + rect.height);\n\n const data = s.getViewData().latestData;\n const fieldX = s.fieldX?.[0];\n const fieldY = s.fieldY?.[0];\n const isHorizontal = s.direction === Direction.horizontal;\n const groups = s.getRawDataStatisticsByField(fieldX).values;\n\n if (isHorizontal || !fieldX || !fieldY || !data || data.length <= 2 || groups.length <= 2) {\n return;\n }\n const { evaluateGrid, confidenceInterval } = regressionPolynomial(\n data,\n (datum: Datum) => groups.indexOf(datum?.[fieldX]),\n (datum: Datum) => datum?.[fieldY],\n { degree: config.degree }\n );\n const N = groups.length;\n const lineData = evaluateGrid(N);\n const confidenceData = confidenceInterval(N);\n const halfBandWidth = s.getXAxisHelper().getBandwidth(0) / 2;\n\n regressionData.push({\n color: color ?? s.getOption().globalScale.getScale('color')?.scale(s.getSeriesKeys()[0]),\n line: lineData.map((ld: Datum) => {\n const d = { [fieldX]: groups[ld.x], [fieldY]: ld.y };\n return {\n x: s.dataToPositionX(d) + region.x + halfBandWidth,\n y: yClamper(s.dataToPositionY(d) + region.y)\n };\n }),\n area: confidenceData.map((c: Datum) => {\n const d = { [fieldX]: groups[c.x], [fieldY]: c.lower };\n return {\n x: s.dataToPositionX(d) + region.x + halfBandWidth,\n y: yClamper(s.dataToPositionY(d) + region.y),\n y1: yClamper(s.dataToPositionY({ [fieldY]: c.upper }) + region.y)\n };\n })\n });\n });\n }\n\n return regressionData;\n },\n line,\n confidenceInterval,\n label\n }\n };\n}\n\nexport function appendBarRegressionLineConfig(chartSpec: ISpec, spec?: BarRegressionLineSpec) {\n if (!spec) {\n spec =\n get(chartSpec, REGRESSION_LINE) ??\n get(\n chartSpec.series?.find(s => s.type === SeriesTypeEnum.bar),\n REGRESSION_LINE\n );\n }\n const specs = array(spec);\n\n specs.forEach((s: BarRegressionLineSpec) => {\n if (s.visible !== false) {\n if (!(chartSpec as any).customMark) {\n (chartSpec as any).customMark = [];\n }\n\n const { visible, ...rest } = s;\n (chartSpec as any).customMark.push(getBarRegressionLineConfig(rest));\n }\n });\n}\n"]}
@@ -0,0 +1,8 @@
1
+ import type { RegressionLineAttrs } from '../regression-line/type';
2
+ export interface BarRegressionLineAttrs extends RegressionLineAttrs {
3
+ degree?: number;
4
+ }
5
+ export interface BarRegressionLineSpec extends Partial<Pick<BarRegressionLineAttrs, 'line' | 'label' | 'confidenceInterval' | 'degree'>> {
6
+ visible?: boolean;
7
+ color?: string;
8
+ }
@@ -0,0 +1,6 @@
1
+ "use strict";
2
+
3
+ Object.defineProperty(exports, "__esModule", {
4
+ value: !0
5
+ });
6
+ //# sourceMappingURL=type.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/components/bar-regression-line/type.ts"],"names":[],"mappings":"","file":"type.js","sourcesContent":["import type { RegressionLineAttrs } from '../regression-line/type';\n\nexport interface BarRegressionLineAttrs extends RegressionLineAttrs {\n /**\n * 多项式回归的阶数,仅当 type 为 polynomial 时有效\n */\n degree?: number;\n}\n\nexport interface BarRegressionLineSpec\n extends Partial<Pick<BarRegressionLineAttrs, 'line' | 'label' | 'confidenceInterval' | 'degree'>> {\n /**\n * 是否显示回归线\n */\n visible?: boolean;\n /**\n * 主色,可以不设置,默认取散点图系列颜色\n */\n color?: string;\n}\n"]}
@@ -0,0 +1,22 @@
1
+ import type { ISpec } from '@visactor/vchart';
2
+ import type { HistogramRegressionLineSpec } from './type';
3
+ import type { RegressionLineData } from '../regression-line/type';
4
+ export declare function getHistogramRegressionLineConfig(type: 'kde' | 'ecdf', config: Omit<HistogramRegressionLineSpec, 'visible' | 'type'>): {
5
+ type: string;
6
+ componentType: string;
7
+ interactive: boolean;
8
+ zIndex: number;
9
+ style: {
10
+ data: (datum: any, ctx: any) => RegressionLineData[];
11
+ line: {
12
+ visible?: boolean;
13
+ style?: import("@visactor/vrender-core").ILineGraphicAttribute;
14
+ };
15
+ label: {
16
+ visible?: boolean;
17
+ text: string;
18
+ style?: import("@visactor/vrender-core").ITextGraphicAttribute;
19
+ };
20
+ };
21
+ };
22
+ export declare function appendHistogramRegressionLineConfig(chartSpec: ISpec, spec?: HistogramRegressionLineSpec | HistogramRegressionLineSpec[]): void;
@@ -0,0 +1,79 @@
1
+ "use strict";
2
+
3
+ var __rest = this && this.__rest || function(s, e) {
4
+ var t = {};
5
+ for (var p in s) Object.prototype.hasOwnProperty.call(s, p) && e.indexOf(p) < 0 && (t[p] = s[p]);
6
+ if (null != s && "function" == typeof Object.getOwnPropertySymbols) {
7
+ var i = 0;
8
+ for (p = Object.getOwnPropertySymbols(s); i < p.length; i++) e.indexOf(p[i]) < 0 && Object.prototype.propertyIsEnumerable.call(s, p[i]) && (t[p[i]] = s[p[i]]);
9
+ }
10
+ return t;
11
+ };
12
+
13
+ Object.defineProperty(exports, "__esModule", {
14
+ value: !0
15
+ }), exports.appendHistogramRegressionLineConfig = exports.getHistogramRegressionLineConfig = void 0;
16
+
17
+ const vutils_1 = require("@visactor/vutils"), vchart_1 = require("@visactor/vchart"), regression_line_1 = require("../regression-line/regression-line"), getRegressionByType = (type, data, kdeOptions) => {
18
+ switch (type) {
19
+ case "kde":
20
+ return (0, vutils_1.kde)(data, kdeOptions);
21
+
22
+ case "ecdf":
23
+ return (0, vutils_1.ecdf)(data);
24
+ }
25
+ };
26
+
27
+ function getHistogramRegressionLineConfig(type, config) {
28
+ const {line: line, label: label, color: color} = config;
29
+ return {
30
+ type: "component",
31
+ componentType: regression_line_1.REGRESSION_LINE,
32
+ interactive: !1,
33
+ zIndex: 500,
34
+ style: {
35
+ data: (datum, ctx) => {
36
+ const series = ctx.vchart.getChart().getAllSeries().filter((s => s.type === vchart_1.SeriesTypeEnum.bar)), regressionData = [];
37
+ return series && series.length && series.forEach((s => {
38
+ var _a, _b, _c, _d, _e, _f, _g, _h;
39
+ const region = s.getRegion().getLayoutStartPoint(), rawData = s._rawData, data = null == rawData ? void 0 : rawData.rawData, binTransformOptions = null === (_b = null === (_a = rawData.transformsArr) || void 0 === _a ? void 0 : _a.find((t => "bin" === t.type))) || void 0 === _b ? void 0 : _b.options, fieldX = null === (_c = s.fieldX) || void 0 === _c ? void 0 : _c[0], scaleY = s.getYAxisHelper().getScale(0), viewData = s.getViewData().latestData;
40
+ if (!(data && data.length && (null == binTransformOptions ? void 0 : binTransformOptions.field) && scaleY && viewData && viewData.length)) return;
41
+ const simpleData = data.map((entry => entry[binTransformOptions.field])), res = getRegressionByType(type, simpleData, "kde" === type ? {
42
+ bandwidth: viewData[0][null !== (_e = null === (_d = binTransformOptions.outputNames) || void 0 === _d ? void 0 : _d.x1) && void 0 !== _e ? _e : "x1"] - viewData[0][null !== (_g = null === (_f = binTransformOptions.outputNames) || void 0 === _f ? void 0 : _f.x0) && void 0 !== _g ? _g : "x0"]
43
+ } : null), N = Math.max(3, Math.floor(simpleData.length / 4)), lineData = res.evaluateGrid(N), yRange = scaleY.range(), y0 = yRange[0], y1 = (0,
44
+ vutils_1.last)(yRange), scaleR = "kde" === type ? k => scaleY.scale(k * data.length * res.bandwidth) : e => y0 + (y1 - y0) * e;
45
+ regressionData.push({
46
+ color: null != color ? color : null === (_h = s.getOption().globalScale.getScale("color")) || void 0 === _h ? void 0 : _h.scale(s.getSeriesKeys()[0]),
47
+ line: lineData.map((ld => {
48
+ const d = {
49
+ [fieldX]: ld.x
50
+ };
51
+ return {
52
+ x: s.dataToPositionX(d) + region.x,
53
+ y: scaleR(ld.y) + region.y
54
+ };
55
+ }))
56
+ });
57
+ })), regressionData;
58
+ },
59
+ line: line,
60
+ label: label
61
+ }
62
+ };
63
+ }
64
+
65
+ function appendHistogramRegressionLineConfig(chartSpec, spec) {
66
+ var _a, _b;
67
+ spec || (spec = null !== (_a = (0, vutils_1.get)(chartSpec, regression_line_1.REGRESSION_LINE)) && void 0 !== _a ? _a : (0,
68
+ vutils_1.get)(null === (_b = chartSpec.series) || void 0 === _b ? void 0 : _b.find((s => s.type === vchart_1.SeriesTypeEnum.bar)), regression_line_1.REGRESSION_LINE));
69
+ (0, vutils_1.array)(spec).forEach((s => {
70
+ if (!1 !== s.visible) {
71
+ chartSpec.customMark || (chartSpec.customMark = []);
72
+ const {type: type} = s, rest = __rest(s, [ "type" ]);
73
+ chartSpec.customMark.push(getHistogramRegressionLineConfig(type, rest));
74
+ }
75
+ }));
76
+ }
77
+
78
+ exports.getHistogramRegressionLineConfig = getHistogramRegressionLineConfig, exports.appendHistogramRegressionLineConfig = appendHistogramRegressionLineConfig;
79
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/components/histogram-regression-line/index.ts"],"names":[],"mappings":"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","file":"index.js","sourcesContent":["/**\n * @description vchart 自定义组件,用于实现柱图、线图以及面积图的系列标签\n * @author zhangweixing\n */\n\nimport type { KDEEvaluator } from '@visactor/vutils';\nimport { array, get, kde, ecdf, last } from '@visactor/vutils';\nimport type { Datum, ICartesianSeries, ISpec } from '@visactor/vchart';\nimport { SeriesTypeEnum } from '@visactor/vchart';\nimport type { HistogramRegressionLineSpec } from './type';\nimport type { RegressionLineData } from '../regression-line/type';\nimport { REGRESSION_LINE } from '../regression-line/regression-line';\n\nconst getRegressionByType = (type: 'kde' | 'ecdf', data: number[], kdeOptions?: any) => {\n switch (type) {\n case 'kde':\n return kde(data, kdeOptions);\n case 'ecdf':\n return ecdf(data);\n }\n};\n\n/**\n * 获取系列标签的 spec 配置\n * @param position 显示位置\n * @param config 系列标签的样式配置\n * @returns\n */\nexport function getHistogramRegressionLineConfig(\n type: 'kde' | 'ecdf',\n config: Omit<HistogramRegressionLineSpec, 'visible' | 'type'>\n) {\n const { line, label, color } = config;\n return {\n type: 'component',\n componentType: REGRESSION_LINE,\n interactive: false,\n zIndex: 500, // 高于柱子\n style: {\n data: (datum: any, ctx: any) => {\n const vchart = ctx.vchart;\n const chart = vchart.getChart();\n const series = chart.getAllSeries().filter((s: any) => s.type === SeriesTypeEnum.bar) as ICartesianSeries[];\n const regressionData: RegressionLineData[] = [];\n\n // 直方图使用的是bar系列\n if (series && series.length) {\n series.forEach(s => {\n const region = s.getRegion().getLayoutStartPoint();\n\n const rawData = (s as any)._rawData;\n const data = rawData?.rawData;\n const binTransformOptions = rawData.transformsArr?.find((t: any) => t.type === 'bin')?.options;\n const fieldX = s.fieldX?.[0];\n const scaleY = s.getYAxisHelper().getScale(0);\n const viewData = s.getViewData().latestData;\n\n if (!data || !data.length || !binTransformOptions?.field || !scaleY || !viewData || !viewData.length) {\n return;\n }\n const simpleData = data.map((entry: Datum) => entry[binTransformOptions.field]);\n const res = getRegressionByType(\n type,\n simpleData,\n type === 'kde'\n ? {\n bandwidth:\n viewData[0][binTransformOptions.outputNames?.x1 ?? 'x1'] -\n viewData[0][binTransformOptions.outputNames?.x0 ?? 'x0']\n }\n : null\n );\n const N = Math.max(3, Math.floor(simpleData.length / 4));\n const lineData = res.evaluateGrid(N);\n const yRange = scaleY.range();\n const y0 = yRange[0];\n const y1 = last(yRange);\n const scaleR =\n type === 'kde'\n ? (k: number) => {\n return scaleY.scale(k * data.length * (res as KDEEvaluator).bandwidth);\n }\n : (e: number) => {\n return y0 + (y1 - y0) * e;\n };\n\n regressionData.push({\n color: color ?? s.getOption().globalScale.getScale('color')?.scale(s.getSeriesKeys()[0]),\n line: lineData.map((ld: Datum) => {\n const d = { [fieldX]: ld.x };\n return {\n x: s.dataToPositionX(d) + region.x,\n y: scaleR(ld.y) + region.y\n };\n })\n });\n });\n }\n\n return regressionData;\n },\n line,\n label\n }\n };\n}\n\nexport function appendHistogramRegressionLineConfig(\n chartSpec: ISpec,\n spec?: HistogramRegressionLineSpec | HistogramRegressionLineSpec[]\n) {\n if (!spec) {\n spec =\n get(chartSpec, REGRESSION_LINE) ??\n get(\n chartSpec.series?.find(s => s.type === SeriesTypeEnum.bar),\n REGRESSION_LINE\n );\n }\n const specs = array(spec);\n\n specs.forEach((s: HistogramRegressionLineSpec) => {\n if (s.visible !== false) {\n if (!(chartSpec as any).customMark) {\n (chartSpec as any).customMark = [];\n }\n const { type, ...rest } = s;\n (chartSpec as any).customMark.push(getHistogramRegressionLineConfig(type, rest));\n }\n });\n}\n"]}
@@ -0,0 +1,8 @@
1
+ import type { RegressionLineAttrs } from '../regression-line/type';
2
+ export interface HistogramRegressionLineAttrs extends Omit<RegressionLineAttrs, 'confidenceInterval'> {
3
+ type: 'kde' | 'ecdf';
4
+ }
5
+ export interface HistogramRegressionLineSpec extends Partial<Pick<HistogramRegressionLineAttrs, 'type' | 'line' | 'label'>> {
6
+ visible?: boolean;
7
+ color?: string;
8
+ }
@@ -0,0 +1,6 @@
1
+ "use strict";
2
+
3
+ Object.defineProperty(exports, "__esModule", {
4
+ value: !0
5
+ });
6
+ //# sourceMappingURL=type.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/components/histogram-regression-line/type.ts"],"names":[],"mappings":"","file":"type.js","sourcesContent":["import type { RegressionLineAttrs } from '../regression-line/type';\n\nexport interface HistogramRegressionLineAttrs extends Omit<RegressionLineAttrs, 'confidenceInterval'> {\n type: 'kde' | 'ecdf';\n}\n\nexport interface HistogramRegressionLineSpec\n extends Partial<Pick<HistogramRegressionLineAttrs, 'type' | 'line' | 'label'>> {\n /**\n * 是否显示回归线\n */\n visible?: boolean;\n /**\n * 主色,可以不设置,默认取散点图系列颜色\n */\n color?: string;\n}\n"]}
@@ -0,0 +1,2 @@
1
+ export * from './regression-line';
2
+ export * from './type';
@@ -0,0 +1,21 @@
1
+ "use strict";
2
+
3
+ var __createBinding = this && this.__createBinding || (Object.create ? function(o, m, k, k2) {
4
+ void 0 === k2 && (k2 = k);
5
+ var desc = Object.getOwnPropertyDescriptor(m, k);
6
+ desc && !("get" in desc ? !m.__esModule : desc.writable || desc.configurable) || (desc = {
7
+ enumerable: !0,
8
+ get: function() {
9
+ return m[k];
10
+ }
11
+ }), Object.defineProperty(o, k2, desc);
12
+ } : function(o, m, k, k2) {
13
+ void 0 === k2 && (k2 = k), o[k2] = m[k];
14
+ }), __exportStar = this && this.__exportStar || function(m, exports) {
15
+ for (var p in m) "default" === p || Object.prototype.hasOwnProperty.call(exports, p) || __createBinding(exports, m, p);
16
+ };
17
+
18
+ Object.defineProperty(exports, "__esModule", {
19
+ value: !0
20
+ }), __exportStar(require("./regression-line"), exports), __exportStar(require("./type"), exports);
21
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/components/regression-line/index.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;AAAA,oDAAkC;AAClC,yCAAuB","file":"index.js","sourcesContent":["export * from './regression-line';\nexport * from './type';\n"]}
@@ -0,0 +1,8 @@
1
+ import { AbstractComponent } from '@visactor/vrender-components';
2
+ import type { RegressionLineAttrs } from '../regression-line/type';
3
+ export declare const REGRESSION_LINE = "regressionLine";
4
+ export declare class RegressionLine extends AbstractComponent<Required<RegressionLineAttrs>> {
5
+ name: string;
6
+ protected render(): void;
7
+ }
8
+ export declare const registerRegressionLine: () => void;
@@ -0,0 +1,58 @@
1
+ "use strict";
2
+
3
+ Object.defineProperty(exports, "__esModule", {
4
+ value: !0
5
+ }), exports.registerRegressionLine = exports.RegressionLine = exports.REGRESSION_LINE = void 0;
6
+
7
+ const vrender_components_1 = require("@visactor/vrender-components"), vutils_1 = require("@visactor/vutils"), vchart_1 = require("@visactor/vchart"), vrender_core_1 = require("@visactor/vrender-core");
8
+
9
+ exports.REGRESSION_LINE = "regressionLine";
10
+
11
+ class RegressionLine extends vrender_components_1.AbstractComponent {
12
+ constructor() {
13
+ super(...arguments), this.name = exports.REGRESSION_LINE;
14
+ }
15
+ render() {
16
+ this.removeAllChild();
17
+ const {data: data, line: line = {}, label: label, name: name = "regression-line", confidenceInterval: confidenceInterval} = this.attribute;
18
+ (0, vutils_1.isEmpty)(data) || data.forEach((d => {
19
+ const {color: color} = d;
20
+ if (d.area && !1 !== (null == confidenceInterval ? void 0 : confidenceInterval.visible)) {
21
+ const areaShape = (0, vrender_core_1.createArea)(Object.assign(Object.assign({
22
+ points: d.area
23
+ }, (0, vutils_1.isValid)(color) ? {
24
+ fill: color,
25
+ fillOpacity: .12
26
+ } : null), null == confidenceInterval ? void 0 : confidenceInterval.style));
27
+ areaShape.name = "scatter-regression-area", this.add(areaShape);
28
+ }
29
+ if (d.line && !1 !== (null == line ? void 0 : line.visible)) {
30
+ const lineShape = (0, vrender_core_1.createLine)(Object.assign(Object.assign({
31
+ points: d.line,
32
+ lineWidth: 1
33
+ }, (0, vutils_1.isValid)(color) ? {
34
+ stroke: color
35
+ } : null), null == line ? void 0 : line.style));
36
+ lineShape.name = `${name}-curve`, this.add(lineShape);
37
+ }
38
+ const lastPoint = (0, vutils_1.last)(d.line);
39
+ if (label && !1 !== label.visible && label.text && lastPoint) {
40
+ const tag = (0, vrender_core_1.createText)(Object.assign(Object.assign(Object.assign({}, lastPoint), {
41
+ text: label.text,
42
+ textAlign: "end",
43
+ textBaseline: "middle"
44
+ }), label.style));
45
+ tag.name = `${name}-label`, this.add(tag);
46
+ }
47
+ }));
48
+ }
49
+ }
50
+
51
+ exports.RegressionLine = RegressionLine;
52
+
53
+ const registerRegressionLine = () => {
54
+ vchart_1.Factory.registerGraphicComponent(exports.REGRESSION_LINE, (attrs => new RegressionLine(attrs)));
55
+ };
56
+
57
+ exports.registerRegressionLine = registerRegressionLine;
58
+ //# sourceMappingURL=regression-line.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/components/regression-line/regression-line.ts"],"names":[],"mappings":";;;AAAA,qEAAiE;AACjE,6CAA0D;AAC1D,6CAA2C;AAC3C,yDAA2F;AAG9E,QAAA,eAAe,GAAG,gBAAgB,CAAC;AAEhD,MAAa,cAAe,SAAQ,sCAAgD;IAApF;;QACE,SAAI,GAAG,uBAAe,CAAC;IAoDzB,CAAC;IAnDW,MAAM;QACd,IAAI,CAAC,cAAc,EAAE,CAAC;QACtB,MAAM,EACJ,IAAI,EACJ,IAAI,GAAG,EAAE,EACT,KAAK,EACL,IAAI,GAAG,iBAAiB,EACxB,kBAAkB,EACnB,GAAG,IAAI,CAAC,SAAgC,CAAC;QAC1C,IAAI,IAAA,gBAAO,EAAC,IAAI,CAAC,EAAE;YACjB,OAAO;SACR;QAED,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE;YACf,MAAM,EAAE,KAAK,EAAE,GAAG,CAAC,CAAC;YACpB,IAAI,CAAC,CAAC,IAAI,IAAI,CAAA,kBAAkB,aAAlB,kBAAkB,uBAAlB,kBAAkB,CAAE,OAAO,MAAK,KAAK,EAAE;gBACnD,MAAM,SAAS,GAAG,IAAA,yBAAU,gCAC1B,MAAM,EAAE,CAAC,CAAC,IAAI,IACX,CAAC,IAAA,gBAAO,EAAC,KAAK,CAAC,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,KAAK,EAAE,WAAW,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,GAC5D,kBAAkB,aAAlB,kBAAkB,uBAAlB,kBAAkB,CAAE,KAAK,EAC5B,CAAC;gBACH,SAAS,CAAC,IAAI,GAAG,yBAAyB,CAAC;gBAC3C,IAAI,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC;aACrB;YAED,IAAI,CAAC,CAAC,IAAI,IAAI,CAAA,IAAI,aAAJ,IAAI,uBAAJ,IAAI,CAAE,OAAO,MAAK,KAAK,EAAE;gBACrC,MAAM,SAAS,GAAG,IAAA,yBAAU,gCAC1B,MAAM,EAAE,CAAC,CAAC,IAAI,EACd,SAAS,EAAE,CAAC,IACT,CAAC,IAAA,gBAAO,EAAC,KAAK,CAAC,CAAC,CAAC,CAAC,EAAE,MAAM,EAAE,KAAK,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,GAC3C,IAAI,aAAJ,IAAI,uBAAJ,IAAI,CAAE,KAAK,EACd,CAAC;gBACH,SAAS,CAAC,IAAI,GAAG,GAAG,IAAI,QAAQ,CAAC;gBACjC,IAAI,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC;aACrB;YAED,MAAM,SAAS,GAAG,IAAA,aAAI,EAAC,CAAC,CAAC,IAAI,CAAC,CAAC;YAE/B,IAAI,KAAK,IAAI,KAAK,CAAC,OAAO,KAAK,KAAK,IAAI,KAAK,CAAC,IAAI,IAAI,SAAS,EAAE;gBAC/D,MAAM,GAAG,GAAG,IAAA,yBAAU,gDACjB,SAAS,KACZ,IAAI,EAAE,KAAK,CAAC,IAAI,EAChB,SAAS,EAAE,KAAK,EAChB,YAAY,EAAE,QAAQ,KACnB,KAAK,CAAC,KAAK,EACd,CAAC;gBACH,GAAG,CAAC,IAAI,GAAG,GAAG,IAAI,QAAQ,CAAC;gBAC3B,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;aACf;QACH,CAAC,CAAC,CAAC;IACL,CAAC;CACF;AArDD,wCAqDC;AAEM,MAAM,sBAAsB,GAAG,GAAG,EAAE;IACzC,gBAAO,CAAC,wBAAwB,CAC9B,uBAAe,EACf,CAAC,KAAoC,EAAE,EAAE,CAAC,IAAI,cAAc,CAAC,KAAK,CAAwB,CAC3F,CAAC;AACJ,CAAC,CAAC;AALW,QAAA,sBAAsB,0BAKjC","file":"regression-line.js","sourcesContent":["import { AbstractComponent } from '@visactor/vrender-components';\nimport { isEmpty, isValid, last } from '@visactor/vutils';\nimport { Factory } from '@visactor/vchart';\nimport { type IGraphic, createText, createLine, createArea } from '@visactor/vrender-core';\nimport type { RegressionLineAttrs } from '../regression-line/type';\n\nexport const REGRESSION_LINE = 'regressionLine';\n\nexport class RegressionLine extends AbstractComponent<Required<RegressionLineAttrs>> {\n name = REGRESSION_LINE;\n protected render() {\n this.removeAllChild();\n const {\n data,\n line = {},\n label,\n name = 'regression-line',\n confidenceInterval\n } = this.attribute as RegressionLineAttrs;\n if (isEmpty(data)) {\n return;\n }\n\n data.forEach(d => {\n const { color } = d;\n if (d.area && confidenceInterval?.visible !== false) {\n const areaShape = createArea({\n points: d.area,\n ...(isValid(color) ? { fill: color, fillOpacity: 0.12 } : null),\n ...confidenceInterval?.style\n });\n areaShape.name = 'scatter-regression-area';\n this.add(areaShape);\n }\n\n if (d.line && line?.visible !== false) {\n const lineShape = createLine({\n points: d.line,\n lineWidth: 1,\n ...(isValid(color) ? { stroke: color } : null),\n ...line?.style\n });\n lineShape.name = `${name}-curve`;\n this.add(lineShape);\n }\n\n const lastPoint = last(d.line);\n\n if (label && label.visible !== false && label.text && lastPoint) {\n const tag = createText({\n ...lastPoint,\n text: label.text,\n textAlign: 'end',\n textBaseline: 'middle',\n ...label.style\n });\n tag.name = `${name}-label`;\n this.add(tag);\n }\n });\n }\n}\n\nexport const registerRegressionLine = () => {\n Factory.registerGraphicComponent(\n REGRESSION_LINE,\n (attrs: Required<RegressionLineAttrs>) => new RegressionLine(attrs) as unknown as IGraphic\n );\n};\n"]}
@@ -0,0 +1,30 @@
1
+ import type { IAreaGraphicAttribute, IGroupGraphicAttribute, ILineGraphicAttribute, ITextGraphicAttribute } from '@visactor/vrender-core';
2
+ export interface RegressionLineData {
3
+ color?: string;
4
+ line: {
5
+ x: number;
6
+ y: number;
7
+ }[];
8
+ area?: {
9
+ x: number;
10
+ y: number;
11
+ y1: number;
12
+ }[];
13
+ }
14
+ export interface RegressionLineAttrs extends IGroupGraphicAttribute {
15
+ name?: string;
16
+ line?: {
17
+ visible?: boolean;
18
+ style?: ILineGraphicAttribute;
19
+ };
20
+ label?: {
21
+ visible?: boolean;
22
+ text: string;
23
+ style?: ITextGraphicAttribute;
24
+ };
25
+ confidenceInterval?: {
26
+ visible?: boolean;
27
+ style?: IAreaGraphicAttribute;
28
+ };
29
+ data: RegressionLineData[];
30
+ }
@@ -0,0 +1,6 @@
1
+ "use strict";
2
+
3
+ Object.defineProperty(exports, "__esModule", {
4
+ value: !0
5
+ });
6
+ //# sourceMappingURL=type.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/components/regression-line/type.ts"],"names":[],"mappings":"","file":"type.js","sourcesContent":["import type {\n IAreaGraphicAttribute,\n IGroupGraphicAttribute,\n ILineGraphicAttribute,\n ITextGraphicAttribute\n} from '@visactor/vrender-core';\n\n/**\n * 回归线数据格式\n */\nexport interface RegressionLineData {\n /**\n * 颜色值\n */\n color?: string;\n /**\n * 回归线数据点\n */\n line: { x: number; y: number }[];\n /**\n * 置信区间数据点\n */\n area?: { x: number; y: number; y1: number }[];\n}\n\nexport interface RegressionLineAttrs extends IGroupGraphicAttribute {\n /**\n * 用于区分的名称\n */\n name?: string;\n /**\n * 回归线配置\n */\n line?: {\n /**\n * 是否显示系列标签\n * @default true\n */\n visible?: boolean;\n /**\n * 线样式\n */\n style?: ILineGraphicAttribute;\n };\n /**\n * 回归线公式标签\n */\n label?: {\n /**\n * 是否显示标签\n */\n visible?: boolean;\n /**\n * 标签文本\n */\n text: string;\n /**\n * 标签样式\n */\n style?: ITextGraphicAttribute;\n };\n /**\n * 置信区间\n */\n confidenceInterval?: {\n visible?: boolean;\n style?: IAreaGraphicAttribute;\n };\n\n data: RegressionLineData[];\n}\n"]}
@@ -0,0 +1,25 @@
1
+ import type { ISpec } from '@visactor/vchart';
2
+ import type { ScatterRegressionLineSpec } from './type';
3
+ import type { RegressionLineData } from '../regression-line/type';
4
+ export declare function getScatterRegressionLineConfig(type: 'linear' | 'logisitc' | 'lowess' | 'polynomial', config: Omit<ScatterRegressionLineSpec, 'visible' | 'type'>): {
5
+ type: string;
6
+ componentType: string;
7
+ interactive: boolean;
8
+ style: {
9
+ data: (datum: any, ctx: any) => RegressionLineData[];
10
+ line: {
11
+ visible?: boolean;
12
+ style?: import("@visactor/vrender-core").ILineGraphicAttribute;
13
+ };
14
+ confidenceInterval: {
15
+ visible?: boolean;
16
+ style?: import("@visactor/vrender-core").IAreaGraphicAttribute;
17
+ };
18
+ label: {
19
+ visible?: boolean;
20
+ text: string;
21
+ style?: import("@visactor/vrender-core").ITextGraphicAttribute;
22
+ };
23
+ };
24
+ };
25
+ export declare function appendScatterRegressionLineConfig(chartSpec: ISpec, spec?: ScatterRegressionLineSpec | ScatterRegressionLineSpec[]): void;
@@ -0,0 +1,103 @@
1
+ "use strict";
2
+
3
+ var __rest = this && this.__rest || function(s, e) {
4
+ var t = {};
5
+ for (var p in s) Object.prototype.hasOwnProperty.call(s, p) && e.indexOf(p) < 0 && (t[p] = s[p]);
6
+ if (null != s && "function" == typeof Object.getOwnPropertySymbols) {
7
+ var i = 0;
8
+ for (p = Object.getOwnPropertySymbols(s); i < p.length; i++) e.indexOf(p[i]) < 0 && Object.prototype.propertyIsEnumerable.call(s, p[i]) && (t[p[i]] = s[p[i]]);
9
+ }
10
+ return t;
11
+ };
12
+
13
+ Object.defineProperty(exports, "__esModule", {
14
+ value: !0
15
+ }), exports.appendScatterRegressionLineConfig = exports.getScatterRegressionLineConfig = void 0;
16
+
17
+ const vutils_1 = require("@visactor/vutils"), vchart_1 = require("@visactor/vchart"), regression_line_1 = require("../regression-line/regression-line"), getRegressionByType = (type, data, x = (d => d.x), y = (d => d.y), degree) => {
18
+ switch (type) {
19
+ case "logisitc":
20
+ return (0, vutils_1.regressionLogistic)(data, x, y);
21
+
22
+ case "lowess":
23
+ return (0, vutils_1.regressionLowess)(data, x, y);
24
+
25
+ case "polynomial":
26
+ return (0, vutils_1.regressionPolynomial)(data, x, y, {
27
+ degree: degree
28
+ });
29
+
30
+ default:
31
+ return (0, vutils_1.regressionLinear)(data, x, y);
32
+ }
33
+ };
34
+
35
+ function getScatterRegressionLineConfig(type, config) {
36
+ const {color: color, line: line, confidenceInterval: confidenceInterval, label: label} = config;
37
+ return {
38
+ type: "component",
39
+ componentType: regression_line_1.REGRESSION_LINE,
40
+ interactive: !1,
41
+ style: {
42
+ data: (datum, ctx) => {
43
+ const series = ctx.vchart.getChart().getAllSeries().filter((s => s.type === vchart_1.SeriesTypeEnum.scatter)), regressionData = [];
44
+ return series && series.length && series.forEach((s => {
45
+ var _a, _b;
46
+ const start = s.getRegion().getLayoutStartPoint(), rect = s.getRegion().getLayoutRect(), yClamper = (0,
47
+ vutils_1.clamper)(start.y, start.y + rect.height), colorAttrOptions = s.getColorAttribute(), groups = s.getSeriesKeys(), data = s.getViewData().latestData, fieldX = null === (_a = s.fieldX) || void 0 === _a ? void 0 : _a[0], fieldY = null === (_b = s.fieldY) || void 0 === _b ? void 0 : _b[0];
48
+ fieldX && fieldY && data && !(data.length <= 2) && groups.forEach((group => {
49
+ var _a;
50
+ const groupData = data.filter((d => d[null == colorAttrOptions ? void 0 : colorAttrOptions.field] === group));
51
+ if (!groupData.length) return;
52
+ const {evaluateGrid: evaluateGrid, confidenceInterval: confidenceInterval} = getRegressionByType(type, groupData, (datum => null == datum ? void 0 : datum[fieldX]), (datum => null == datum ? void 0 : datum[fieldY]), config.polynomialDegree), N = Math.max(3, Math.floor(groupData.length / 4)), lineData = evaluateGrid(N), confidenceData = confidenceInterval(N);
53
+ regressionData.push({
54
+ color: null != color ? color : null === (_a = null == colorAttrOptions ? void 0 : colorAttrOptions.scale) || void 0 === _a ? void 0 : _a.scale(group),
55
+ line: lineData.map((ld => {
56
+ const d = {
57
+ [fieldX]: ld.x,
58
+ [fieldY]: ld.y
59
+ };
60
+ return {
61
+ x: s.dataToPositionX(d) + start.x,
62
+ y: yClamper("logisitc" === type ? start.y + rect.height * (1 - ld.y) : s.dataToPositionY(d) + start.y)
63
+ };
64
+ })),
65
+ area: confidenceData.map((c => {
66
+ const d = {
67
+ [fieldX]: c.x,
68
+ [fieldY]: c.lower
69
+ };
70
+ return {
71
+ x: s.dataToPositionX(d) + start.x,
72
+ y: yClamper(s.dataToPositionY(d) + start.y),
73
+ y1: yClamper(s.dataToPositionY({
74
+ [fieldY]: c.upper
75
+ }) + start.y)
76
+ };
77
+ }))
78
+ });
79
+ }));
80
+ })), regressionData;
81
+ },
82
+ line: line,
83
+ confidenceInterval: confidenceInterval,
84
+ label: label
85
+ }
86
+ };
87
+ }
88
+
89
+ function appendScatterRegressionLineConfig(chartSpec, spec) {
90
+ var _a, _b;
91
+ spec || (spec = null !== (_a = (0, vutils_1.get)(chartSpec, regression_line_1.REGRESSION_LINE)) && void 0 !== _a ? _a : (0,
92
+ vutils_1.get)(null === (_b = chartSpec.series) || void 0 === _b ? void 0 : _b.find((s => s.type === vchart_1.SeriesTypeEnum.scatter)), regression_line_1.REGRESSION_LINE));
93
+ (0, vutils_1.array)(spec).forEach((s => {
94
+ if (!1 !== s.visible) {
95
+ chartSpec.customMark || (chartSpec.customMark = []);
96
+ const {type: type} = s, rest = __rest(s, [ "type" ]);
97
+ chartSpec.customMark.push(getScatterRegressionLineConfig(type, rest));
98
+ }
99
+ }));
100
+ }
101
+
102
+ exports.getScatterRegressionLineConfig = getScatterRegressionLineConfig, exports.appendScatterRegressionLineConfig = appendScatterRegressionLineConfig;
103
+ //# sourceMappingURL=index.js.map