@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
package/build/index.js CHANGED
@@ -757,6 +757,750 @@
757
757
  return [min, max];
758
758
  };
759
759
 
760
+ function invNorm(p) {
761
+ if (p <= 0 || p >= 1) return 0;
762
+ const c1 = -.00778489400243029,
763
+ c2 = -.322396458041136,
764
+ c3 = -2.40075827716184,
765
+ c4 = -2.54973253934373,
766
+ c5 = 4.37466414146497,
767
+ c6 = 2.93816398269878,
768
+ d1 = .00778469570904146,
769
+ d2 = .32246712907004,
770
+ d3 = 2.445134137143,
771
+ d4 = 3.75440866190742;
772
+ let q, r;
773
+ return p < .02425 ? (q = Math.sqrt(-2 * Math.log(p)), (((((c1 * q + c2) * q + c3) * q + c4) * q + c5) * q + c6) / ((((d1 * q + d2) * q + d3) * q + d4) * q + 1)) : p <= .97575 ? (q = p - .5, r = q * q, (((((-39.6968302866538 * r + 220.946098424521) * r - 275.928510446969) * r + 138.357751867269) * r - 30.6647980661472) * r + 2.50662827745924) * q / (((((-54.4760987982241 * r + 161.585836858041) * r - 155.698979859887) * r + 66.8013118877197) * r - 13.2806815528857) * r + 1)) : (q = Math.sqrt(-2 * Math.log(1 - p)), -(((((c1 * q + c2) * q + c3) * q + c4) * q + c5) * q + c6) / ((((d1 * q + d2) * q + d3) * q + d4) * q + 1));
774
+ }
775
+ function computeLinearCIComponents(data, x, y, predict) {
776
+ let min = 1 / 0,
777
+ max = -1 / 0,
778
+ n = 0,
779
+ sumX = 0;
780
+ for (let i = 0; i < data.length; i++) {
781
+ const d = data[i];
782
+ let dx = x(d),
783
+ dy = y(d);
784
+ !isNil$1(dx) && (dx = +dx) >= dx && !isNil$1(dy) && (dy = +dy) >= dy && (dx < min && (min = dx), dx > max && (max = dx), n++, sumX += dx);
785
+ }
786
+ if (0 === n) return {
787
+ min: min,
788
+ max: max,
789
+ n: n,
790
+ X: 0,
791
+ SSE: 0,
792
+ Sxx: 0
793
+ };
794
+ const X = sumX / n;
795
+ let SSE = 0,
796
+ Sxx = 0;
797
+ for (let i = 0; i < data.length; i++) {
798
+ const d = data[i];
799
+ let dx = x(d),
800
+ dy = y(d);
801
+ if (!isNil$1(dx) && (dx = +dx) >= dx && !isNil$1(dy) && (dy = +dy) >= dy) {
802
+ const r = dy - predict(dx);
803
+ SSE += r * r;
804
+ const dxc = dx - X;
805
+ Sxx += dxc * dxc;
806
+ }
807
+ }
808
+ return {
809
+ min: min,
810
+ max: max,
811
+ n: n,
812
+ X: X,
813
+ SSE: SSE,
814
+ Sxx: Sxx
815
+ };
816
+ }
817
+ function stdErrorsAt(px, comps) {
818
+ const {
819
+ n: n,
820
+ X: X,
821
+ Sxx: Sxx,
822
+ SSE: SSE
823
+ } = comps,
824
+ s2 = n > 2 ? SSE / (n - 2) : 0;
825
+ return {
826
+ seMean: Sxx > 0 ? Math.sqrt(s2 * (1 / n + (px - X) * (px - X) / Sxx)) : Math.sqrt(s2 / n),
827
+ sePred: Math.sqrt(s2 * (1 + 1 / n + (Sxx > 0 ? (px - X) * (px - X) / Sxx : 0)))
828
+ };
829
+ }
830
+
831
+ function ordinaryLeastSquares(uX, uY, uXY, uX2) {
832
+ const denom = uX2 - uX * uX;
833
+ if (Math.abs(denom) < Number.EPSILON) return {
834
+ a: uY,
835
+ b: 0
836
+ };
837
+ const b = (uXY - uX * uY) / denom;
838
+ return {
839
+ a: uY - b * uX,
840
+ b: b
841
+ };
842
+ }
843
+ function visitPoints(data, x, y, callback) {
844
+ for (let i = 0; i < data.length; i++) {
845
+ const d = data[i];
846
+ let xi = x(d),
847
+ yi = y(d);
848
+ !isNil$1(xi) && (xi = +xi) >= xi && !isNil$1(yi) && (yi = +yi) >= yi && callback(xi, yi, i);
849
+ }
850
+ }
851
+ function rSquared(data, x, y, uY, predict) {
852
+ let ssr = 0,
853
+ sst = 0;
854
+ for (let i = 0; i < data.length; i++) {
855
+ const d = data[i];
856
+ let yi = y(d);
857
+ if (!isNil$1(yi) && (yi = +yi) >= yi) {
858
+ const r = yi - predict(x(d));
859
+ ssr += r * r;
860
+ const t = yi - uY;
861
+ sst += t * t;
862
+ }
863
+ }
864
+ return 0 === sst ? 0 : 1 - ssr / sst;
865
+ }
866
+ function regressionLinear(data, x = d => d.x, y = d => d.y) {
867
+ let n = 0,
868
+ meanX = 0,
869
+ meanY = 0,
870
+ meanXY = 0,
871
+ meanX2 = 0;
872
+ visitPoints(data, x, y, (xi, yi) => {
873
+ n++, meanX += (xi - meanX) / n, meanY += (yi - meanY) / n, meanXY += (xi * yi - meanXY) / n, meanX2 += (xi * xi - meanX2) / n;
874
+ });
875
+ const {
876
+ a: a,
877
+ b: b
878
+ } = ordinaryLeastSquares(meanX, meanY, meanXY, meanX2),
879
+ predict = xx => a + b * xx,
880
+ comps = computeLinearCIComponents(data, x, y, predict);
881
+ return {
882
+ coef: {
883
+ a: a,
884
+ b: b
885
+ },
886
+ predict: predict,
887
+ rSquared: rSquared(data, x, y, meanY, predict),
888
+ evaluateGrid: function (N) {
889
+ const out = [];
890
+ if (0 === comps.n || N <= 0) return out;
891
+ if (comps.min === comps.max) {
892
+ for (let i = 0; i < N; i++) out.push({
893
+ x: comps.min,
894
+ y: predict(comps.min)
895
+ });
896
+ return out;
897
+ }
898
+ const step = (comps.max - comps.min) / (N - 1);
899
+ for (let i = 0; i < N; i++) {
900
+ const px = i === N - 1 ? comps.max : comps.min + step * i;
901
+ out.push({
902
+ x: px,
903
+ y: predict(px)
904
+ });
905
+ }
906
+ return out;
907
+ },
908
+ confidenceInterval: function (N = 50, alpha = .05) {
909
+ const out = [];
910
+ if (0 === comps.n || N <= 0) return out;
911
+ const z = invNorm(1 - alpha / 2);
912
+ if (comps.min === comps.max) {
913
+ const m = predict(comps.min),
914
+ errs = stdErrorsAt(comps.min, comps);
915
+ for (let i = 0; i < N; i++) out.push({
916
+ x: comps.min,
917
+ mean: m,
918
+ lower: m - z * errs.seMean,
919
+ upper: m + z * errs.seMean,
920
+ predLower: m - z * errs.sePred,
921
+ predUpper: m + z * errs.sePred
922
+ });
923
+ return out;
924
+ }
925
+ const step = (comps.max - comps.min) / (N - 1);
926
+ for (let i = 0; i < N; i++) {
927
+ const px = i === N - 1 ? comps.max : comps.min + step * i,
928
+ m = predict(px),
929
+ errs = stdErrorsAt(px, comps);
930
+ out.push({
931
+ x: px,
932
+ mean: m,
933
+ lower: m - z * errs.seMean,
934
+ upper: m + z * errs.seMean,
935
+ predLower: m - z * errs.sePred,
936
+ predUpper: m + z * errs.sePred
937
+ });
938
+ }
939
+ return out;
940
+ }
941
+ };
942
+ }
943
+
944
+ function regressionLogistic(data, x = d => d.x, y = d => d.y, options) {
945
+ var _a, _b;
946
+ const maxIter = null !== (_a = null == options ? void 0 : options.maxIteration) && void 0 !== _a ? _a : 25,
947
+ tol = null !== (_b = null == options ? void 0 : options.tol) && void 0 !== _b ? _b : 1e-6,
948
+ xs = [],
949
+ ys = [];
950
+ visitPoints(data, x, y, (dx, dy) => {
951
+ xs.push(dx), ys.push(dy ? 1 : 0);
952
+ });
953
+ const n = xs.length;
954
+ if (0 === n) return {
955
+ coef: [0, 0],
956
+ predict: _x => 0,
957
+ evaluateGrid: N => [],
958
+ confidenceInterval: (N = 50) => []
959
+ };
960
+ let intercept = 0,
961
+ beta = 0;
962
+ for (let iter = 0; iter < maxIter; iter++) {
963
+ const p = new Array(n);
964
+ let converged = !0;
965
+ for (let i = 0; i < n; i++) {
966
+ const z = intercept + beta * xs[i],
967
+ pi = 1 / (1 + Math.exp(-z));
968
+ p[i] = pi;
969
+ }
970
+ let g0 = 0,
971
+ g1 = 0,
972
+ h00 = 0,
973
+ h01 = 0,
974
+ h11 = 0;
975
+ for (let i = 0; i < n; i++) {
976
+ const wi = p[i] * (1 - p[i]),
977
+ diff = ys[i] - p[i];
978
+ g0 += diff, g1 += diff * xs[i], h00 += wi, h01 += wi * xs[i], h11 += wi * xs[i] * xs[i];
979
+ }
980
+ const det = h00 * h11 - h01 * h01;
981
+ if (Math.abs(det) < 1e-12) break;
982
+ const delta0 = (h11 * g0 - h01 * g1) / det,
983
+ delta1 = (-h01 * g0 + h00 * g1) / det;
984
+ if (intercept += delta0, beta += delta1, (Math.abs(delta0) > tol || Math.abs(delta1) > tol) && (converged = !1), converged) break;
985
+ }
986
+ const predict = xx => {
987
+ const z = intercept + beta * xx;
988
+ return 1 / (1 + Math.exp(-z));
989
+ };
990
+ return {
991
+ coef: [intercept, beta],
992
+ predict: predict,
993
+ evaluateGrid: function (N) {
994
+ const out = [];
995
+ if (N <= 0) return out;
996
+ let min = 1 / 0,
997
+ max = -1 / 0;
998
+ if (visitPoints(data, x, y, dx => {
999
+ dx < min && (min = dx), dx > max && (max = dx);
1000
+ }), min === 1 / 0 || max === -1 / 0) return out;
1001
+ if (min === max) {
1002
+ const v = predict(min);
1003
+ for (let i = 0; i < N; i++) out.push({
1004
+ x: min,
1005
+ y: v
1006
+ });
1007
+ return out;
1008
+ }
1009
+ const step = (max - min) / (N - 1);
1010
+ for (let i = 0; i < N; i++) {
1011
+ const px = i === N - 1 ? max : min + step * i;
1012
+ out.push({
1013
+ x: px,
1014
+ y: predict(px)
1015
+ });
1016
+ }
1017
+ return out;
1018
+ },
1019
+ confidenceInterval: function (N = 50, alpha = .05) {
1020
+ const out = [];
1021
+ if (N <= 0) return out;
1022
+ const comps = computeLinearCIComponents(data, x, y, predict);
1023
+ if (0 === comps.n) return out;
1024
+ const z = Math.abs(invNorm(1 - alpha / 2));
1025
+ if (comps.min === comps.max) {
1026
+ const v = predict(comps.min),
1027
+ errs = stdErrorsAt(comps.min, comps);
1028
+ for (let i = 0; i < N; i++) out.push({
1029
+ x: comps.min,
1030
+ mean: v,
1031
+ lower: v - z * errs.seMean,
1032
+ upper: v + z * errs.seMean,
1033
+ predLower: v - z * errs.sePred,
1034
+ predUpper: v + z * errs.sePred
1035
+ });
1036
+ return out;
1037
+ }
1038
+ const step = (comps.max - comps.min) / (N - 1);
1039
+ for (let i = 0; i < N; i++) {
1040
+ const px = i === N - 1 ? comps.max : comps.min + step * i,
1041
+ yh = predict(px),
1042
+ errs = stdErrorsAt(px, comps);
1043
+ out.push({
1044
+ x: px,
1045
+ mean: yh,
1046
+ lower: yh - z * errs.seMean,
1047
+ upper: yh + z * errs.seMean,
1048
+ predLower: yh - z * errs.sePred,
1049
+ predUpper: yh + z * errs.sePred
1050
+ });
1051
+ }
1052
+ return out;
1053
+ }
1054
+ };
1055
+ }
1056
+
1057
+ function tricube(u) {
1058
+ const uu = Math.abs(u);
1059
+ if (uu >= 1) return 0;
1060
+ const t = 1 - uu * uu * uu;
1061
+ return t * t * t;
1062
+ }
1063
+ function regressionLowess(data, x = d => d.x, y = d => d.y, options = {}) {
1064
+ const span = options.span || .3,
1065
+ degree = 0 === options.degree ? 0 : 1,
1066
+ iterations = null == options.iterations ? 2 : options.iterations,
1067
+ ptsX = [],
1068
+ ptsY = [];
1069
+ visitPoints(data, x, y, (dx, dy) => {
1070
+ ptsX.push(dx), ptsY.push(dy);
1071
+ });
1072
+ const n = ptsX.length;
1073
+ function predictSingle(x0, robustWeights) {
1074
+ if (0 === n) return 0;
1075
+ const dists = [];
1076
+ for (let i = 0; i < n; i++) dists.push({
1077
+ idx: i,
1078
+ dist: Math.abs(ptsX[i] - x0)
1079
+ });
1080
+ dists.sort((a, b) => a.dist - b.dist);
1081
+ const m = Math.max(2, Math.min(n, Math.floor(span * n))),
1082
+ maxDist = dists[m - 1].dist || 0,
1083
+ w = new Array(m);
1084
+ let sumw = 0;
1085
+ for (let i = 0; i < m; i++) {
1086
+ const idx = dists[i].idx;
1087
+ let wi = tricube(0 === maxDist ? 0 : dists[i].dist / maxDist);
1088
+ robustWeights && null != robustWeights[idx] && (wi *= robustWeights[idx]), w[i] = wi, sumw += wi;
1089
+ }
1090
+ if (0 === sumw) return ptsY[dists[0].idx];
1091
+ if (0 === degree) {
1092
+ let s = 0;
1093
+ for (let i = 0; i < m; i++) s += w[i] * ptsY[dists[i].idx];
1094
+ return s / sumw;
1095
+ }
1096
+ let sw = 0,
1097
+ sx = 0,
1098
+ sy = 0,
1099
+ sxx = 0,
1100
+ sxy = 0;
1101
+ for (let i = 0; i < m; i++) {
1102
+ const idx = dists[i].idx,
1103
+ xi = ptsX[idx],
1104
+ yi = ptsY[idx],
1105
+ wi = w[i];
1106
+ sw += wi, sx += wi * xi, sy += wi * yi, sxx += wi * xi * xi, sxy += wi * xi * yi;
1107
+ }
1108
+ const meanX = sx / sw,
1109
+ meanY = sy / sw,
1110
+ denom = sxx - sx * meanX,
1111
+ slope = Math.abs(denom) < 1e-12 ? 0 : (sxy - sx * meanY) / denom;
1112
+ return meanY - slope * meanX + slope * x0;
1113
+ }
1114
+ function predict(x0) {
1115
+ if (Array.isArray(x0)) {
1116
+ const out = [];
1117
+ for (let i = 0; i < x0.length; i++) out.push(predictSingle(x0[i]));
1118
+ return out;
1119
+ }
1120
+ return predictSingle(x0);
1121
+ }
1122
+ return {
1123
+ predict: predict,
1124
+ evaluate: predict,
1125
+ evaluateGrid: function (N) {
1126
+ const out = [];
1127
+ if (N <= 0) return out;
1128
+ if (0 === n) return out;
1129
+ let min = 1 / 0,
1130
+ max = -1 / 0;
1131
+ for (let i = 0; i < n; i++) ptsX[i] < min && (min = ptsX[i]), ptsX[i] > max && (max = ptsX[i]);
1132
+ if (min === max) {
1133
+ const v = predictSingle(min);
1134
+ for (let i = 0; i < N; i++) out.push({
1135
+ x: min,
1136
+ y: v
1137
+ });
1138
+ return out;
1139
+ }
1140
+ const step = (max - min) / (N - 1);
1141
+ let robustWeights;
1142
+ for (let iter = 0; iter < iterations; iter++) {
1143
+ const fits = [];
1144
+ for (let i = 0; i < n; i++) fits.push(predictSingle(ptsX[i], robustWeights));
1145
+ const res = [];
1146
+ for (let i = 0; i < n; i++) res.push(Math.abs(ptsY[i] - fits[i]));
1147
+ const med = res.slice().sort((a, b) => a - b)[Math.floor(n / 2)] || 0;
1148
+ robustWeights = new Array(n);
1149
+ for (let i = 0; i < n; i++) {
1150
+ const u = 0 === med ? 0 : res[i] / (6 * med),
1151
+ w = Math.abs(u) >= 1 ? 0 : (1 - u * u) * (1 - u * u);
1152
+ robustWeights[i] = w;
1153
+ }
1154
+ }
1155
+ for (let i = 0; i < N; i++) {
1156
+ const px = i === N - 1 ? max : min + step * i;
1157
+ out.push({
1158
+ x: px,
1159
+ y: predictSingle(px, robustWeights)
1160
+ });
1161
+ }
1162
+ return out;
1163
+ },
1164
+ confidenceInterval: function (N = 50, alpha = .05) {
1165
+ const out = [];
1166
+ if (N <= 0) return out;
1167
+ if (0 === n) return out;
1168
+ let min = 1 / 0,
1169
+ max = -1 / 0;
1170
+ for (let i = 0; i < n; i++) ptsX[i] < min && (min = ptsX[i]), ptsX[i] > max && (max = ptsX[i]);
1171
+ if (min === 1 / 0 || max === -1 / 0) return out;
1172
+ const comps = computeLinearCIComponents(data, x, y, xx => predictSingle(xx));
1173
+ if (0 === comps.n) return out;
1174
+ const z = Math.abs(invNorm(1 - alpha / 2));
1175
+ if (comps.min === comps.max) {
1176
+ const v = predictSingle(comps.min),
1177
+ errs = stdErrorsAt(comps.min, comps);
1178
+ for (let i = 0; i < N; i++) out.push({
1179
+ x: comps.min,
1180
+ mean: v,
1181
+ lower: v - z * errs.seMean,
1182
+ upper: v + z * errs.seMean,
1183
+ predLower: v - z * errs.sePred,
1184
+ predUpper: v + z * errs.sePred
1185
+ });
1186
+ return out;
1187
+ }
1188
+ const step = (max - min) / (N - 1);
1189
+ for (let i = 0; i < N; i++) {
1190
+ const px = i === N - 1 ? max : min + step * i,
1191
+ yh = predictSingle(px),
1192
+ errs = stdErrorsAt(px, comps);
1193
+ out.push({
1194
+ x: px,
1195
+ mean: yh,
1196
+ lower: yh - z * errs.seMean,
1197
+ upper: yh + z * errs.seMean,
1198
+ predLower: yh - z * errs.sePred,
1199
+ predUpper: yh + z * errs.sePred
1200
+ });
1201
+ }
1202
+ return out;
1203
+ }
1204
+ };
1205
+ }
1206
+
1207
+ function solveLinearSystem(A, b) {
1208
+ const n = b.length,
1209
+ M = new Array(n);
1210
+ for (let i = 0; i < n; i++) M[i] = A[i].slice(), M[i].push(b[i]);
1211
+ for (let k = 0; k < n; k++) {
1212
+ let maxRow = k,
1213
+ maxVal = Math.abs(M[k][k]);
1214
+ for (let i = k + 1; i < n; i++) {
1215
+ const v = Math.abs(M[i][k]);
1216
+ v > maxVal && (maxVal = v, maxRow = i);
1217
+ }
1218
+ if (maxRow !== k) {
1219
+ const tmp = M[k];
1220
+ M[k] = M[maxRow], M[maxRow] = tmp;
1221
+ }
1222
+ if (Math.abs(M[k][k]) < 1e-12) {
1223
+ return new Array(n).fill(0);
1224
+ }
1225
+ for (let j = k + 1; j <= n; j++) M[k][j] = M[k][j] / M[k][k];
1226
+ M[k][k] = 1;
1227
+ for (let i = 0; i < n; i++) {
1228
+ if (i === k) continue;
1229
+ const factor = M[i][k];
1230
+ if (0 !== factor) {
1231
+ for (let j = k + 1; j <= n; j++) M[i][j] -= factor * M[k][j];
1232
+ M[i][k] = 0;
1233
+ }
1234
+ }
1235
+ }
1236
+ const x = new Array(n);
1237
+ for (let i = 0; i < n; i++) x[i] = M[i][n];
1238
+ return x;
1239
+ }
1240
+ function regressionPolynomial(data, x = d => d.x, y = d => d.y, options = {}) {
1241
+ var _a;
1242
+ let degree = null !== (_a = options.degree) && void 0 !== _a ? _a : 0;
1243
+ degree < 0 && (degree = 0);
1244
+ const m = degree + 1,
1245
+ sums = new Array(2 * degree + 1).fill(0);
1246
+ visitPoints(data, x, y, (dx, dy) => {
1247
+ let xp = 1;
1248
+ for (let k = 0; k < sums.length; k++) sums[k] += xp, xp *= dx;
1249
+ });
1250
+ const A = new Array(m);
1251
+ for (let i = 0; i < m; i++) {
1252
+ A[i] = new Array(m).fill(0);
1253
+ for (let j = 0; j < m; j++) A[i][j] = sums[i + j];
1254
+ }
1255
+ const B = new Array(m).fill(0);
1256
+ visitPoints(data, x, y, (dx, dy) => {
1257
+ let xp = 1;
1258
+ for (let k = 0; k < m; k++) B[k] += dy * xp, xp *= dx;
1259
+ });
1260
+ const coef = solveLinearSystem(A, B),
1261
+ predict = xx => {
1262
+ let xp = 1,
1263
+ v = 0;
1264
+ for (let k = 0; k < coef.length; k++) v += coef[k] * xp, xp *= xx;
1265
+ return v;
1266
+ };
1267
+ return {
1268
+ degree: degree,
1269
+ coef: coef,
1270
+ predict: predict,
1271
+ rSquared: rSquared(data, x, y, (() => {
1272
+ let sum = 0,
1273
+ cnt = 0;
1274
+ return visitPoints(data, x, y, (_dx, dy) => {
1275
+ sum += dy, cnt++;
1276
+ }), 0 === cnt ? 0 : sum / cnt;
1277
+ })(), predict),
1278
+ evaluateGrid(N) {
1279
+ const out = [];
1280
+ if (N <= 0) return out;
1281
+ let min = 1 / 0,
1282
+ max = -1 / 0;
1283
+ if (visitPoints(data, x, y, dx => {
1284
+ isNil$1(dx) || (dx < min && (min = dx), dx > max && (max = dx));
1285
+ }), min === 1 / 0 || max === -1 / 0) return out;
1286
+ if (min === max) {
1287
+ const v = predict(min);
1288
+ for (let i = 0; i < N; i++) out.push({
1289
+ x: min,
1290
+ y: v
1291
+ });
1292
+ return out;
1293
+ }
1294
+ const step = (max - min) / (N - 1);
1295
+ for (let i = 0; i < N; i++) {
1296
+ const px = i === N - 1 ? max : min + step * i;
1297
+ out.push({
1298
+ x: px,
1299
+ y: predict(px)
1300
+ });
1301
+ }
1302
+ return out;
1303
+ },
1304
+ confidenceInterval(N = 50, alpha = .05) {
1305
+ const out = [];
1306
+ if (N <= 0) return out;
1307
+ const comps = computeLinearCIComponents(data, x, y, predict);
1308
+ if (0 === comps.n) return out;
1309
+ const z = Math.abs(invNorm(1 - alpha / 2));
1310
+ if (comps.min === comps.max) {
1311
+ const v = predict(comps.min),
1312
+ errs = stdErrorsAt(comps.min, comps);
1313
+ for (let i = 0; i < N; i++) out.push({
1314
+ x: comps.min,
1315
+ mean: v,
1316
+ lower: v - z * errs.seMean,
1317
+ upper: v + z * errs.seMean,
1318
+ predLower: v - z * errs.sePred,
1319
+ predUpper: v + z * errs.sePred
1320
+ });
1321
+ return out;
1322
+ }
1323
+ const step = (comps.max - comps.min) / (N - 1);
1324
+ for (let i = 0; i < N; i++) {
1325
+ const px = i === N - 1 ? comps.max : comps.min + step * i,
1326
+ yh = predict(px),
1327
+ errs = stdErrorsAt(px, comps);
1328
+ out.push({
1329
+ x: px,
1330
+ mean: yh,
1331
+ lower: yh - z * errs.seMean,
1332
+ upper: yh + z * errs.seMean,
1333
+ predLower: yh - z * errs.sePred,
1334
+ predUpper: yh + z * errs.sePred
1335
+ });
1336
+ }
1337
+ return out;
1338
+ }
1339
+ };
1340
+ }
1341
+
1342
+ const gaussian = u => 1 / Math.sqrt(2 * Math.PI) * Math.exp(-.5 * u * u);
1343
+ function scott(n, std, dim = 1) {
1344
+ return n <= 0 || 0 === std ? 0 : std * Math.pow(n, -1 / (dim + 4));
1345
+ }
1346
+ function silverman(n, std, dim = 1) {
1347
+ if (n <= 0 || 0 === std) return 0;
1348
+ return Math.pow(4 / (dim + 2), 1 / (dim + 4)) * std * Math.pow(n, -1 / (dim + 4));
1349
+ }
1350
+ function std(values) {
1351
+ const n = values.length;
1352
+ if (0 === n) return 0;
1353
+ let mean = 0;
1354
+ for (let i = 0; i < n; i++) mean += values[i];
1355
+ mean /= n;
1356
+ let s = 0;
1357
+ for (let i = 0; i < n; i++) {
1358
+ const d = values[i] - mean;
1359
+ s += d * d;
1360
+ }
1361
+ return Math.sqrt(s / n);
1362
+ }
1363
+ function kde(data, options = {}) {
1364
+ const n = data.length,
1365
+ kernel = options.kernel || gaussian;
1366
+ let h = options.bandwidth;
1367
+ if (!h || h <= 0) {
1368
+ const sd = std(data) || 0,
1369
+ method = options.bandwidthMethod || "scott";
1370
+ h = "silverman" === method ? silverman(n, sd, 1) : scott(n, sd, 1);
1371
+ }
1372
+ if (!h || h <= 0) {
1373
+ return {
1374
+ bandwidth: 0,
1375
+ kernel: kernel,
1376
+ evaluate: x => {
1377
+ if (Array.isArray(x)) {
1378
+ const out = [];
1379
+ for (let i = 0; i < x.length; i++) out.push(0);
1380
+ return out;
1381
+ }
1382
+ return 0;
1383
+ },
1384
+ evaluateGrid: N => {
1385
+ const out = [];
1386
+ if (N <= 0) return out;
1387
+ let min = 1 / 0,
1388
+ max = -1 / 0;
1389
+ for (let j = 0; j < n; j++) {
1390
+ const v = data[j];
1391
+ v < min && (min = v), v > max && (max = v);
1392
+ }
1393
+ if (min === 1 / 0 || max === -1 / 0) {
1394
+ for (let i = 0; i < N; i++) out.push({
1395
+ x: 0,
1396
+ y: 0
1397
+ });
1398
+ return out;
1399
+ }
1400
+ for (let i = 0; i < N; i++) out.push({
1401
+ x: min,
1402
+ y: 0
1403
+ });
1404
+ return out;
1405
+ }
1406
+ };
1407
+ }
1408
+ const invNh = 1 / (n * h);
1409
+ function evalPoint(x) {
1410
+ let sum = 0;
1411
+ for (let j = 0; j < n; j++) sum += kernel((x - data[j]) / h);
1412
+ return sum * invNh;
1413
+ }
1414
+ return {
1415
+ bandwidth: h,
1416
+ kernel: kernel,
1417
+ evaluate: function (x) {
1418
+ if (Array.isArray(x)) {
1419
+ const out = [];
1420
+ for (let i = 0; i < x.length; i++) out.push(evalPoint(x[i]));
1421
+ return out;
1422
+ }
1423
+ return evalPoint(x);
1424
+ },
1425
+ evaluateGrid(N) {
1426
+ const out = [];
1427
+ if (N <= 0) return out;
1428
+ let min = 1 / 0,
1429
+ max = -1 / 0;
1430
+ for (let i = 0; i < n; i++) {
1431
+ const v = data[i];
1432
+ v < min && (min = v), v > max && (max = v);
1433
+ }
1434
+ if (min === 1 / 0 || max === -1 / 0) return out;
1435
+ if (min === max) {
1436
+ for (let i = 0; i < N; i++) out.push({
1437
+ x: min,
1438
+ y: evalPoint(min)
1439
+ });
1440
+ return out;
1441
+ }
1442
+ const step = (max - min) / (N - 1);
1443
+ for (let i = 0; i < N; i++) {
1444
+ const x = i === N - 1 ? max : min + step * i;
1445
+ out.push({
1446
+ x: x,
1447
+ y: evalPoint(x)
1448
+ });
1449
+ }
1450
+ return out;
1451
+ }
1452
+ };
1453
+ }
1454
+
1455
+ function ecdf(data) {
1456
+ const n = data.length,
1457
+ sorted = data.slice().sort((a, b) => a - b);
1458
+ function evaluateSingle(x) {
1459
+ if (0 === n) return 0;
1460
+ let lo = 0,
1461
+ hi = n;
1462
+ for (; lo < hi;) {
1463
+ const mid = lo + hi >>> 1;
1464
+ sorted[mid] <= x ? lo = mid + 1 : hi = mid;
1465
+ }
1466
+ return lo / n;
1467
+ }
1468
+ return {
1469
+ evaluate: function (x) {
1470
+ if (Array.isArray(x)) {
1471
+ const out = [];
1472
+ for (let i = 0; i < x.length; i++) out.push(evaluateSingle(x[i]));
1473
+ return out;
1474
+ }
1475
+ return evaluateSingle(x);
1476
+ },
1477
+ evaluateGrid: function (N) {
1478
+ const out = [];
1479
+ if (N <= 0) return out;
1480
+ if (0 === n) return out;
1481
+ const min = sorted[0],
1482
+ max = sorted[n - 1];
1483
+ if (min === max) {
1484
+ for (let i = 0; i < N; i++) out.push({
1485
+ x: min,
1486
+ y: 1
1487
+ });
1488
+ return out;
1489
+ }
1490
+ const step = (max - min) / (N - 1);
1491
+ for (let i = 0; i < N; i++) {
1492
+ const x = i === N - 1 ? max : min + step * i;
1493
+ out.push({
1494
+ x: x,
1495
+ y: evaluateSingle(x)
1496
+ });
1497
+ }
1498
+ return out;
1499
+ },
1500
+ n: n
1501
+ };
1502
+ }
1503
+
760
1504
  const epsilon = 1e-12;
761
1505
  const pi = Math.PI;
762
1506
  const halfPi$1 = pi / 2;
@@ -25971,6 +26715,307 @@
25971
26715
  }
25972
26716
  };
25973
26717
 
26718
+ const REGRESSION_LINE = 'regressionLine';
26719
+ class RegressionLine extends AbstractComponent {
26720
+ constructor() {
26721
+ super(...arguments);
26722
+ this.name = REGRESSION_LINE;
26723
+ }
26724
+ render() {
26725
+ this.removeAllChild();
26726
+ const { data, line = {}, label, name = 'regression-line', confidenceInterval } = this.attribute;
26727
+ if (isEmpty(data)) {
26728
+ return;
26729
+ }
26730
+ data.forEach(d => {
26731
+ const { color } = d;
26732
+ if (d.area && (confidenceInterval === null || confidenceInterval === void 0 ? void 0 : confidenceInterval.visible) !== false) {
26733
+ const areaShape = createArea(Object.assign(Object.assign({ points: d.area }, (isValid$1(color) ? { fill: color, fillOpacity: 0.12 } : null)), confidenceInterval === null || confidenceInterval === void 0 ? void 0 : confidenceInterval.style));
26734
+ areaShape.name = 'scatter-regression-area';
26735
+ this.add(areaShape);
26736
+ }
26737
+ if (d.line && (line === null || line === void 0 ? void 0 : line.visible) !== false) {
26738
+ const lineShape = createLine(Object.assign(Object.assign({ points: d.line, lineWidth: 1 }, (isValid$1(color) ? { stroke: color } : null)), line === null || line === void 0 ? void 0 : line.style));
26739
+ lineShape.name = `${name}-curve`;
26740
+ this.add(lineShape);
26741
+ }
26742
+ const lastPoint = last(d.line);
26743
+ if (label && label.visible !== false && label.text && lastPoint) {
26744
+ const tag = createText(Object.assign(Object.assign(Object.assign({}, lastPoint), { text: label.text, textAlign: 'end', textBaseline: 'middle' }), label.style));
26745
+ tag.name = `${name}-label`;
26746
+ this.add(tag);
26747
+ }
26748
+ });
26749
+ }
26750
+ }
26751
+ const registerRegressionLine = () => {
26752
+ vchart.Factory.registerGraphicComponent(REGRESSION_LINE, (attrs) => new RegressionLine(attrs));
26753
+ };
26754
+
26755
+ const getRegressionByType$1 = (type, data, x = d => d.x, y = d => d.y, degree) => {
26756
+ switch (type) {
26757
+ case 'logisitc':
26758
+ return regressionLogistic(data, x, y);
26759
+ case 'lowess':
26760
+ return regressionLowess(data, x, y);
26761
+ case 'polynomial':
26762
+ return regressionPolynomial(data, x, y, { degree });
26763
+ default:
26764
+ return regressionLinear(data, x, y);
26765
+ }
26766
+ };
26767
+ function getScatterRegressionLineConfig(type, config) {
26768
+ const { color, line, confidenceInterval, label } = config;
26769
+ return {
26770
+ type: 'component',
26771
+ componentType: REGRESSION_LINE,
26772
+ interactive: false,
26773
+ style: {
26774
+ data: (datum, ctx) => {
26775
+ const vchart$1 = ctx.vchart;
26776
+ const chart = vchart$1.getChart();
26777
+ const series = chart.getAllSeries().filter((s) => s.type === vchart.SeriesTypeEnum.scatter);
26778
+ const regressionData = [];
26779
+ if (series && series.length) {
26780
+ series.forEach(s => {
26781
+ var _a, _b;
26782
+ const start = s.getRegion().getLayoutStartPoint();
26783
+ const rect = s.getRegion().getLayoutRect();
26784
+ const yClamper = clamper(start.y, start.y + rect.height);
26785
+ const colorAttrOptions = s.getColorAttribute();
26786
+ const groups = s.getSeriesKeys();
26787
+ const data = s.getViewData().latestData;
26788
+ const fieldX = (_a = s.fieldX) === null || _a === void 0 ? void 0 : _a[0];
26789
+ const fieldY = (_b = s.fieldY) === null || _b === void 0 ? void 0 : _b[0];
26790
+ if (!fieldX || !fieldY || !data || data.length <= 2) {
26791
+ return;
26792
+ }
26793
+ groups.forEach(group => {
26794
+ var _a;
26795
+ const groupData = data.filter((d) => d[colorAttrOptions === null || colorAttrOptions === void 0 ? void 0 : colorAttrOptions.field] === group);
26796
+ if (!groupData.length) {
26797
+ return;
26798
+ }
26799
+ const { evaluateGrid, confidenceInterval } = getRegressionByType$1(type, groupData, (datum) => datum === null || datum === void 0 ? void 0 : datum[fieldX], (datum) => datum === null || datum === void 0 ? void 0 : datum[fieldY], config.polynomialDegree);
26800
+ const N = Math.max(3, Math.floor(groupData.length / 4));
26801
+ const lineData = evaluateGrid(N);
26802
+ const confidenceData = confidenceInterval(N);
26803
+ regressionData.push({
26804
+ color: color !== null && color !== void 0 ? color : (_a = colorAttrOptions === null || colorAttrOptions === void 0 ? void 0 : colorAttrOptions.scale) === null || _a === void 0 ? void 0 : _a.scale(group),
26805
+ line: lineData.map((ld) => {
26806
+ const d = { [fieldX]: ld.x, [fieldY]: ld.y };
26807
+ return {
26808
+ x: s.dataToPositionX(d) + start.x,
26809
+ y: yClamper(type === 'logisitc' ? start.y + rect.height * (1 - ld.y) : s.dataToPositionY(d) + start.y)
26810
+ };
26811
+ }),
26812
+ area: confidenceData.map((c) => {
26813
+ const d = { [fieldX]: c.x, [fieldY]: c.lower };
26814
+ return {
26815
+ x: s.dataToPositionX(d) + start.x,
26816
+ y: yClamper(s.dataToPositionY(d) + start.y),
26817
+ y1: yClamper(s.dataToPositionY({ [fieldY]: c.upper }) + start.y)
26818
+ };
26819
+ })
26820
+ });
26821
+ });
26822
+ });
26823
+ }
26824
+ return regressionData;
26825
+ },
26826
+ line,
26827
+ confidenceInterval,
26828
+ label
26829
+ }
26830
+ };
26831
+ }
26832
+ function appendScatterRegressionLineConfig(chartSpec, spec) {
26833
+ var _a, _b;
26834
+ if (!spec) {
26835
+ spec =
26836
+ (_a = get$1(chartSpec, REGRESSION_LINE)) !== null && _a !== void 0 ? _a : get$1((_b = chartSpec.series) === null || _b === void 0 ? void 0 : _b.find(s => s.type === vchart.SeriesTypeEnum.scatter), REGRESSION_LINE);
26837
+ }
26838
+ const specs = array(spec);
26839
+ specs.forEach((s) => {
26840
+ if (s.visible !== false) {
26841
+ if (!chartSpec.customMark) {
26842
+ chartSpec.customMark = [];
26843
+ }
26844
+ const { type } = s, rest = __rest$1(s, ["type"]);
26845
+ chartSpec.customMark.push(getScatterRegressionLineConfig(type, rest));
26846
+ }
26847
+ });
26848
+ }
26849
+
26850
+ function getBarRegressionLineConfig(config) {
26851
+ const { color, line, confidenceInterval, label } = config;
26852
+ return {
26853
+ type: 'component',
26854
+ componentType: REGRESSION_LINE,
26855
+ interactive: false,
26856
+ zIndex: 500,
26857
+ style: {
26858
+ data: (datum, ctx) => {
26859
+ const vchart$1 = ctx.vchart;
26860
+ const chart = vchart$1.getChart();
26861
+ const series = chart.getAllSeries().filter((s) => s.type === vchart.SeriesTypeEnum.bar);
26862
+ const regressionData = [];
26863
+ if (series && series.length) {
26864
+ series.forEach(s => {
26865
+ var _a, _b, _c;
26866
+ const region = s.getRegion().getLayoutStartPoint();
26867
+ const start = s.getRegion().getLayoutStartPoint();
26868
+ const rect = s.getRegion().getLayoutRect();
26869
+ const yClamper = clamper(start.y, start.y + rect.height);
26870
+ const data = s.getViewData().latestData;
26871
+ const fieldX = (_a = s.fieldX) === null || _a === void 0 ? void 0 : _a[0];
26872
+ const fieldY = (_b = s.fieldY) === null || _b === void 0 ? void 0 : _b[0];
26873
+ const isHorizontal = s.direction === "horizontal";
26874
+ const groups = s.getRawDataStatisticsByField(fieldX).values;
26875
+ if (isHorizontal || !fieldX || !fieldY || !data || data.length <= 2 || groups.length <= 2) {
26876
+ return;
26877
+ }
26878
+ const { evaluateGrid, confidenceInterval } = regressionPolynomial(data, (datum) => groups.indexOf(datum === null || datum === void 0 ? void 0 : datum[fieldX]), (datum) => datum === null || datum === void 0 ? void 0 : datum[fieldY], { degree: config.degree });
26879
+ const N = groups.length;
26880
+ const lineData = evaluateGrid(N);
26881
+ const confidenceData = confidenceInterval(N);
26882
+ const halfBandWidth = s.getXAxisHelper().getBandwidth(0) / 2;
26883
+ regressionData.push({
26884
+ color: color !== null && color !== void 0 ? color : (_c = s.getOption().globalScale.getScale('color')) === null || _c === void 0 ? void 0 : _c.scale(s.getSeriesKeys()[0]),
26885
+ line: lineData.map((ld) => {
26886
+ const d = { [fieldX]: groups[ld.x], [fieldY]: ld.y };
26887
+ return {
26888
+ x: s.dataToPositionX(d) + region.x + halfBandWidth,
26889
+ y: yClamper(s.dataToPositionY(d) + region.y)
26890
+ };
26891
+ }),
26892
+ area: confidenceData.map((c) => {
26893
+ const d = { [fieldX]: groups[c.x], [fieldY]: c.lower };
26894
+ return {
26895
+ x: s.dataToPositionX(d) + region.x + halfBandWidth,
26896
+ y: yClamper(s.dataToPositionY(d) + region.y),
26897
+ y1: yClamper(s.dataToPositionY({ [fieldY]: c.upper }) + region.y)
26898
+ };
26899
+ })
26900
+ });
26901
+ });
26902
+ }
26903
+ return regressionData;
26904
+ },
26905
+ line,
26906
+ confidenceInterval,
26907
+ label
26908
+ }
26909
+ };
26910
+ }
26911
+ function appendBarRegressionLineConfig(chartSpec, spec) {
26912
+ var _a, _b;
26913
+ if (!spec) {
26914
+ spec =
26915
+ (_a = get$1(chartSpec, REGRESSION_LINE)) !== null && _a !== void 0 ? _a : get$1((_b = chartSpec.series) === null || _b === void 0 ? void 0 : _b.find(s => s.type === vchart.SeriesTypeEnum.bar), REGRESSION_LINE);
26916
+ }
26917
+ const specs = array(spec);
26918
+ specs.forEach((s) => {
26919
+ if (s.visible !== false) {
26920
+ if (!chartSpec.customMark) {
26921
+ chartSpec.customMark = [];
26922
+ }
26923
+ const rest = __rest$1(s, ["visible"]);
26924
+ chartSpec.customMark.push(getBarRegressionLineConfig(rest));
26925
+ }
26926
+ });
26927
+ }
26928
+
26929
+ const getRegressionByType = (type, data, kdeOptions) => {
26930
+ switch (type) {
26931
+ case 'kde':
26932
+ return kde(data, kdeOptions);
26933
+ case 'ecdf':
26934
+ return ecdf(data);
26935
+ }
26936
+ };
26937
+ function getHistogramRegressionLineConfig(type, config) {
26938
+ const { line, label, color } = config;
26939
+ return {
26940
+ type: 'component',
26941
+ componentType: REGRESSION_LINE,
26942
+ interactive: false,
26943
+ zIndex: 500,
26944
+ style: {
26945
+ data: (datum, ctx) => {
26946
+ const vchart$1 = ctx.vchart;
26947
+ const chart = vchart$1.getChart();
26948
+ const series = chart.getAllSeries().filter((s) => s.type === vchart.SeriesTypeEnum.bar);
26949
+ const regressionData = [];
26950
+ if (series && series.length) {
26951
+ series.forEach(s => {
26952
+ var _a, _b, _c, _d, _e, _f, _g, _h;
26953
+ const region = s.getRegion().getLayoutStartPoint();
26954
+ const rawData = s._rawData;
26955
+ const data = rawData === null || rawData === void 0 ? void 0 : rawData.rawData;
26956
+ const binTransformOptions = (_b = (_a = rawData.transformsArr) === null || _a === void 0 ? void 0 : _a.find((t) => t.type === 'bin')) === null || _b === void 0 ? void 0 : _b.options;
26957
+ const fieldX = (_c = s.fieldX) === null || _c === void 0 ? void 0 : _c[0];
26958
+ const scaleY = s.getYAxisHelper().getScale(0);
26959
+ const viewData = s.getViewData().latestData;
26960
+ if (!data || !data.length || !(binTransformOptions === null || binTransformOptions === void 0 ? void 0 : binTransformOptions.field) || !scaleY || !viewData || !viewData.length) {
26961
+ return;
26962
+ }
26963
+ const simpleData = data.map((entry) => entry[binTransformOptions.field]);
26964
+ const res = getRegressionByType(type, simpleData, type === 'kde'
26965
+ ? {
26966
+ bandwidth: viewData[0][(_e = (_d = binTransformOptions.outputNames) === null || _d === void 0 ? void 0 : _d.x1) !== null && _e !== void 0 ? _e : 'x1'] -
26967
+ viewData[0][(_g = (_f = binTransformOptions.outputNames) === null || _f === void 0 ? void 0 : _f.x0) !== null && _g !== void 0 ? _g : 'x0']
26968
+ }
26969
+ : null);
26970
+ const N = Math.max(3, Math.floor(simpleData.length / 4));
26971
+ const lineData = res.evaluateGrid(N);
26972
+ const yRange = scaleY.range();
26973
+ const y0 = yRange[0];
26974
+ const y1 = last(yRange);
26975
+ const scaleR = type === 'kde'
26976
+ ? (k) => {
26977
+ return scaleY.scale(k * data.length * res.bandwidth);
26978
+ }
26979
+ : (e) => {
26980
+ return y0 + (y1 - y0) * e;
26981
+ };
26982
+ regressionData.push({
26983
+ color: color !== null && color !== void 0 ? color : (_h = s.getOption().globalScale.getScale('color')) === null || _h === void 0 ? void 0 : _h.scale(s.getSeriesKeys()[0]),
26984
+ line: lineData.map((ld) => {
26985
+ const d = { [fieldX]: ld.x };
26986
+ return {
26987
+ x: s.dataToPositionX(d) + region.x,
26988
+ y: scaleR(ld.y) + region.y
26989
+ };
26990
+ })
26991
+ });
26992
+ });
26993
+ }
26994
+ return regressionData;
26995
+ },
26996
+ line,
26997
+ label
26998
+ }
26999
+ };
27000
+ }
27001
+ function appendHistogramRegressionLineConfig(chartSpec, spec) {
27002
+ var _a, _b;
27003
+ if (!spec) {
27004
+ spec =
27005
+ (_a = get$1(chartSpec, REGRESSION_LINE)) !== null && _a !== void 0 ? _a : get$1((_b = chartSpec.series) === null || _b === void 0 ? void 0 : _b.find(s => s.type === vchart.SeriesTypeEnum.bar), REGRESSION_LINE);
27006
+ }
27007
+ const specs = array(spec);
27008
+ specs.forEach((s) => {
27009
+ if (s.visible !== false) {
27010
+ if (!chartSpec.customMark) {
27011
+ chartSpec.customMark = [];
27012
+ }
27013
+ const { type } = s, rest = __rest$1(s, ["type"]);
27014
+ chartSpec.customMark.push(getHistogramRegressionLineConfig(type, rest));
27015
+ }
27016
+ });
27017
+ }
27018
+
25974
27019
  exports.BAR_LINK = BAR_LINK;
25975
27020
  exports.Bar3dChart = Bar3dChart;
25976
27021
  exports.Bar3dChartSpecTransformer = Bar3dChartSpecTransformer;
@@ -25999,12 +27044,14 @@
25999
27044
  exports.Pie3dChartSpecTransformer = Pie3dChartSpecTransformer;
26000
27045
  exports.Pie3dSeries = Pie3dSeries;
26001
27046
  exports.Pie3dSeriesSpecTransformer = Pie3dSeriesSpecTransformer;
27047
+ exports.REGRESSION_LINE = REGRESSION_LINE;
26002
27048
  exports.RangeColumn3dChart = RangeColumn3dChart;
26003
27049
  exports.RangeColumn3dChartSpecTransformer = RangeColumn3dChartSpecTransformer;
26004
27050
  exports.RangeColumn3dSeries = RangeColumn3dSeries;
26005
27051
  exports.RangeColumn3dSeriesSpecTransformer = RangeColumn3dSeriesSpecTransformer;
26006
27052
  exports.RankingBar = RankingBar;
26007
27053
  exports.RankingList = RankingList;
27054
+ exports.RegressionLine = RegressionLine;
26008
27055
  exports.SERIES_BREAK = SERIES_BREAK;
26009
27056
  exports.SequenceScatterKDE = SequenceScatterKDE;
26010
27057
  exports.SequenceScatterLink = SequenceScatterLink;
@@ -26015,11 +27062,17 @@
26015
27062
  exports.WordCloud3dChartSpecTransformer = WordCloud3dChartSpecTransformer;
26016
27063
  exports.WordCloud3dSeries = WordCloud3dSeries;
26017
27064
  exports.appendBarLinkConfig = appendBarLinkConfig;
27065
+ exports.appendBarRegressionLineConfig = appendBarRegressionLineConfig;
27066
+ exports.appendHistogramRegressionLineConfig = appendHistogramRegressionLineConfig;
27067
+ exports.appendScatterRegressionLineConfig = appendScatterRegressionLineConfig;
26018
27068
  exports.appendSeriesBreakConfig = appendSeriesBreakConfig;
26019
27069
  exports.appendSeriesLabelConfig = appendSeriesLabelConfig;
26020
27070
  exports.clearSVGSource = clearSVGSource;
26021
27071
  exports.getBarLinkConfig = getBarLinkConfig;
27072
+ exports.getBarRegressionLineConfig = getBarRegressionLineConfig;
27073
+ exports.getHistogramRegressionLineConfig = getHistogramRegressionLineConfig;
26022
27074
  exports.getSVGSource = getSVGSource;
27075
+ exports.getScatterRegressionLineConfig = getScatterRegressionLineConfig;
26023
27076
  exports.getSeriesBreakConfig = getSeriesBreakConfig;
26024
27077
  exports.getSeriesLabelConfig = getSeriesLabelConfig;
26025
27078
  exports.register3DPlugin = register3DPlugin;
@@ -26044,6 +27097,7 @@
26044
27097
  exports.registerRangeColumn3dSeries = registerRangeColumn3dSeries;
26045
27098
  exports.registerRankingBarChart = registerRankingBarChart;
26046
27099
  exports.registerRankingList = registerRankingList;
27100
+ exports.registerRegressionLine = registerRegressionLine;
26047
27101
  exports.registerSVGSource = registerSVGSource;
26048
27102
  exports.registerSequenceScatterKDE = registerSequenceScatterKDE;
26049
27103
  exports.registerSequenceScatterLink = registerSequenceScatterLink;