@visactor/vchart-extension 2.0.7-alpha.2 → 2.0.7-alpha.5
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.
- package/build/index.js +1054 -0
- package/build/index.min.js +2 -2
- package/cjs/charts/conversion-funnel/arrow-data-transform.js +0 -1
- package/cjs/charts/funnel-3d/chart.js +2 -1
- package/cjs/components/bar-regression-line/index.d.ts +26 -0
- package/cjs/components/bar-regression-line/index.js +87 -0
- package/cjs/components/bar-regression-line/index.js.map +1 -0
- package/cjs/components/bar-regression-line/type.d.ts +8 -0
- package/cjs/components/bar-regression-line/type.js +6 -0
- package/cjs/components/bar-regression-line/type.js.map +1 -0
- package/cjs/components/histogram-regression-line/index.d.ts +22 -0
- package/cjs/components/histogram-regression-line/index.js +79 -0
- package/cjs/components/histogram-regression-line/index.js.map +1 -0
- package/cjs/components/histogram-regression-line/type.d.ts +8 -0
- package/cjs/components/histogram-regression-line/type.js +6 -0
- package/cjs/components/histogram-regression-line/type.js.map +1 -0
- package/cjs/components/regression-line/index.d.ts +2 -0
- package/cjs/components/regression-line/index.js +21 -0
- package/cjs/components/regression-line/index.js.map +1 -0
- package/cjs/components/regression-line/regression-line.d.ts +8 -0
- package/cjs/components/regression-line/regression-line.js +58 -0
- package/cjs/components/regression-line/regression-line.js.map +1 -0
- package/cjs/components/regression-line/type.d.ts +30 -0
- package/cjs/components/regression-line/type.js +6 -0
- package/cjs/components/regression-line/type.js.map +1 -0
- package/cjs/components/scatter-regression-line/index.d.ts +25 -0
- package/cjs/components/scatter-regression-line/index.js +103 -0
- package/cjs/components/scatter-regression-line/index.js.map +1 -0
- package/cjs/components/scatter-regression-line/type.d.ts +9 -0
- package/cjs/components/scatter-regression-line/type.js +6 -0
- package/cjs/components/scatter-regression-line/type.js.map +1 -0
- package/cjs/index.d.ts +4 -0
- package/cjs/index.js +3 -1
- package/cjs/index.js.map +1 -1
- package/esm/charts/conversion-funnel/arrow-data-transform.js +1 -2
- package/esm/charts/funnel-3d/chart.js +2 -1
- package/esm/components/bar-regression-line/index.d.ts +26 -0
- package/esm/components/bar-regression-line/index.js +80 -0
- package/esm/components/bar-regression-line/index.js.map +1 -0
- package/esm/components/bar-regression-line/type.d.ts +8 -0
- package/esm/components/bar-regression-line/type.js +2 -0
- package/esm/components/bar-regression-line/type.js.map +1 -0
- package/esm/components/histogram-regression-line/index.d.ts +22 -0
- package/esm/components/histogram-regression-line/index.js +75 -0
- package/esm/components/histogram-regression-line/index.js.map +1 -0
- package/esm/components/histogram-regression-line/type.d.ts +8 -0
- package/esm/components/histogram-regression-line/type.js +2 -0
- package/esm/components/histogram-regression-line/type.js.map +1 -0
- package/esm/components/regression-line/index.d.ts +2 -0
- package/esm/components/regression-line/index.js +4 -0
- package/esm/components/regression-line/index.js.map +1 -0
- package/esm/components/regression-line/regression-line.d.ts +8 -0
- package/esm/components/regression-line/regression-line.js +54 -0
- package/esm/components/regression-line/regression-line.js.map +1 -0
- package/esm/components/regression-line/type.d.ts +30 -0
- package/esm/components/regression-line/type.js +2 -0
- package/esm/components/regression-line/type.js.map +1 -0
- package/esm/components/scatter-regression-line/index.d.ts +25 -0
- package/esm/components/scatter-regression-line/index.js +99 -0
- package/esm/components/scatter-regression-line/index.js.map +1 -0
- package/esm/components/scatter-regression-line/type.d.ts +9 -0
- package/esm/components/scatter-regression-line/type.js +2 -0
- package/esm/components/scatter-regression-line/type.js.map +1 -0
- package/esm/index.d.ts +4 -0
- package/esm/index.js +9 -1
- package/esm/index.js.map +1 -1
- package/package.json +11 -11
|
@@ -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 @@
|
|
|
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 @@
|
|
|
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,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 @@
|
|
|
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
|
|
@@ -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"]}
|