@visactor/vchart-extension 2.0.7-alpha.2 → 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
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/components/scatter-regression-line/index.ts"],"names":[],"mappings":"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","file":"index.js","sourcesContent":["/**\n * @description 散点图回归线组件\n * @author kangxiaoting\n */\nimport {\n array,\n clamper,\n get,\n regressionLinear,\n regressionLogistic,\n regressionLowess,\n regressionPolynomial\n} from '@visactor/vutils';\nimport type { Datum, ICartesianSeries, ISpec } from '@visactor/vchart';\nimport { SeriesTypeEnum } from '@visactor/vchart';\nimport type { ScatterRegressionLineSpec } from './type';\nimport type { RegressionLineData } from '../regression-line/type';\nimport { REGRESSION_LINE } from '../regression-line/regression-line';\n\nconst getRegressionByType = (\n type: 'linear' | 'logisitc' | 'lowess' | 'polynomial',\n data: any[],\n x: (d: any) => number = d => d.x,\n y: (d: any) => number = d => d.y,\n degree?: number\n) => {\n switch (type) {\n case 'logisitc':\n return regressionLogistic(data, x, y);\n case 'lowess':\n return regressionLowess(data, x, y);\n case 'polynomial':\n return regressionPolynomial(data, x, y, { degree });\n default:\n return regressionLinear(data, x, y);\n }\n};\n\n/**\n * 获取系列标签的 spec 配置\n * @param position 显示位置\n * @param config 系列标签的样式配置\n * @returns\n */\nexport function getScatterRegressionLineConfig(\n type: 'linear' | 'logisitc' | 'lowess' | 'polynomial',\n config: Omit<ScatterRegressionLineSpec, 'visible' | 'type'>\n) {\n const { color, line, confidenceInterval, label } = config;\n return {\n type: 'component',\n componentType: REGRESSION_LINE,\n interactive: false,\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.scatter) as ICartesianSeries[];\n const regressionData: RegressionLineData[] = [];\n\n // 必须存在散点图系列\n if (series && series.length) {\n series.forEach(s => {\n const start = s.getRegion().getLayoutStartPoint();\n const rect = s.getRegion().getLayoutRect();\n const yClamper = clamper(start.y, start.y + rect.height);\n const colorAttrOptions = s.getColorAttribute();\n const groups = s.getSeriesKeys();\n const data = s.getViewData().latestData;\n const fieldX = s.fieldX?.[0];\n const fieldY = s.fieldY?.[0];\n\n if (!fieldX || !fieldY || !data || data.length <= 2) {\n return;\n }\n\n groups.forEach(group => {\n const groupData = data.filter((d: Datum) => d[colorAttrOptions?.field] === group);\n\n if (!groupData.length) {\n return;\n }\n const { evaluateGrid, confidenceInterval } = getRegressionByType(\n type,\n groupData,\n (datum: Datum) => datum?.[fieldX],\n (datum: Datum) => datum?.[fieldY],\n config.polynomialDegree\n );\n const N = Math.max(3, Math.floor(groupData.length / 4));\n const lineData = evaluateGrid(N);\n const confidenceData = confidenceInterval(N);\n\n regressionData.push({\n color: color ?? colorAttrOptions?.scale?.scale(group),\n line: lineData.map((ld: Datum) => {\n const d = { [fieldX]: ld.x, [fieldY]: ld.y };\n return {\n x: s.dataToPositionX(d) + start.x,\n y: yClamper(\n type === 'logisitc' ? start.y + rect.height * (1 - ld.y) : s.dataToPositionY(d) + start.y\n )\n };\n }),\n area: confidenceData.map((c: Datum) => {\n const d = { [fieldX]: c.x, [fieldY]: c.lower };\n return {\n x: s.dataToPositionX(d) + start.x,\n y: yClamper(s.dataToPositionY(d) + start.y),\n y1: yClamper(s.dataToPositionY({ [fieldY]: c.upper }) + start.y)\n };\n })\n });\n });\n });\n }\n\n return regressionData;\n },\n line,\n confidenceInterval,\n label\n }\n };\n}\n\nexport function appendScatterRegressionLineConfig(\n chartSpec: ISpec,\n spec?: ScatterRegressionLineSpec | ScatterRegressionLineSpec[]\n) {\n if (!spec) {\n spec =\n get(chartSpec, REGRESSION_LINE) ??\n get(\n chartSpec.series?.find(s => s.type === SeriesTypeEnum.scatter),\n REGRESSION_LINE\n );\n }\n\n const specs = array(spec);\n\n specs.forEach((s: ScatterRegressionLineSpec) => {\n if (s.visible !== false) {\n if (!(chartSpec as any).customMark) {\n (chartSpec as any).customMark = [];\n }\n\n const { type, ...rest } = s;\n (chartSpec as any).customMark.push(getScatterRegressionLineConfig(type, rest));\n }\n });\n}\n"]}
@@ -0,0 +1,9 @@
1
+ import type { RegressionLineAttrs } from '../regression-line/type';
2
+ export interface ScatterRegressionLineAttrs extends RegressionLineAttrs {
3
+ type: 'linear' | 'logisitc' | 'lowess' | 'polynomial';
4
+ polynomialDegree?: number;
5
+ }
6
+ export interface ScatterRegressionLineSpec extends Partial<Pick<ScatterRegressionLineAttrs, 'type' | 'polynomialDegree' | 'line' | 'label' | 'confidenceInterval'>> {
7
+ visible?: boolean;
8
+ color?: string;
9
+ }
@@ -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/scatter-regression-line/type.ts"],"names":[],"mappings":"","file":"type.js","sourcesContent":["import type { RegressionLineAttrs } from '../regression-line/type';\n\nexport interface ScatterRegressionLineAttrs extends RegressionLineAttrs {\n type: 'linear' | 'logisitc' | 'lowess' | 'polynomial';\n /**\n * 多项式回归的阶数,仅当 type 为 polynomial 时有效\n */\n polynomialDegree?: number;\n}\n\nexport interface ScatterRegressionLineSpec\n extends Partial<\n Pick<ScatterRegressionLineAttrs, 'type' | 'polynomialDegree' | 'line' | 'label' | 'confidenceInterval'>\n > {\n /**\n * 是否显示回归线\n */\n visible?: boolean;\n /**\n * 主色,可以不设置,默认取散点图系列颜色\n */\n color?: string;\n}\n"]}
package/cjs/index.d.ts CHANGED
@@ -20,3 +20,7 @@ export * from './components/series-break';
20
20
  export * from './components/bar-link';
21
21
  export * from './components/series-label';
22
22
  export * from './components/map-label';
23
+ export * from './components/regression-line';
24
+ export * from './components/scatter-regression-line';
25
+ export * from './components/bar-regression-line';
26
+ export * from './components/histogram-regression-line';
package/cjs/index.js CHANGED
@@ -37,4 +37,6 @@ Object.defineProperty(exports, "register3DPlugin", {
37
37
  }), __exportStar(require("./charts/pictogram"), exports), __exportStar(require("./charts/image-cloud"), exports),
38
38
  __exportStar(require("./charts/candlestick"), exports), __exportStar(require("./components/series-break"), exports),
39
39
  __exportStar(require("./components/bar-link"), exports), __exportStar(require("./components/series-label"), exports),
40
- __exportStar(require("./components/map-label"), exports);
40
+ __exportStar(require("./components/map-label"), exports), __exportStar(require("./components/regression-line"), exports),
41
+ __exportStar(require("./components/scatter-regression-line"), exports), __exportStar(require("./components/bar-regression-line"), exports),
42
+ __exportStar(require("./components/histogram-regression-line"), exports);
package/cjs/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/index.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;AAAA,mEAAiD;AACjD,qEAAmD;AACnD,6DAA2C;AAC3C,uFAAqE;AACrE,qFAAmE;AACnE,yFAAuE;AAEvE,kDAAgC;AAChC,qDAAmC;AACnC,wDAAsC;AACtC,kDAAgC;AAChC,mEAAiD;AACjD,yDAAuC;AACvC,mDAAiC;AACjC,2DAAyC;AACzC,6CAAsD;AAA7C,0GAAA,gBAAgB,OAAA;AACzB,qDAAmC;AACnC,uDAAqC;AACrC,uDAAqC;AAErC,4DAA0C;AAC1C,wDAAsC;AACtC,4DAA0C;AAC1C,yDAAuC","file":"index.js","sourcesContent":["export * from './charts/ranking-bar/ranking-bar';\nexport * from './charts/ranking-list/ranking-list';\nexport * from './charts/conversion-funnel';\nexport * from './charts/sequence-scatter-link/sequence-scatter-link';\nexport * from './charts/sequence-scatter-kde/sequence-scatter-kde';\nexport * from './charts/sequence-scatter-pixel/sequence-scatter-pixel';\n\nexport * from './charts/bar-3d';\nexport * from './charts/funnel-3d';\nexport * from './charts/histogram-3d';\nexport * from './charts/pie-3d';\nexport * from './charts/combination-candlestick';\nexport * from './charts/word-cloud-3d';\nexport * from './charts/axis-3d';\nexport * from './charts/range-column-3d';\nexport { register3DPlugin } from './charts/3d/plugin';\nexport * from './charts/pictogram';\nexport * from './charts/image-cloud';\nexport * from './charts/candlestick';\n\nexport * from './components/series-break';\nexport * from './components/bar-link';\nexport * from './components/series-label';\nexport * from './components/map-label';\n"]}
1
+ {"version":3,"sources":["../src/index.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;AAAA,mEAAiD;AACjD,qEAAmD;AACnD,6DAA2C;AAC3C,uFAAqE;AACrE,qFAAmE;AACnE,yFAAuE;AAEvE,kDAAgC;AAChC,qDAAmC;AACnC,wDAAsC;AACtC,kDAAgC;AAChC,mEAAiD;AACjD,yDAAuC;AACvC,mDAAiC;AACjC,2DAAyC;AACzC,6CAAsD;AAA7C,0GAAA,gBAAgB,OAAA;AACzB,qDAAmC;AACnC,uDAAqC;AACrC,uDAAqC;AAErC,4DAA0C;AAC1C,wDAAsC;AACtC,4DAA0C;AAC1C,yDAAuC;AACvC,+DAA6C;AAC7C,uEAAqD;AACrD,mEAAiD;AACjD,yEAAuD","file":"index.js","sourcesContent":["export * from './charts/ranking-bar/ranking-bar';\nexport * from './charts/ranking-list/ranking-list';\nexport * from './charts/conversion-funnel';\nexport * from './charts/sequence-scatter-link/sequence-scatter-link';\nexport * from './charts/sequence-scatter-kde/sequence-scatter-kde';\nexport * from './charts/sequence-scatter-pixel/sequence-scatter-pixel';\n\nexport * from './charts/bar-3d';\nexport * from './charts/funnel-3d';\nexport * from './charts/histogram-3d';\nexport * from './charts/pie-3d';\nexport * from './charts/combination-candlestick';\nexport * from './charts/word-cloud-3d';\nexport * from './charts/axis-3d';\nexport * from './charts/range-column-3d';\nexport { register3DPlugin } from './charts/3d/plugin';\nexport * from './charts/pictogram';\nexport * from './charts/image-cloud';\nexport * from './charts/candlestick';\n\nexport * from './components/series-break';\nexport * from './components/bar-link';\nexport * from './components/series-label';\nexport * from './components/map-label';\nexport * from './components/regression-line';\nexport * from './components/scatter-regression-line';\nexport * from './components/bar-regression-line';\nexport * from './components/histogram-regression-line';\n"]}
@@ -19,4 +19,5 @@ CandlestickChart.transformerConstructor = CandlestickChartSpecTransformer;
19
19
  export const registerCandlestickChart = () => {
20
20
  registerDimensionTooltipProcessor(), registerMarkTooltipProcessor(), registerDimensionEvents(),
21
21
  registerDimensionHover(), registerCandlestickSeries(), Factory.registerChart(CandlestickChart.type, CandlestickChart);
22
- };
22
+ };
23
+ //# sourceMappingURL=candlestick.js.map
@@ -25,5 +25,4 @@ mixin(CombinationCandlestickChart, StackChartMixin);
25
25
 
26
26
  export const registerCombinationCandlestickChart = () => {
27
27
  registerCandlestickSeries(), Factory.registerChart(CombinationCandlestickChart.type, CombinationCandlestickChart);
28
- };
29
- //# sourceMappingURL=combination-candlestick.js.map
28
+ };
@@ -90,5 +90,4 @@ function computeIndex(arrow, totalArrows) {
90
90
  curArrow.layout.duplicateNode && duplicateCount++;
91
91
  }
92
92
  return index;
93
- }
94
- //# sourceMappingURL=arrow-data-transform.js.map
93
+ }
@@ -21,4 +21,5 @@ Funnel3dChart.transformerConstructor = FunnelChartSpecTransformer;
21
21
  export const registerFunnel3dChart = () => {
22
22
  registerMarkTooltipProcessor(), register3DPlugin(), registerLayout3d(), registerFunnel3dSeries(),
23
23
  Factory.registerChart(Funnel3dChart.type, Funnel3dChart);
24
- };
24
+ };
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,80 @@
1
+ var __rest = this && this.__rest || function(s, e) {
2
+ var t = {};
3
+ for (var p in s) Object.prototype.hasOwnProperty.call(s, p) && e.indexOf(p) < 0 && (t[p] = s[p]);
4
+ if (null != s && "function" == typeof Object.getOwnPropertySymbols) {
5
+ var i = 0;
6
+ 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]]);
7
+ }
8
+ return t;
9
+ };
10
+
11
+ import { array, clamper, get, regressionPolynomial } from "@visactor/vutils";
12
+
13
+ import { SeriesTypeEnum } from "@visactor/vchart";
14
+
15
+ import { REGRESSION_LINE } from "../regression-line/regression-line";
16
+
17
+ export function getBarRegressionLineConfig(config) {
18
+ const {color: color, line: line, confidenceInterval: confidenceInterval, label: label} = config;
19
+ return {
20
+ type: "component",
21
+ componentType: REGRESSION_LINE,
22
+ interactive: !1,
23
+ zIndex: 500,
24
+ style: {
25
+ data: (datum, ctx) => {
26
+ const series = ctx.vchart.getChart().getAllSeries().filter((s => s.type === SeriesTypeEnum.bar)), regressionData = [];
27
+ return series && series.length && series.forEach((s => {
28
+ var _a, _b, _c;
29
+ const region = s.getRegion().getLayoutStartPoint(), start = s.getRegion().getLayoutStartPoint(), rect = s.getRegion().getLayoutRect(), yClamper = 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;
30
+ if (isHorizontal || !fieldX || !fieldY || !data || data.length <= 2 || groups.length <= 2) return;
31
+ const {evaluateGrid: evaluateGrid, confidenceInterval: confidenceInterval} = regressionPolynomial(data, (datum => groups.indexOf(null == datum ? void 0 : datum[fieldX])), (datum => null == datum ? void 0 : datum[fieldY]), {
32
+ degree: config.degree
33
+ }), N = groups.length, lineData = evaluateGrid(N), confidenceData = confidenceInterval(N), halfBandWidth = s.getXAxisHelper().getBandwidth(0) / 2;
34
+ regressionData.push({
35
+ color: null != color ? color : null === (_c = s.getOption().globalScale.getScale("color")) || void 0 === _c ? void 0 : _c.scale(s.getSeriesKeys()[0]),
36
+ line: lineData.map((ld => {
37
+ const d = {
38
+ [fieldX]: groups[ld.x],
39
+ [fieldY]: ld.y
40
+ };
41
+ return {
42
+ x: s.dataToPositionX(d) + region.x + halfBandWidth,
43
+ y: yClamper(s.dataToPositionY(d) + region.y)
44
+ };
45
+ })),
46
+ area: confidenceData.map((c => {
47
+ const d = {
48
+ [fieldX]: groups[c.x],
49
+ [fieldY]: c.lower
50
+ };
51
+ return {
52
+ x: s.dataToPositionX(d) + region.x + halfBandWidth,
53
+ y: yClamper(s.dataToPositionY(d) + region.y),
54
+ y1: yClamper(s.dataToPositionY({
55
+ [fieldY]: c.upper
56
+ }) + region.y)
57
+ };
58
+ }))
59
+ });
60
+ })), regressionData;
61
+ },
62
+ line: line,
63
+ confidenceInterval: confidenceInterval,
64
+ label: label
65
+ }
66
+ };
67
+ }
68
+
69
+ export function appendBarRegressionLineConfig(chartSpec, spec) {
70
+ var _a, _b;
71
+ spec || (spec = null !== (_a = get(chartSpec, REGRESSION_LINE)) && void 0 !== _a ? _a : get(null === (_b = chartSpec.series) || void 0 === _b ? void 0 : _b.find((s => s.type === SeriesTypeEnum.bar)), REGRESSION_LINE));
72
+ array(spec).forEach((s => {
73
+ if (!1 !== s.visible) {
74
+ chartSpec.customMark || (chartSpec.customMark = []);
75
+ const {visible: visible} = s, rest = __rest(s, [ "visible" ]);
76
+ chartSpec.customMark.push(getBarRegressionLineConfig(rest));
77
+ }
78
+ }));
79
+ }
80
+ //# 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,2 @@
1
+ export { };
2
+ //# 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,75 @@
1
+ var __rest = this && this.__rest || function(s, e) {
2
+ var t = {};
3
+ for (var p in s) Object.prototype.hasOwnProperty.call(s, p) && e.indexOf(p) < 0 && (t[p] = s[p]);
4
+ if (null != s && "function" == typeof Object.getOwnPropertySymbols) {
5
+ var i = 0;
6
+ 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]]);
7
+ }
8
+ return t;
9
+ };
10
+
11
+ import { array, get, kde, ecdf, last } from "@visactor/vutils";
12
+
13
+ import { SeriesTypeEnum } from "@visactor/vchart";
14
+
15
+ import { REGRESSION_LINE } from "../regression-line/regression-line";
16
+
17
+ const getRegressionByType = (type, data, kdeOptions) => {
18
+ switch (type) {
19
+ case "kde":
20
+ return kde(data, kdeOptions);
21
+
22
+ case "ecdf":
23
+ return ecdf(data);
24
+ }
25
+ };
26
+
27
+ export function getHistogramRegressionLineConfig(type, config) {
28
+ const {line: line, label: label, color: color} = config;
29
+ return {
30
+ type: "component",
31
+ componentType: 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 === 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 = last(yRange), scaleR = "kde" === type ? k => scaleY.scale(k * data.length * res.bandwidth) : e => y0 + (y1 - y0) * e;
44
+ regressionData.push({
45
+ color: null != color ? color : null === (_h = s.getOption().globalScale.getScale("color")) || void 0 === _h ? void 0 : _h.scale(s.getSeriesKeys()[0]),
46
+ line: lineData.map((ld => {
47
+ const d = {
48
+ [fieldX]: ld.x
49
+ };
50
+ return {
51
+ x: s.dataToPositionX(d) + region.x,
52
+ y: scaleR(ld.y) + region.y
53
+ };
54
+ }))
55
+ });
56
+ })), regressionData;
57
+ },
58
+ line: line,
59
+ label: label
60
+ }
61
+ };
62
+ }
63
+
64
+ export function appendHistogramRegressionLineConfig(chartSpec, spec) {
65
+ var _a, _b;
66
+ spec || (spec = null !== (_a = get(chartSpec, REGRESSION_LINE)) && void 0 !== _a ? _a : get(null === (_b = chartSpec.series) || void 0 === _b ? void 0 : _b.find((s => s.type === SeriesTypeEnum.bar)), REGRESSION_LINE));
67
+ array(spec).forEach((s => {
68
+ if (!1 !== s.visible) {
69
+ chartSpec.customMark || (chartSpec.customMark = []);
70
+ const {type: type} = s, rest = __rest(s, [ "type" ]);
71
+ chartSpec.customMark.push(getHistogramRegressionLineConfig(type, rest));
72
+ }
73
+ }));
74
+ }
75
+ //# 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,2 @@
1
+ export { };
2
+ //# 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,4 @@
1
+ export * from "./regression-line";
2
+
3
+ export * from "./type";
4
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/components/regression-line/index.ts"],"names":[],"mappings":"AAAA,cAAc,mBAAmB,CAAC;AAClC,cAAc,QAAQ,CAAC","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,54 @@
1
+ import { AbstractComponent } from "@visactor/vrender-components";
2
+
3
+ import { isEmpty, isValid, last } from "@visactor/vutils";
4
+
5
+ import { Factory } from "@visactor/vchart";
6
+
7
+ import { createText, createLine, createArea } from "@visactor/vrender-core";
8
+
9
+ export const REGRESSION_LINE = "regressionLine";
10
+
11
+ export class RegressionLine extends AbstractComponent {
12
+ constructor() {
13
+ super(...arguments), this.name = 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
+ isEmpty(data) || data.forEach((d => {
19
+ const {color: color} = d;
20
+ if (d.area && !1 !== (null == confidenceInterval ? void 0 : confidenceInterval.visible)) {
21
+ const areaShape = createArea(Object.assign(Object.assign({
22
+ points: d.area
23
+ }, 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 = createLine(Object.assign(Object.assign({
31
+ points: d.line,
32
+ lineWidth: 1
33
+ }, 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 = last(d.line);
39
+ if (label && !1 !== label.visible && label.text && lastPoint) {
40
+ const tag = 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
+ export const registerRegressionLine = () => {
52
+ Factory.registerGraphicComponent(REGRESSION_LINE, (attrs => new RegressionLine(attrs)));
53
+ };
54
+ //# sourceMappingURL=regression-line.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/components/regression-line/regression-line.ts"],"names":[],"mappings":"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","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,2 @@
1
+ export { };
2
+ //# 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;