@visactor/vseed 0.1.40 → 0.1.41

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 (94) hide show
  1. package/dist/cjs/index.cjs +3 -3
  2. package/dist/cjs/index.cjs.map +1 -1
  3. package/dist/esm/builder/builder/builder.d.ts +2788 -286
  4. package/dist/esm/pipeline/advanced/chart/pipeline/column.js +3 -2
  5. package/dist/esm/pipeline/advanced/chart/pipeline/column.js.map +1 -1
  6. package/dist/esm/pipeline/advanced/chart/pipeline/scatter.js +3 -2
  7. package/dist/esm/pipeline/advanced/chart/pipeline/scatter.js.map +1 -1
  8. package/dist/esm/pipeline/advanced/chart/pipes/regressionLine/regressionLine.js +28 -1
  9. package/dist/esm/pipeline/advanced/chart/pipes/regressionLine/regressionLine.js.map +1 -1
  10. package/dist/esm/pipeline/advanced/chart/pipes/reshape/pivotReshapeWithBoxplotEncoding.js +0 -1
  11. package/dist/esm/pipeline/advanced/chart/pipes/reshape/pivotReshapeWithBoxplotEncoding.js.map +1 -1
  12. package/dist/esm/pipeline/spec/chart/pipeline/column.js +5 -3
  13. package/dist/esm/pipeline/spec/chart/pipeline/column.js.map +1 -1
  14. package/dist/esm/pipeline/spec/chart/pipeline/histogram.js +5 -3
  15. package/dist/esm/pipeline/spec/chart/pipeline/histogram.js.map +1 -1
  16. package/dist/esm/pipeline/spec/chart/pipeline/scatter.js +9 -3
  17. package/dist/esm/pipeline/spec/chart/pipeline/scatter.js.map +1 -1
  18. package/dist/esm/pipeline/spec/chart/pipes/regressionLine/columnRegressionLine.d.ts +2 -0
  19. package/dist/esm/pipeline/spec/chart/pipes/regressionLine/columnRegressionLine.js +150 -0
  20. package/dist/esm/pipeline/spec/chart/pipes/regressionLine/columnRegressionLine.js.map +1 -0
  21. package/dist/esm/pipeline/spec/chart/pipes/regressionLine/common.d.ts +4 -0
  22. package/dist/esm/pipeline/spec/chart/pipes/regressionLine/common.js +21 -0
  23. package/dist/esm/pipeline/spec/chart/pipes/regressionLine/common.js.map +1 -0
  24. package/dist/esm/pipeline/spec/chart/pipes/regressionLine/ecdfRegressionLine.d.ts +2 -0
  25. package/dist/esm/pipeline/spec/chart/pipes/regressionLine/ecdfRegressionLine.js +98 -0
  26. package/dist/esm/pipeline/spec/chart/pipes/regressionLine/ecdfRegressionLine.js.map +1 -0
  27. package/dist/esm/pipeline/spec/chart/pipes/regressionLine/index.d.ts +4 -1
  28. package/dist/esm/pipeline/spec/chart/pipes/regressionLine/index.js +4 -1
  29. package/dist/esm/pipeline/spec/chart/pipes/regressionLine/kdeRegressionLine.d.ts +2 -0
  30. package/dist/esm/pipeline/spec/chart/pipes/regressionLine/kdeRegressionLine.js +98 -0
  31. package/dist/esm/pipeline/spec/chart/pipes/regressionLine/kdeRegressionLine.js.map +1 -0
  32. package/dist/esm/pipeline/spec/chart/pipes/regressionLine/linearRegressionLine.d.ts +16 -0
  33. package/dist/esm/pipeline/spec/chart/pipes/regressionLine/linearRegressionLine.js +159 -0
  34. package/dist/esm/pipeline/spec/chart/pipes/regressionLine/linearRegressionLine.js.map +1 -0
  35. package/dist/esm/theme/common/regressionLine.d.ts +8 -4
  36. package/dist/esm/theme/common/regressionLine.js +60 -8
  37. package/dist/esm/theme/common/regressionLine.js.map +1 -1
  38. package/dist/esm/theme/dark/dark.js +6 -4
  39. package/dist/esm/theme/dark/dark.js.map +1 -1
  40. package/dist/esm/theme/light/light.js +6 -4
  41. package/dist/esm/theme/light/light.js.map +1 -1
  42. package/dist/esm/types/advancedVSeed.d.ts +908 -37
  43. package/dist/esm/types/advancedVSeed.js +2 -2
  44. package/dist/esm/types/advancedVSeed.js.map +1 -1
  45. package/dist/esm/types/chartType/column/column.d.ts +6 -1
  46. package/dist/esm/types/chartType/column/zColumn.d.ts +25 -0
  47. package/dist/esm/types/chartType/column/zColumn.js +2 -1
  48. package/dist/esm/types/chartType/column/zColumn.js.map +1 -1
  49. package/dist/esm/types/chartType/histogram/histogram.d.ts +7 -3
  50. package/dist/esm/types/chartType/histogram/zHistogram.d.ts +19 -4
  51. package/dist/esm/types/chartType/histogram/zHistogram.js +3 -2
  52. package/dist/esm/types/chartType/histogram/zHistogram.js.map +1 -1
  53. package/dist/esm/types/chartType/scatter/scatter.d.ts +21 -1
  54. package/dist/esm/types/chartType/scatter/zScatter.d.ts +94 -0
  55. package/dist/esm/types/chartType/scatter/zScatter.js +5 -1
  56. package/dist/esm/types/chartType/scatter/zScatter.js.map +1 -1
  57. package/dist/esm/types/properties/config/column.d.ts +132 -2
  58. package/dist/esm/types/properties/config/column.js +6 -3
  59. package/dist/esm/types/properties/config/column.js.map +1 -1
  60. package/dist/esm/types/properties/config/config.d.ts +389 -9
  61. package/dist/esm/types/properties/config/histogram.d.ts +129 -9
  62. package/dist/esm/types/properties/config/histogram.js +2 -2
  63. package/dist/esm/types/properties/config/histogram.js.map +1 -1
  64. package/dist/esm/types/properties/config/scatter.d.ts +130 -0
  65. package/dist/esm/types/properties/config/scatter.js +3 -1
  66. package/dist/esm/types/properties/config/scatter.js.map +1 -1
  67. package/dist/esm/types/properties/regressionLine/{histogramRegressionLine.d.ts → ecdfRegressionLine.d.ts} +2 -7
  68. package/dist/esm/types/properties/regressionLine/index.d.ts +7 -2
  69. package/dist/esm/types/properties/regressionLine/index.js +1 -1
  70. package/dist/esm/types/properties/regressionLine/kdeRegressionLine.d.ts +40 -0
  71. package/dist/esm/types/properties/regressionLine/kdeRegressionLine.js +0 -0
  72. package/dist/esm/types/properties/regressionLine/linearRegressionLine.d.ts +53 -0
  73. package/dist/esm/types/properties/regressionLine/linearRegressionLine.js +0 -0
  74. package/dist/esm/types/properties/regressionLine/logisticRegressionLine.d.ts +53 -0
  75. package/dist/esm/types/properties/regressionLine/logisticRegressionLine.js +0 -0
  76. package/dist/esm/types/properties/regressionLine/lowessRegressionLine.d.ts +53 -0
  77. package/dist/esm/types/properties/regressionLine/lowessRegressionLine.js +0 -0
  78. package/dist/esm/types/properties/regressionLine/polynomialRegressionLine.d.ts +57 -0
  79. package/dist/esm/types/properties/regressionLine/polynomialRegressionLine.js +0 -0
  80. package/dist/esm/types/properties/regressionLine/zRegressionLine.d.ts +199 -0
  81. package/dist/esm/types/properties/regressionLine/zRegressionLine.js +32 -0
  82. package/dist/esm/types/properties/regressionLine/zRegressionLine.js.map +1 -0
  83. package/dist/esm/types/properties/theme/customTheme.d.ts +778 -18
  84. package/dist/esm/types/zVseed.d.ts +138 -4
  85. package/dist/umd/index.js +1144 -131
  86. package/dist/umd/index.js.map +1 -1
  87. package/package.json +1 -1
  88. package/dist/esm/pipeline/spec/chart/pipes/regressionLine/histogramRegressionLine.d.ts +0 -2
  89. package/dist/esm/pipeline/spec/chart/pipes/regressionLine/histogramRegressionLine.js +0 -126
  90. package/dist/esm/pipeline/spec/chart/pipes/regressionLine/histogramRegressionLine.js.map +0 -1
  91. package/dist/esm/types/properties/regressionLine/zHistogramRegressionLine.d.ts +0 -11
  92. package/dist/esm/types/properties/regressionLine/zHistogramRegressionLine.js +0 -17
  93. package/dist/esm/types/properties/regressionLine/zHistogramRegressionLine.js.map +0 -1
  94. /package/dist/esm/types/properties/regressionLine/{histogramRegressionLine.js → ecdfRegressionLine.js} +0 -0
package/dist/umd/index.js CHANGED
@@ -85,11 +85,11 @@
85
85
  isRadar: ()=>isRadar,
86
86
  zSortLegend: ()=>zSortLegend,
87
87
  pivotTableAdvancedPipeline: ()=>pivotTableAdvancedPipeline,
88
+ zLogisticRegressionLine: ()=>zLogisticRegressionLine,
88
89
  zAnnotationHorizontalLine: ()=>zAnnotationHorizontalLine,
89
90
  zYLinearAxis: ()=>zYLinearAxis,
90
91
  zMarkStyle: ()=>zMarkStyle,
91
92
  registerFunnel: ()=>registerFunnel,
92
- zHistogramRegressionLine: ()=>zHistogramRegressionLine,
93
93
  columnAdvancedPipeline: ()=>columnAdvancedPipeline,
94
94
  zLabel: ()=>zLabel,
95
95
  registerColumn: ()=>registerColumn,
@@ -138,6 +138,7 @@
138
138
  registerAll: ()=>registerAll,
139
139
  isVChart: ()=>isVChart,
140
140
  registerBar: ()=>registerBar,
141
+ zPolynomialRegressionLine: ()=>zPolynomialRegressionLine,
141
142
  zColor: ()=>zColor,
142
143
  registerDonut: ()=>registerDonut,
143
144
  BinStartMeasureId: ()=>BinStartMeasureId,
@@ -172,6 +173,7 @@
172
173
  areaPercentAdvancedPipeline: ()=>areaPercentAdvancedPipeline,
173
174
  zBackgroundColor: ()=>zBackgroundColor,
174
175
  zAreaPercentConfig: ()=>zAreaPercentConfig,
176
+ zLowessRegressionLine: ()=>zLowessRegressionLine,
175
177
  registerRadar: ()=>registerRadar,
176
178
  zMeasure: ()=>zMeasure,
177
179
  zLocale: ()=>zLocale,
@@ -193,6 +195,7 @@
193
195
  isPivotTable: ()=>isPivotTable,
194
196
  registerPie: ()=>registerPie,
195
197
  zDimensionEncoding: ()=>zDimensionEncoding,
198
+ zEcdfRegressionLine: ()=>zEcdfRegressionLine,
196
199
  zBarParallelConfig: ()=>zBarParallelConfig,
197
200
  lineAdvancedPipeline: ()=>lineAdvancedPipeline,
198
201
  FoldMeasureValue: ()=>FoldMeasureValue,
@@ -216,10 +219,12 @@
216
219
  findFirstMeasure: ()=>findFirstMeasure,
217
220
  scatterAdvancedPipeline: ()=>scatterAdvancedPipeline,
218
221
  zFunnelTransform: ()=>zFunnelTransform,
222
+ zLinearRegressionLine: ()=>zLinearRegressionLine,
219
223
  zRoseConfig: ()=>zRoseConfig,
220
224
  zScatterMeasures: ()=>zScatterMeasures,
221
225
  zAnnotation: ()=>zAnnotation,
222
226
  selector: ()=>selector_selector,
227
+ zKdeRegressionLine: ()=>zKdeRegressionLine,
223
228
  isMeasures: ()=>isMeasures,
224
229
  zYBandAxis: ()=>zYBandAxis,
225
230
  BinPercentageMeasureId: ()=>BinPercentageMeasureId,
@@ -232,6 +237,7 @@
232
237
  registerHistogram: ()=>registerHistogram,
233
238
  zRoseParallel: ()=>zRoseParallel,
234
239
  MeasureName: ()=>MeasureName,
240
+ zRegressionLine: ()=>zRegressionLine,
235
241
  zNumFormat: ()=>zNumFormat,
236
242
  FoldYMeasureValue: ()=>FoldYMeasureValue,
237
243
  zPivotTableConfig: ()=>zPivotTableConfig,
@@ -425,7 +431,7 @@
425
431
  function C(t, ...o) {
426
432
  let n = t, u = o.map((e)=>"lazy" in e ? chunk_3GOCSNFN_y(e) : void 0), p = 0;
427
433
  for(; p < o.length;){
428
- if (void 0 === u[p] || !B(n)) {
434
+ if (void 0 === u[p] || !chunk_3GOCSNFN_B(n)) {
429
435
  let i = o[p];
430
436
  n = i(n), p += 1;
431
437
  continue;
@@ -467,7 +473,7 @@
467
473
  items: []
468
474
  });
469
475
  }
470
- function B(t) {
476
+ function chunk_3GOCSNFN_B(t) {
471
477
  return "string" == typeof t || "object" == typeof t && null !== t && Symbol.iterator in t;
472
478
  }
473
479
  function chunk_LFJW7BOT_y(t, i) {
@@ -2395,7 +2401,7 @@
2395
2401
  if (chunk_BZNENX2T_r(obj)) return C(obj, chunk_3ZJAREUD_i((value)=>replaceNullToUndefined(value)));
2396
2402
  return obj;
2397
2403
  };
2398
- const lineConfig = (advancedVSeed, context)=>{
2404
+ const line_lineConfig = (advancedVSeed, context)=>{
2399
2405
  const { vseed } = context;
2400
2406
  const { chartType } = vseed;
2401
2407
  const result = {
@@ -2472,7 +2478,7 @@
2472
2478
  ]),
2473
2479
  sortXBandAxis,
2474
2480
  sortLegend_sortLegend,
2475
- lineConfig,
2481
+ line_lineConfig,
2476
2482
  theme_theme,
2477
2483
  markStyle_markStyle,
2478
2484
  annotation_annotation
@@ -4680,6 +4686,38 @@
4680
4686
  };
4681
4687
  return result;
4682
4688
  };
4689
+ const regressionLine_regressionLine = (advancedVSeed, context)=>{
4690
+ const { vseed } = context;
4691
+ let keys = [];
4692
+ if ('histogram' === vseed.chartType) keys = [
4693
+ 'kdeRegressionLine',
4694
+ 'ecdfRegressionLine'
4695
+ ];
4696
+ else if ('scatter' === vseed.chartType) keys = [
4697
+ 'linearRegressionLine',
4698
+ 'lowessRegressionLine',
4699
+ 'polynomialRegressionLine',
4700
+ 'logisticRegressionLine'
4701
+ ];
4702
+ else if ('column' === vseed.chartType) keys = [
4703
+ 'polynomialRegressionLine'
4704
+ ];
4705
+ if (keys.length) {
4706
+ const regressionLineConfig = {};
4707
+ let hasLine = false;
4708
+ keys.forEach((key)=>{
4709
+ if (vseed[key]) {
4710
+ hasLine = true;
4711
+ regressionLineConfig[key] = true === vseed[key] ? {} : vseed[key];
4712
+ }
4713
+ });
4714
+ return hasLine ? {
4715
+ ...advancedVSeed,
4716
+ regressionLine: regressionLineConfig
4717
+ } : advancedVSeed;
4718
+ }
4719
+ return advancedVSeed;
4720
+ };
4683
4721
  const columnAdvancedPipeline = [
4684
4722
  initAdvancedVSeed_initAdvancedVSeed,
4685
4723
  default_defaultMeasures_defaultMeasures,
@@ -4708,7 +4746,8 @@
4708
4746
  columnConfig,
4709
4747
  theme_theme,
4710
4748
  markStyle_markStyle,
4711
- annotation_annotation
4749
+ annotation_annotation,
4750
+ regressionLine_regressionLine
4712
4751
  ];
4713
4752
  const initColumn = (spec, context)=>{
4714
4753
  const result = {
@@ -5031,6 +5070,454 @@
5031
5070
  markArea: markArea
5032
5071
  };
5033
5072
  };
5073
+ const isType_isType = (value, type)=>Object.prototype.toString.call(value) === `[object ${type}]`;
5074
+ const isType = isType_isType;
5075
+ const isArray_isArray = (value)=>Array.isArray ? Array.isArray(value) : isType(value, "Array");
5076
+ const common_isArray = isArray_isArray;
5077
+ const isValid = (value)=>null != value;
5078
+ const common_isValid = isValid;
5079
+ function array_array(arr) {
5080
+ return common_isValid(arr) ? common_isArray(arr) ? arr : [
5081
+ arr
5082
+ ] : [];
5083
+ }
5084
+ function clamper(a, b) {
5085
+ let t;
5086
+ return a > b && (t = a, a = b, b = t), (x)=>Math.max(a, Math.min(b, x));
5087
+ }
5088
+ const isNil = (value)=>null == value;
5089
+ const common_isNil = isNil;
5090
+ function invNorm(p) {
5091
+ if (p <= 0 || p >= 1) return 0;
5092
+ const c1 = -0.00778489400243029, c2 = -0.322396458041136, c3 = -2.40075827716184, c4 = -2.54973253934373, c5 = 4.37466414146497, c6 = 2.93816398269878, d1 = .00778469570904146, d2 = .32246712907004, d3 = 2.445134137143, d4 = 3.75440866190742;
5093
+ let q, r;
5094
+ 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));
5095
+ }
5096
+ function computeLinearCIComponents(data, x, y, predict) {
5097
+ let min = 1 / 0, max = -1 / 0, n = 0, sumX = 0;
5098
+ for(let i = 0; i < data.length; i++){
5099
+ const d = data[i];
5100
+ let dx = x(d), dy = y(d);
5101
+ !common_isNil(dx) && (dx *= 1) >= dx && !common_isNil(dy) && (dy *= 1) >= dy && (dx < min && (min = dx), dx > max && (max = dx), n++, sumX += dx);
5102
+ }
5103
+ if (0 === n) return {
5104
+ min: min,
5105
+ max: max,
5106
+ n: n,
5107
+ X: 0,
5108
+ SSE: 0,
5109
+ Sxx: 0
5110
+ };
5111
+ const X = sumX / n;
5112
+ let SSE = 0, Sxx = 0;
5113
+ for(let i = 0; i < data.length; i++){
5114
+ const d = data[i];
5115
+ let dx = x(d), dy = y(d);
5116
+ if (!common_isNil(dx) && (dx *= 1) >= dx && !common_isNil(dy) && (dy *= 1) >= dy) {
5117
+ const r = dy - predict(dx);
5118
+ SSE += r * r;
5119
+ const dxc = dx - X;
5120
+ Sxx += dxc * dxc;
5121
+ }
5122
+ }
5123
+ return {
5124
+ min: min,
5125
+ max: max,
5126
+ n: n,
5127
+ X: X,
5128
+ SSE: SSE,
5129
+ Sxx: Sxx
5130
+ };
5131
+ }
5132
+ function stdErrorsAt(px, comps) {
5133
+ const { n: n, X: X, Sxx: Sxx, SSE: SSE } = comps, s2 = n > 2 ? SSE / (n - 2) : 0;
5134
+ return {
5135
+ seMean: Sxx > 0 ? Math.sqrt(s2 * (1 / n + (px - X) * (px - X) / Sxx)) : Math.sqrt(s2 / n),
5136
+ sePred: Math.sqrt(s2 * (1 + 1 / n + (Sxx > 0 ? (px - X) * (px - X) / Sxx : 0)))
5137
+ };
5138
+ }
5139
+ function ordinaryLeastSquares(uX, uY, uXY, uX2) {
5140
+ const denom = uX2 - uX * uX;
5141
+ if (Math.abs(denom) < Number.EPSILON) return {
5142
+ a: uY,
5143
+ b: 0
5144
+ };
5145
+ const b = (uXY - uX * uY) / denom;
5146
+ return {
5147
+ a: uY - b * uX,
5148
+ b: b
5149
+ };
5150
+ }
5151
+ function visitPoints(data, x, y, callback) {
5152
+ for(let i = 0; i < data.length; i++){
5153
+ const d = data[i];
5154
+ let xi = x(d), yi = y(d);
5155
+ !common_isNil(xi) && (xi *= 1) >= xi && !common_isNil(yi) && (yi *= 1) >= yi && callback(xi, yi, i);
5156
+ }
5157
+ }
5158
+ function rSquared(data, x, y, uY, predict) {
5159
+ let ssr = 0, sst = 0;
5160
+ for(let i = 0; i < data.length; i++){
5161
+ const d = data[i];
5162
+ let yi = y(d);
5163
+ if (!common_isNil(yi) && (yi *= 1) >= yi) {
5164
+ const r = yi - predict(x(d));
5165
+ ssr += r * r;
5166
+ const t = yi - uY;
5167
+ sst += t * t;
5168
+ }
5169
+ }
5170
+ return 0 === sst ? 0 : 1 - ssr / sst;
5171
+ }
5172
+ function regressionLinear(data, x = (d)=>d.x, y = (d)=>d.y) {
5173
+ let n = 0, meanX = 0, meanY = 0, meanXY = 0, meanX2 = 0;
5174
+ visitPoints(data, x, y, (xi, yi)=>{
5175
+ n++, meanX += (xi - meanX) / n, meanY += (yi - meanY) / n, meanXY += (xi * yi - meanXY) / n, meanX2 += (xi * xi - meanX2) / n;
5176
+ });
5177
+ const { a: a, b: b } = ordinaryLeastSquares(meanX, meanY, meanXY, meanX2), predict = (xx)=>a + b * xx, comps = computeLinearCIComponents(data, x, y, predict);
5178
+ return {
5179
+ coef: {
5180
+ a: a,
5181
+ b: b
5182
+ },
5183
+ predict: predict,
5184
+ rSquared: rSquared(data, x, y, meanY, predict),
5185
+ evaluateGrid: function(N) {
5186
+ const out = [];
5187
+ if (0 === comps.n || N <= 0) return out;
5188
+ if (comps.min === comps.max) {
5189
+ for(let i = 0; i < N; i++)out.push({
5190
+ x: comps.min,
5191
+ y: predict(comps.min)
5192
+ });
5193
+ return out;
5194
+ }
5195
+ const step = (comps.max - comps.min) / (N - 1);
5196
+ for(let i = 0; i < N; i++){
5197
+ const px = i === N - 1 ? comps.max : comps.min + step * i;
5198
+ out.push({
5199
+ x: px,
5200
+ y: predict(px)
5201
+ });
5202
+ }
5203
+ return out;
5204
+ },
5205
+ confidenceInterval: function(N = 50, alpha = .05) {
5206
+ const out = [];
5207
+ if (0 === comps.n || N <= 0) return out;
5208
+ const z = invNorm(1 - alpha / 2);
5209
+ if (comps.min === comps.max) {
5210
+ const m = predict(comps.min), errs = stdErrorsAt(comps.min, comps);
5211
+ for(let i = 0; i < N; i++)out.push({
5212
+ x: comps.min,
5213
+ mean: m,
5214
+ lower: m - z * errs.seMean,
5215
+ upper: m + z * errs.seMean,
5216
+ predLower: m - z * errs.sePred,
5217
+ predUpper: m + z * errs.sePred
5218
+ });
5219
+ return out;
5220
+ }
5221
+ const step = (comps.max - comps.min) / (N - 1);
5222
+ for(let i = 0; i < N; i++){
5223
+ const px = i === N - 1 ? comps.max : comps.min + step * i, m = predict(px), errs = stdErrorsAt(px, comps);
5224
+ out.push({
5225
+ x: px,
5226
+ mean: m,
5227
+ lower: m - z * errs.seMean,
5228
+ upper: m + z * errs.seMean,
5229
+ predLower: m - z * errs.sePred,
5230
+ predUpper: m + z * errs.sePred
5231
+ });
5232
+ }
5233
+ return out;
5234
+ }
5235
+ };
5236
+ }
5237
+ function solveLinearSystem(A, b) {
5238
+ const n = b.length, M = new Array(n);
5239
+ for(let i = 0; i < n; i++)M[i] = A[i].slice(), M[i].push(b[i]);
5240
+ for(let k = 0; k < n; k++){
5241
+ let maxRow = k, maxVal = Math.abs(M[k][k]);
5242
+ for(let i = k + 1; i < n; i++){
5243
+ const v = Math.abs(M[i][k]);
5244
+ v > maxVal && (maxVal = v, maxRow = i);
5245
+ }
5246
+ if (maxRow !== k) {
5247
+ const tmp = M[k];
5248
+ M[k] = M[maxRow], M[maxRow] = tmp;
5249
+ }
5250
+ if (Math.abs(M[k][k]) < 1e-12) return new Array(n).fill(0);
5251
+ for(let j = k + 1; j <= n; j++)M[k][j] = M[k][j] / M[k][k];
5252
+ M[k][k] = 1;
5253
+ for(let i = 0; i < n; i++){
5254
+ if (i === k) continue;
5255
+ const factor = M[i][k];
5256
+ if (0 !== factor) {
5257
+ for(let j = k + 1; j <= n; j++)M[i][j] -= factor * M[k][j];
5258
+ M[i][k] = 0;
5259
+ }
5260
+ }
5261
+ }
5262
+ const x = new Array(n);
5263
+ for(let i = 0; i < n; i++)x[i] = M[i][n];
5264
+ return x;
5265
+ }
5266
+ function regressionPolynomial(data, x = (d)=>d.x, y = (d)=>d.y, options = {}) {
5267
+ var _a;
5268
+ let degree = null != (_a = options.degree) ? _a : 0;
5269
+ degree < 0 && (degree = 0);
5270
+ const m = degree + 1, sums = new Array(2 * degree + 1).fill(0);
5271
+ visitPoints(data, x, y, (dx, dy)=>{
5272
+ let xp = 1;
5273
+ for(let k = 0; k < sums.length; k++)sums[k] += xp, xp *= dx;
5274
+ });
5275
+ const A = new Array(m);
5276
+ for(let i = 0; i < m; i++){
5277
+ A[i] = new Array(m).fill(0);
5278
+ for(let j = 0; j < m; j++)A[i][j] = sums[i + j];
5279
+ }
5280
+ const B = new Array(m).fill(0);
5281
+ visitPoints(data, x, y, (dx, dy)=>{
5282
+ let xp = 1;
5283
+ for(let k = 0; k < m; k++)B[k] += dy * xp, xp *= dx;
5284
+ });
5285
+ const coef = solveLinearSystem(A, B), predict = (xx)=>{
5286
+ let xp = 1, v = 0;
5287
+ for(let k = 0; k < coef.length; k++)v += coef[k] * xp, xp *= xx;
5288
+ return v;
5289
+ };
5290
+ return {
5291
+ degree: degree,
5292
+ coef: coef,
5293
+ predict: predict,
5294
+ rSquared: rSquared(data, x, y, (()=>{
5295
+ let sum = 0, cnt = 0;
5296
+ return visitPoints(data, x, y, (_dx, dy)=>{
5297
+ sum += dy, cnt++;
5298
+ }), 0 === cnt ? 0 : sum / cnt;
5299
+ })(), predict),
5300
+ evaluateGrid (N) {
5301
+ const out = [];
5302
+ if (N <= 0) return out;
5303
+ let min = 1 / 0, max = -1 / 0;
5304
+ if (visitPoints(data, x, y, (dx)=>{
5305
+ common_isNil(dx) || (dx < min && (min = dx), dx > max && (max = dx));
5306
+ }), min === 1 / 0 || max === -1 / 0) return out;
5307
+ if (min === max) {
5308
+ const v = predict(min);
5309
+ for(let i = 0; i < N; i++)out.push({
5310
+ x: min,
5311
+ y: v
5312
+ });
5313
+ return out;
5314
+ }
5315
+ const step = (max - min) / (N - 1);
5316
+ for(let i = 0; i < N; i++){
5317
+ const px = i === N - 1 ? max : min + step * i;
5318
+ out.push({
5319
+ x: px,
5320
+ y: predict(px)
5321
+ });
5322
+ }
5323
+ return out;
5324
+ },
5325
+ confidenceInterval (N = 50, alpha = .05) {
5326
+ const out = [];
5327
+ if (N <= 0) return out;
5328
+ const comps = computeLinearCIComponents(data, x, y, predict);
5329
+ if (0 === comps.n) return out;
5330
+ const z = Math.abs(invNorm(1 - alpha / 2));
5331
+ if (comps.min === comps.max) {
5332
+ const v = predict(comps.min), errs = stdErrorsAt(comps.min, comps);
5333
+ for(let i = 0; i < N; i++)out.push({
5334
+ x: comps.min,
5335
+ mean: v,
5336
+ lower: v - z * errs.seMean,
5337
+ upper: v + z * errs.seMean,
5338
+ predLower: v - z * errs.sePred,
5339
+ predUpper: v + z * errs.sePred
5340
+ });
5341
+ return out;
5342
+ }
5343
+ const step = (comps.max - comps.min) / (N - 1);
5344
+ for(let i = 0; i < N; i++){
5345
+ const px = i === N - 1 ? comps.max : comps.min + step * i, yh = predict(px), errs = stdErrorsAt(px, comps);
5346
+ out.push({
5347
+ x: px,
5348
+ mean: yh,
5349
+ lower: yh - z * errs.seMean,
5350
+ upper: yh + z * errs.seMean,
5351
+ predLower: yh - z * errs.sePred,
5352
+ predUpper: yh + z * errs.sePred
5353
+ });
5354
+ }
5355
+ return out;
5356
+ }
5357
+ };
5358
+ }
5359
+ const defaultRegressionLineColor = (datum, ctx, opt)=>{
5360
+ const parentNode = opt.mark?._product?.parent;
5361
+ if (parentNode?.attribute?.data) return parentNode.attribute.data.color;
5362
+ };
5363
+ const defaultRegressionLineLabelX = (datum, ctx, opt)=>{
5364
+ const parentNode = opt.mark?._product?.parent;
5365
+ if (parentNode?.attribute?.data?.linePoints) {
5366
+ const points = parentNode.attribute.data.linePoints;
5367
+ return points[points.length - 1]?.x;
5368
+ }
5369
+ };
5370
+ const defaultRegressionLineLabelY = (datum, ctx, opt)=>{
5371
+ const parentNode = opt.mark?._product?.parent;
5372
+ if (parentNode?.attribute?.data?.linePoints) {
5373
+ const points = parentNode.attribute.data.linePoints;
5374
+ return points[points.length - 1]?.y;
5375
+ }
5376
+ };
5377
+ const columnPolynomialRegressionLine = (spec, context)=>{
5378
+ const result = {
5379
+ ...spec
5380
+ };
5381
+ const { advancedVSeed } = context;
5382
+ const { chartType, regressionLine } = advancedVSeed;
5383
+ const lineTheme = advancedVSeed.config[chartType]?.regressionLine;
5384
+ if (!regressionLine || !regressionLine.polynomialRegressionLine) return result;
5385
+ const lineList = array_array(regressionLine.polynomialRegressionLine);
5386
+ if (!result.customMark) result.customMark = [];
5387
+ lineList.forEach((line, lineIndex)=>{
5388
+ const theme = lineTheme.linearRegressionLine ?? {};
5389
+ const { color, lineWidth, lineDash, text, textColor, textFontSize, textFontWeight, confidenceIntervalOpacity, confidenceIntervalVisible = theme.confidenceIntervalVisible } = line;
5390
+ const childrenMarks = [];
5391
+ result.customMark.push({
5392
+ type: 'group',
5393
+ interactive: false,
5394
+ zIndex: 500,
5395
+ name: `polynomialRegressionLine-${lineIndex}`,
5396
+ style: {
5397
+ data: (datum, ctx)=>{
5398
+ const vchart = ctx.vchart;
5399
+ const chart = vchart.getChart();
5400
+ const s = chart.getAllSeries()[0];
5401
+ if (s) {
5402
+ const rect = s.getRegion().getLayoutRect();
5403
+ if (0 === rect.width || 0 === rect.height) return null;
5404
+ const start = s.getRegion().getLayoutStartPoint();
5405
+ const yClamper = clamper(start.y, start.y + rect.height);
5406
+ const data = s.getViewData()?.latestData;
5407
+ const fieldX = s.fieldX?.[0];
5408
+ const fieldY = s.fieldY?.[0];
5409
+ const xValues = s.getRawDataStatisticsByField(fieldX).values;
5410
+ if (!fieldX || !fieldY || !data || data.length <= 2 || xValues.length <= 2) return null;
5411
+ const { confidenceInterval, evaluateGrid } = regressionPolynomial(xValues.map((xVal, index)=>{
5412
+ const filteredData = data.filter((d)=>d[fieldX] === xVal);
5413
+ return {
5414
+ x: index,
5415
+ y: Math.max(...filteredData.map((d)=>d[fieldY]))
5416
+ };
5417
+ }), void 0, void 0, {
5418
+ degree: line.degree ?? 2
5419
+ });
5420
+ const N = xValues.length;
5421
+ const xAxisHelper = s.getXAxisHelper();
5422
+ const halfBandWidth = xAxisHelper ? xAxisHelper.getBandwidth(0) / 2 : 0;
5423
+ const lineData = evaluateGrid(N);
5424
+ const linePoints = lineData.map((datum, index)=>{
5425
+ const d = {
5426
+ [fieldX]: xValues[index],
5427
+ [fieldY]: datum.y
5428
+ };
5429
+ return {
5430
+ x: s.dataToPositionX(d) + start.x + halfBandWidth,
5431
+ y: yClamper(s.dataToPositionY(d) + start.y)
5432
+ };
5433
+ });
5434
+ const result = {
5435
+ linePoints,
5436
+ color: s.getOption().globalScale.getScale('color')?.scale(s.getSeriesKeys()[0])
5437
+ };
5438
+ if (confidenceIntervalVisible) {
5439
+ const intervalData = confidenceInterval(N);
5440
+ result.areaPoints = intervalData.map((datum, index)=>{
5441
+ const d = {
5442
+ [fieldX]: xValues[index],
5443
+ [fieldY]: datum.lower
5444
+ };
5445
+ return {
5446
+ x: s.dataToPositionX(d) + start.x + halfBandWidth,
5447
+ y: yClamper(s.dataToPositionY(d) + start.y),
5448
+ y1: yClamper(s.dataToPositionY({
5449
+ [fieldY]: datum.upper
5450
+ }) + start.y)
5451
+ };
5452
+ });
5453
+ }
5454
+ return result;
5455
+ }
5456
+ return null;
5457
+ }
5458
+ },
5459
+ children: childrenMarks
5460
+ });
5461
+ if (confidenceIntervalVisible) childrenMarks.push({
5462
+ type: 'area',
5463
+ interactive: false,
5464
+ zIndex: 500,
5465
+ style: {
5466
+ lineWidth: lineWidth ?? theme.lineWidth,
5467
+ lineDash: lineDash ?? theme.lineDash,
5468
+ fillOpacity: confidenceIntervalOpacity ?? theme.confidenceIntervalOpacity,
5469
+ fill: color ?? defaultRegressionLineColor,
5470
+ points: (datum, ctx, opt)=>{
5471
+ const parentNode = opt.mark?._product?.parent;
5472
+ if (parentNode?.attribute?.data) return parentNode.attribute.data.areaPoints;
5473
+ return [];
5474
+ }
5475
+ }
5476
+ });
5477
+ childrenMarks.push({
5478
+ type: 'line',
5479
+ interactive: false,
5480
+ zIndex: 500,
5481
+ style: {
5482
+ lineWidth: lineWidth ?? theme.lineWidth,
5483
+ lineDash: lineDash ?? theme.lineDash,
5484
+ stroke: color ?? defaultRegressionLineColor,
5485
+ points: (datum, ctx, opt)=>{
5486
+ const parentNode = opt.mark?._product?.parent;
5487
+ if (parentNode?.attribute?.data) return parentNode.attribute.data.linePoints;
5488
+ return [];
5489
+ }
5490
+ }
5491
+ });
5492
+ if (!chunk_JK3VNB42_n(text)) childrenMarks.push({
5493
+ type: 'text',
5494
+ interactive: false,
5495
+ zIndex: 500,
5496
+ style: {
5497
+ textAlign: 'end',
5498
+ fill: textColor ?? theme.textColor,
5499
+ fontSize: textFontSize ?? theme.textFontSize,
5500
+ fontWeight: textFontWeight ?? theme.textFontWeight,
5501
+ text: text,
5502
+ x: (datum, ctx, opt)=>{
5503
+ const parentNode = opt.mark?._product?.parent;
5504
+ if (parentNode?.attribute?.data?.linePoints) {
5505
+ const points = parentNode.attribute.data.linePoints;
5506
+ return points[points.length - 1]?.x;
5507
+ }
5508
+ },
5509
+ y: (datum, ctx, opt)=>{
5510
+ const parentNode = opt.mark?._product?.parent;
5511
+ if (parentNode?.attribute?.data?.linePoints) {
5512
+ const points = parentNode.attribute.data.linePoints;
5513
+ return points[points.length - 1]?.y;
5514
+ }
5515
+ }
5516
+ }
5517
+ });
5518
+ });
5519
+ return result;
5520
+ };
5034
5521
  const column = [
5035
5522
  initColumn,
5036
5523
  stackCornerRadius_stackCornerRadius,
@@ -5050,7 +5537,8 @@
5050
5537
  annotationPoint_annotationPoint,
5051
5538
  annotationVerticalLine_annotationVerticalLine,
5052
5539
  annotationHorizontalLine_annotationHorizontalLine,
5053
- annotationAreaBand
5540
+ annotationAreaBand,
5541
+ columnPolynomialRegressionLine
5054
5542
  ];
5055
5543
  const pivotColumn = [
5056
5544
  initPivot,
@@ -5074,7 +5562,8 @@
5074
5562
  annotationPoint_annotationPoint,
5075
5563
  annotationVerticalLine_annotationVerticalLine,
5076
5564
  annotationHorizontalLine_annotationHorizontalLine,
5077
- annotationAreaBand
5565
+ annotationAreaBand,
5566
+ columnPolynomialRegressionLine
5078
5567
  ]),
5079
5568
  pivotRowDimensions,
5080
5569
  pivotColumnDimensions,
@@ -5109,8 +5598,8 @@
5109
5598
  };
5110
5599
  return result;
5111
5600
  };
5112
- const areaConfig = lineConfig;
5113
- const areaPercentConfig = lineConfig;
5601
+ const areaConfig = line_lineConfig;
5602
+ const areaPercentConfig = line_lineConfig;
5114
5603
  const barConfig = columnConfig;
5115
5604
  const barParallelConfig = columnConfig;
5116
5605
  const barPercentConfig = columnConfig;
@@ -6645,7 +7134,8 @@
6645
7134
  scatterConfig,
6646
7135
  theme_theme,
6647
7136
  markStyle_markStyle,
6648
- annotation_annotation
7137
+ annotation_annotation,
7138
+ regressionLine_regressionLine
6649
7139
  ];
6650
7140
  const initScatter = (spec, context)=>{
6651
7141
  const result = {
@@ -6846,6 +7336,390 @@
6846
7336
  };
6847
7337
  return result;
6848
7338
  };
7339
+ function tricube(u) {
7340
+ const uu = Math.abs(u);
7341
+ if (uu >= 1) return 0;
7342
+ const t = 1 - uu * uu * uu;
7343
+ return t * t * t;
7344
+ }
7345
+ function regressionLowess(data, x = (d)=>d.x, y = (d)=>d.y, options = {}) {
7346
+ const span = options.span || .3, degree = 0 === options.degree ? 0 : 1, iterations = null == options.iterations ? 2 : options.iterations, ptsX = [], ptsY = [];
7347
+ visitPoints(data, x, y, (dx, dy)=>{
7348
+ ptsX.push(dx), ptsY.push(dy);
7349
+ });
7350
+ const n = ptsX.length;
7351
+ function predictSingle(x0, robustWeights) {
7352
+ if (0 === n) return 0;
7353
+ const dists = [];
7354
+ for(let i = 0; i < n; i++)dists.push({
7355
+ idx: i,
7356
+ dist: Math.abs(ptsX[i] - x0)
7357
+ });
7358
+ dists.sort((a, b)=>a.dist - b.dist);
7359
+ const m = Math.max(2, Math.min(n, Math.floor(span * n))), maxDist = dists[m - 1].dist || 0, w = new Array(m);
7360
+ let sumw = 0;
7361
+ for(let i = 0; i < m; i++){
7362
+ const idx = dists[i].idx;
7363
+ let wi = tricube(0 === maxDist ? 0 : dists[i].dist / maxDist);
7364
+ robustWeights && null != robustWeights[idx] && (wi *= robustWeights[idx]), w[i] = wi, sumw += wi;
7365
+ }
7366
+ if (0 === sumw) return ptsY[dists[0].idx];
7367
+ if (0 === degree) {
7368
+ let s = 0;
7369
+ for(let i = 0; i < m; i++)s += w[i] * ptsY[dists[i].idx];
7370
+ return s / sumw;
7371
+ }
7372
+ let sw = 0, sx = 0, sy = 0, sxx = 0, sxy = 0;
7373
+ for(let i = 0; i < m; i++){
7374
+ const idx = dists[i].idx, xi = ptsX[idx], yi = ptsY[idx], wi = w[i];
7375
+ sw += wi, sx += wi * xi, sy += wi * yi, sxx += wi * xi * xi, sxy += wi * xi * yi;
7376
+ }
7377
+ const meanX = sx / sw, meanY = sy / sw, denom = sxx - sx * meanX, slope = Math.abs(denom) < 1e-12 ? 0 : (sxy - sx * meanY) / denom;
7378
+ return meanY - slope * meanX + slope * x0;
7379
+ }
7380
+ function predict(x0) {
7381
+ if (Array.isArray(x0)) {
7382
+ const out = [];
7383
+ for(let i = 0; i < x0.length; i++)out.push(predictSingle(x0[i]));
7384
+ return out;
7385
+ }
7386
+ return predictSingle(x0);
7387
+ }
7388
+ return {
7389
+ predict: predict,
7390
+ evaluate: predict,
7391
+ evaluateGrid: function(N) {
7392
+ const out = [];
7393
+ if (N <= 0) return out;
7394
+ if (0 === n) return out;
7395
+ let min = 1 / 0, max = -1 / 0;
7396
+ for(let i = 0; i < n; i++)ptsX[i] < min && (min = ptsX[i]), ptsX[i] > max && (max = ptsX[i]);
7397
+ if (min === max) {
7398
+ const v = predictSingle(min);
7399
+ for(let i = 0; i < N; i++)out.push({
7400
+ x: min,
7401
+ y: v
7402
+ });
7403
+ return out;
7404
+ }
7405
+ const step = (max - min) / (N - 1);
7406
+ let robustWeights;
7407
+ for(let iter = 0; iter < iterations; iter++){
7408
+ const fits = [];
7409
+ for(let i = 0; i < n; i++)fits.push(predictSingle(ptsX[i], robustWeights));
7410
+ const res = [];
7411
+ for(let i = 0; i < n; i++)res.push(Math.abs(ptsY[i] - fits[i]));
7412
+ const med = res.slice().sort((a, b)=>a - b)[Math.floor(n / 2)] || 0;
7413
+ robustWeights = new Array(n);
7414
+ for(let i = 0; i < n; i++){
7415
+ const u = 0 === med ? 0 : res[i] / (6 * med), w = Math.abs(u) >= 1 ? 0 : (1 - u * u) * (1 - u * u);
7416
+ robustWeights[i] = w;
7417
+ }
7418
+ }
7419
+ for(let i = 0; i < N; i++){
7420
+ const px = i === N - 1 ? max : min + step * i;
7421
+ out.push({
7422
+ x: px,
7423
+ y: predictSingle(px, robustWeights)
7424
+ });
7425
+ }
7426
+ return out;
7427
+ },
7428
+ confidenceInterval: function(N = 50, alpha = .05) {
7429
+ const out = [];
7430
+ if (N <= 0) return out;
7431
+ if (0 === n) return out;
7432
+ let min = 1 / 0, max = -1 / 0;
7433
+ for(let i = 0; i < n; i++)ptsX[i] < min && (min = ptsX[i]), ptsX[i] > max && (max = ptsX[i]);
7434
+ if (min === 1 / 0 || max === -1 / 0) return out;
7435
+ const comps = computeLinearCIComponents(data, x, y, (xx)=>predictSingle(xx));
7436
+ if (0 === comps.n) return out;
7437
+ const z = Math.abs(invNorm(1 - alpha / 2));
7438
+ if (comps.min === comps.max) {
7439
+ const v = predictSingle(comps.min), errs = stdErrorsAt(comps.min, comps);
7440
+ for(let i = 0; i < N; i++)out.push({
7441
+ x: comps.min,
7442
+ mean: v,
7443
+ lower: v - z * errs.seMean,
7444
+ upper: v + z * errs.seMean,
7445
+ predLower: v - z * errs.sePred,
7446
+ predUpper: v + z * errs.sePred
7447
+ });
7448
+ return out;
7449
+ }
7450
+ const step = (max - min) / (N - 1);
7451
+ for(let i = 0; i < N; i++){
7452
+ const px = i === N - 1 ? max : min + step * i, yh = predictSingle(px), errs = stdErrorsAt(px, comps);
7453
+ out.push({
7454
+ x: px,
7455
+ mean: yh,
7456
+ lower: yh - z * errs.seMean,
7457
+ upper: yh + z * errs.seMean,
7458
+ predLower: yh - z * errs.sePred,
7459
+ predUpper: yh + z * errs.sePred
7460
+ });
7461
+ }
7462
+ return out;
7463
+ }
7464
+ };
7465
+ }
7466
+ function regressionLogistic(data, x = (d)=>d.x, y = (d)=>d.y, options) {
7467
+ var _a, _b;
7468
+ const maxIter = null != (_a = null == options ? void 0 : options.maxIteration) ? _a : 25, tol = null != (_b = null == options ? void 0 : options.tol) ? _b : 1e-6, xs = [], ys = [];
7469
+ visitPoints(data, x, y, (dx, dy)=>{
7470
+ xs.push(dx), ys.push(dy ? 1 : 0);
7471
+ });
7472
+ const n = xs.length;
7473
+ if (0 === n) return {
7474
+ coef: [
7475
+ 0,
7476
+ 0
7477
+ ],
7478
+ predict: (_x)=>0,
7479
+ evaluateGrid: (N)=>[],
7480
+ confidenceInterval: (N = 50)=>[]
7481
+ };
7482
+ let intercept = 0, beta = 0;
7483
+ for(let iter = 0; iter < maxIter; iter++){
7484
+ const p = new Array(n);
7485
+ let converged = !0;
7486
+ for(let i = 0; i < n; i++){
7487
+ const z = intercept + beta * xs[i], pi = 1 / (1 + Math.exp(-z));
7488
+ p[i] = pi;
7489
+ }
7490
+ let g0 = 0, g1 = 0, h00 = 0, h01 = 0, h11 = 0;
7491
+ for(let i = 0; i < n; i++){
7492
+ const wi = p[i] * (1 - p[i]), diff = ys[i] - p[i];
7493
+ g0 += diff, g1 += diff * xs[i], h00 += wi, h01 += wi * xs[i], h11 += wi * xs[i] * xs[i];
7494
+ }
7495
+ const det = h00 * h11 - h01 * h01;
7496
+ if (Math.abs(det) < 1e-12) break;
7497
+ const delta0 = (h11 * g0 - h01 * g1) / det, delta1 = (-h01 * g0 + h00 * g1) / det;
7498
+ if (intercept += delta0, beta += delta1, (Math.abs(delta0) > tol || Math.abs(delta1) > tol) && (converged = !1), converged) break;
7499
+ }
7500
+ const predict = (xx)=>{
7501
+ const z = intercept + beta * xx;
7502
+ return 1 / (1 + Math.exp(-z));
7503
+ };
7504
+ return {
7505
+ coef: [
7506
+ intercept,
7507
+ beta
7508
+ ],
7509
+ predict: predict,
7510
+ evaluateGrid: function(N) {
7511
+ const out = [];
7512
+ if (N <= 0) return out;
7513
+ let min = 1 / 0, max = -1 / 0;
7514
+ if (visitPoints(data, x, y, (dx)=>{
7515
+ dx < min && (min = dx), dx > max && (max = dx);
7516
+ }), min === 1 / 0 || max === -1 / 0) return out;
7517
+ if (min === max) {
7518
+ const v = predict(min);
7519
+ for(let i = 0; i < N; i++)out.push({
7520
+ x: min,
7521
+ y: v
7522
+ });
7523
+ return out;
7524
+ }
7525
+ const step = (max - min) / (N - 1);
7526
+ for(let i = 0; i < N; i++){
7527
+ const px = i === N - 1 ? max : min + step * i;
7528
+ out.push({
7529
+ x: px,
7530
+ y: predict(px)
7531
+ });
7532
+ }
7533
+ return out;
7534
+ },
7535
+ confidenceInterval: function(N = 50, alpha = .05) {
7536
+ const out = [];
7537
+ if (N <= 0) return out;
7538
+ const comps = computeLinearCIComponents(data, x, y, predict);
7539
+ if (0 === comps.n) return out;
7540
+ const z = Math.abs(invNorm(1 - alpha / 2));
7541
+ if (comps.min === comps.max) {
7542
+ const v = predict(comps.min), errs = stdErrorsAt(comps.min, comps);
7543
+ for(let i = 0; i < N; i++)out.push({
7544
+ x: comps.min,
7545
+ mean: v,
7546
+ lower: v - z * errs.seMean,
7547
+ upper: v + z * errs.seMean,
7548
+ predLower: v - z * errs.sePred,
7549
+ predUpper: v + z * errs.sePred
7550
+ });
7551
+ return out;
7552
+ }
7553
+ const step = (comps.max - comps.min) / (N - 1);
7554
+ for(let i = 0; i < N; i++){
7555
+ const px = i === N - 1 ? comps.max : comps.min + step * i, yh = predict(px), errs = stdErrorsAt(px, comps);
7556
+ out.push({
7557
+ x: px,
7558
+ mean: yh,
7559
+ lower: yh - z * errs.seMean,
7560
+ upper: yh + z * errs.seMean,
7561
+ predLower: yh - z * errs.sePred,
7562
+ predUpper: yh + z * errs.sePred
7563
+ });
7564
+ }
7565
+ return out;
7566
+ }
7567
+ };
7568
+ }
7569
+ const generateRegressionLinePipe = (type, regressionFunction, getOptions)=>(spec, context)=>{
7570
+ const result = {
7571
+ ...spec
7572
+ };
7573
+ const { advancedVSeed } = context;
7574
+ const { chartType, regressionLine } = advancedVSeed;
7575
+ const lineTheme = advancedVSeed.config[chartType]?.regressionLine;
7576
+ if (!regressionLine || !regressionLine[type]) return result;
7577
+ const lineList = array_array(regressionLine[type]);
7578
+ if (!result.customMark) result.customMark = [];
7579
+ lineList.forEach((line, lineIndex)=>{
7580
+ const theme = lineTheme.linearRegressionLine ?? {};
7581
+ const { color, lineWidth, lineDash, text, textColor, textFontSize, textFontWeight, confidenceIntervalOpacity, confidenceIntervalVisible = theme.confidenceIntervalVisible } = line;
7582
+ const childrenMarks = [];
7583
+ result.customMark.push({
7584
+ type: 'group',
7585
+ interactive: false,
7586
+ zIndex: 500,
7587
+ name: `${type}-${lineIndex}`,
7588
+ style: {
7589
+ data: (datum, ctx)=>{
7590
+ const vchart = ctx.vchart;
7591
+ const chart = vchart.getChart();
7592
+ const s = chart.getAllSeries()[0];
7593
+ if (s) {
7594
+ const rect = s.getRegion().getLayoutRect();
7595
+ const segments = [];
7596
+ if (0 === rect.width || 0 === rect.height) return segments;
7597
+ const start = s.getRegion().getLayoutStartPoint();
7598
+ const yClamper = clamper(start.y, start.y + rect.height);
7599
+ const colorAttrOptions = s.getColorAttribute();
7600
+ const groups = s.getSeriesKeys();
7601
+ const data = s.getViewData()?.latestData;
7602
+ const fieldX = s.fieldX?.[0];
7603
+ const fieldY = s.fieldY?.[0];
7604
+ if (!groups.length) groups.push(void 0);
7605
+ groups.forEach((group)=>{
7606
+ const groupData = data.filter((d)=>d[colorAttrOptions?.field] === group);
7607
+ if (!groupData.length) return;
7608
+ const { confidenceInterval, evaluateGrid } = regressionFunction(groupData, (datum)=>datum?.[fieldX], (datum)=>datum?.[fieldY], getOptions?.(line));
7609
+ const N = Math.max(3, Math.floor(groupData.length / 4));
7610
+ const mainColor = color ?? colorAttrOptions?.scale?.scale(group);
7611
+ const lineData = evaluateGrid(N);
7612
+ const linePoints = lineData.map((ld)=>{
7613
+ const d = {
7614
+ [fieldX]: ld.x,
7615
+ [fieldY]: ld.y
7616
+ };
7617
+ return {
7618
+ x: s.dataToPositionX(d) + start.x,
7619
+ y: yClamper(s.dataToPositionY(d) + start.y)
7620
+ };
7621
+ });
7622
+ segments.push({
7623
+ color: mainColor,
7624
+ linePoints
7625
+ });
7626
+ if (confidenceIntervalVisible) {
7627
+ const intervalData = confidenceInterval(N);
7628
+ const areaPoints = intervalData.map((datum)=>{
7629
+ const d = {
7630
+ [fieldX]: datum.x,
7631
+ [fieldY]: datum.lower
7632
+ };
7633
+ return {
7634
+ x: s.dataToPositionX(d) + start.x,
7635
+ y: yClamper(s.dataToPositionY(d) + start.y),
7636
+ y1: yClamper(s.dataToPositionY({
7637
+ [fieldY]: datum.upper
7638
+ }) + start.y)
7639
+ };
7640
+ });
7641
+ segments[segments.length - 1].areaPoints = areaPoints;
7642
+ }
7643
+ });
7644
+ return segments;
7645
+ }
7646
+ return [];
7647
+ }
7648
+ },
7649
+ children: childrenMarks
7650
+ });
7651
+ if (confidenceIntervalVisible) childrenMarks.push({
7652
+ type: 'area',
7653
+ interactive: false,
7654
+ zIndex: 500,
7655
+ style: {
7656
+ lineWidth: lineWidth ?? theme.lineWidth,
7657
+ lineDash: lineDash ?? theme.lineDash,
7658
+ fillOpacity: confidenceIntervalOpacity ?? theme.confidenceIntervalOpacity,
7659
+ fill: 'red',
7660
+ segments: (datum, ctx, opt)=>{
7661
+ const parentNode = opt.mark?._product?.parent;
7662
+ if (parentNode?.attribute?.data?.length) return parentNode.attribute.data.map((d)=>({
7663
+ points: d.areaPoints ?? [],
7664
+ fill: d.color
7665
+ }));
7666
+ return [];
7667
+ }
7668
+ }
7669
+ });
7670
+ childrenMarks.push({
7671
+ type: 'line',
7672
+ interactive: false,
7673
+ zIndex: 500,
7674
+ style: {
7675
+ lineWidth: lineWidth ?? theme.lineWidth,
7676
+ lineDash: lineDash ?? theme.lineDash,
7677
+ stroke: 'red',
7678
+ segments: (datum, ctx, opt)=>{
7679
+ const parentNode = opt.mark?._product?.parent;
7680
+ if (parentNode?.attribute?.data?.length) return parentNode.attribute.data.map((d)=>({
7681
+ points: d.linePoints,
7682
+ stroke: d.color
7683
+ }));
7684
+ return [];
7685
+ }
7686
+ }
7687
+ });
7688
+ if (!chunk_JK3VNB42_n(text)) childrenMarks.push({
7689
+ type: 'text',
7690
+ interactive: false,
7691
+ zIndex: 500,
7692
+ style: {
7693
+ textAlign: 'end',
7694
+ fill: textColor ?? theme.textColor,
7695
+ fontSize: textFontSize ?? theme.textFontSize,
7696
+ fontWeight: textFontWeight ?? theme.textFontWeight,
7697
+ text: text,
7698
+ x: (datum, ctx, opt)=>{
7699
+ const parentNode = opt.mark?._product?.parent;
7700
+ if (parentNode?.attribute?.data?.length) {
7701
+ const point = parentNode.attribute.data[parentNode.attribute.data.length - 1].linePoints;
7702
+ return point[point.length - 1]?.x;
7703
+ }
7704
+ },
7705
+ y: (datum, ctx, opt)=>{
7706
+ const parentNode = opt.mark?._product?.parent;
7707
+ if (parentNode?.attribute?.data?.length) {
7708
+ const point = parentNode.attribute.data[parentNode.attribute.data.length - 1].linePoints;
7709
+ return point[point.length - 1]?.y;
7710
+ }
7711
+ }
7712
+ }
7713
+ });
7714
+ });
7715
+ return result;
7716
+ };
7717
+ const linearRegressionLine = generateRegressionLinePipe('linearRegressionLine', regressionLinear);
7718
+ const lowessRegressionLine = generateRegressionLinePipe('lowessRegressionLine', regressionLowess);
7719
+ const polynomialRegressionLine = generateRegressionLinePipe('polynomialRegressionLine', regressionPolynomial, (lineConfig)=>({
7720
+ degree: lineConfig.degree ?? 2
7721
+ }));
7722
+ const logisticRegressionLine = generateRegressionLinePipe('logisticRegressionLine', regressionLogistic);
6849
7723
  const scatter = [
6850
7724
  initScatter,
6851
7725
  colorAdapter(color_color, linearColor),
@@ -6865,7 +7739,11 @@
6865
7739
  annotationPoint_annotationPoint,
6866
7740
  annotationVerticalLine_annotationVerticalLine,
6867
7741
  annotationHorizontalLine_annotationHorizontalLine,
6868
- annotationArea_annotationArea
7742
+ annotationArea_annotationArea,
7743
+ linearRegressionLine,
7744
+ lowessRegressionLine,
7745
+ polynomialRegressionLine,
7746
+ logisticRegressionLine
6869
7747
  ];
6870
7748
  const pivotScatter = [
6871
7749
  initPivot,
@@ -6890,7 +7768,9 @@
6890
7768
  annotationPoint_annotationPoint,
6891
7769
  annotationVerticalLine_annotationVerticalLine,
6892
7770
  annotationHorizontalLine_annotationHorizontalLine,
6893
- annotationArea_annotationArea
7771
+ annotationArea_annotationArea,
7772
+ linearRegressionLine,
7773
+ lowessRegressionLine
6894
7774
  ]),
6895
7775
  pivotRowDimensions,
6896
7776
  pivotColumnDimensions,
@@ -9432,12 +10312,6 @@
9432
10312
  ...tooltip
9433
10313
  ]);
9434
10314
  };
9435
- const isType_isType = (value, type)=>Object.prototype.toString.call(value) === `[object ${type}]`;
9436
- const isType = isType_isType;
9437
- const isArray = (value)=>Array.isArray ? Array.isArray(value) : isType(value, "Array");
9438
- const common_isArray = isArray;
9439
- const isNil = (value)=>null == value;
9440
- const common_isNil = isNil;
9441
10315
  const clamp_clamp = function(input, min, max) {
9442
10316
  return input < min ? min : input > max ? max : input;
9443
10317
  };
@@ -9669,7 +10543,6 @@
9669
10543
  datasets.push(newDatasets);
9670
10544
  datasetReshapeInfo.push(reshapeInfo);
9671
10545
  });
9672
- console.log(datasets);
9673
10546
  return {
9674
10547
  ...result,
9675
10548
  dataset: datasets,
@@ -10259,11 +11132,6 @@
10259
11132
  datasetReshapeInfo: datasetReshapeInfo
10260
11133
  };
10261
11134
  };
10262
- const regressionLine = (advancedVSeed, context)=>{
10263
- const { vseed } = context;
10264
- if ('histogramRegressionLine' in vseed && 'histogram' === vseed.chartType) advancedVSeed.histogramRegressionLine = vseed.histogramRegressionLine;
10265
- return advancedVSeed;
10266
- };
10267
11135
  const histogramAdvancedPipeline = [
10268
11136
  initAdvancedVSeed_initAdvancedVSeed,
10269
11137
  default_defaultMeasures_defaultMeasures,
@@ -10292,7 +11160,7 @@
10292
11160
  theme_theme,
10293
11161
  markStyle_markStyle,
10294
11162
  annotation_annotation,
10295
- regressionLine
11163
+ regressionLine_regressionLine
10296
11164
  ];
10297
11165
  const initHistogram = (spec)=>{
10298
11166
  const result = {
@@ -10495,6 +11363,97 @@
10495
11363
  }
10496
11364
  };
10497
11365
  }
11366
+ const kdeRegressionLine = (spec, context)=>{
11367
+ const result = {
11368
+ ...spec
11369
+ };
11370
+ const { advancedVSeed, vseed } = context;
11371
+ const { chartType, encoding = {}, dimensions, regressionLine } = advancedVSeed;
11372
+ const { dataset } = vseed;
11373
+ const lineTheme = advancedVSeed.config[chartType]?.regressionLine;
11374
+ if (!regressionLine || !regressionLine.kdeRegressionLine) return result;
11375
+ const rowColumnFields = T(dimensions.filter((dim)=>'row' === dim.encoding || 'column' === dim.encoding), (item)=>item.id);
11376
+ const lineList = array_array(regressionLine.kdeRegressionLine);
11377
+ if (!result.customMark) result.customMark = [];
11378
+ lineList.forEach((line, lineIndex)=>{
11379
+ const theme = lineTheme.kdeRegressionLine ?? {};
11380
+ const { color, lineWidth, lineDash, text, textColor, textFontSize, textFontWeight } = line;
11381
+ const childrenMarks = [];
11382
+ result.customMark.push({
11383
+ type: 'group',
11384
+ interactive: false,
11385
+ zIndex: 500,
11386
+ name: `kdeRegressionLine-${lineIndex}`,
11387
+ style: {
11388
+ data: (datum, ctx)=>{
11389
+ const vchart = ctx.vchart;
11390
+ const chart = vchart.getChart();
11391
+ const series = chart.getAllSeries().filter((s)=>'bar' === s.type);
11392
+ if (series && series.length) {
11393
+ const s = series[0];
11394
+ const region = s.getRegion().getLayoutStartPoint();
11395
+ const fieldX = s.fieldX?.[0];
11396
+ const scaleY = s.getYAxisHelper().getScale?.(0);
11397
+ const viewData = s.getViewData()?.latestData;
11398
+ if (!dataset || !dataset.length || !viewData || !viewData.length || !scaleY) return null;
11399
+ const simpleData = dataset.filter((entry)=>rowColumnFields.length ? rowColumnFields.every((dim)=>entry[dim.id] === viewData[0][dim.id]) : true).map((d)=>d[encoding.value?.[0]]);
11400
+ const res = kde_kde(simpleData, {
11401
+ bandwidth: Math.abs(viewData[0][BinEndMeasureId] - viewData[0][BinStartMeasureId])
11402
+ });
11403
+ const N = Math.max(3, Math.floor(simpleData.length / 4));
11404
+ const lineData = res.evaluateGrid(N);
11405
+ const scaleR = (k)=>scaleY.scale(k * simpleData.length * res.bandwidth);
11406
+ const linePoints = lineData.map((ld)=>{
11407
+ const d = {
11408
+ [fieldX]: ld.x
11409
+ };
11410
+ return {
11411
+ x: s.dataToPositionX(d) + region.x,
11412
+ y: scaleR(ld.y) + region.y
11413
+ };
11414
+ });
11415
+ return {
11416
+ linePoints,
11417
+ color: color ?? s.getOption().globalScale.getScale('color')?.scale(s.getSeriesKeys()[0])
11418
+ };
11419
+ }
11420
+ return null;
11421
+ }
11422
+ },
11423
+ children: childrenMarks
11424
+ });
11425
+ childrenMarks.push({
11426
+ type: 'line',
11427
+ interactive: false,
11428
+ zIndex: 500,
11429
+ style: {
11430
+ lineWidth: lineWidth ?? theme.lineWidth,
11431
+ lineDash: lineDash ?? theme.lineDash,
11432
+ stroke: color ?? defaultRegressionLineColor,
11433
+ points: (datum, ctx, opt)=>{
11434
+ const parentNode = opt.mark?._product?.parent;
11435
+ if (parentNode?.attribute?.data) return parentNode.attribute.data.linePoints;
11436
+ return [];
11437
+ }
11438
+ }
11439
+ });
11440
+ if (!chunk_JK3VNB42_n(text)) childrenMarks.push({
11441
+ type: 'text',
11442
+ interactive: false,
11443
+ zIndex: 500,
11444
+ style: {
11445
+ textAlign: 'end',
11446
+ fill: textColor ?? theme.textColor,
11447
+ fontSize: textFontSize ?? theme.textFontSize,
11448
+ fontWeight: textFontWeight ?? theme.textFontWeight,
11449
+ text: text,
11450
+ x: defaultRegressionLineLabelX,
11451
+ y: defaultRegressionLineLabelY
11452
+ }
11453
+ });
11454
+ });
11455
+ return result;
11456
+ };
10498
11457
  function ecdf(data) {
10499
11458
  const n = data.length, sorted = data.slice().sort((a, b)=>a - b);
10500
11459
  function evaluateSingle(x) {
@@ -10540,44 +11499,29 @@
10540
11499
  n: n
10541
11500
  };
10542
11501
  }
10543
- const getRegressionByType = (type, data, kdeOptions)=>{
10544
- switch(type){
10545
- case 'kde':
10546
- return kde_kde(data, kdeOptions);
10547
- case 'ecdf':
10548
- return ecdf(data);
10549
- }
10550
- };
10551
- const histogramRegressionLine_histogramRegressionLine = (spec, context)=>{
11502
+ const ecdfRegressionLine = (spec, context)=>{
10552
11503
  const result = {
10553
11504
  ...spec
10554
11505
  };
10555
11506
  const { advancedVSeed, vseed } = context;
10556
- const { chartType, encoding = {}, dimensions, histogramRegressionLine } = advancedVSeed;
11507
+ const { chartType, encoding = {}, dimensions, regressionLine } = advancedVSeed;
10557
11508
  const { dataset } = vseed;
10558
- const theme = advancedVSeed.config[chartType]?.histogramRegressionLine;
10559
- if (!histogramRegressionLine) return result;
11509
+ const lineTheme = advancedVSeed.config[chartType]?.regressionLine;
11510
+ if (!regressionLine || !regressionLine.ecdfRegressionLine) return result;
10560
11511
  const rowColumnFields = T(dimensions.filter((dim)=>'row' === dim.encoding || 'column' === dim.encoding), (item)=>item.id);
10561
- const lineList = Array.isArray(histogramRegressionLine) ? histogramRegressionLine : [
10562
- histogramRegressionLine
10563
- ];
11512
+ const lineList = array_array(regressionLine.ecdfRegressionLine);
10564
11513
  if (!result.customMark) result.customMark = [];
10565
- lineList.forEach((line)=>{
10566
- const { color, type, lineWidth, lineDash, text, textColor, textFontSize, textFontWeight } = line;
11514
+ lineList.forEach((line, lineIndex)=>{
11515
+ const theme = lineTheme?.ecdfRegressionLine ?? {};
11516
+ const { color, lineWidth, lineDash, text, textColor, textFontSize, textFontWeight } = line;
11517
+ const childrenMarks = [];
10567
11518
  result.customMark.push({
10568
- type: 'line',
11519
+ type: 'group',
10569
11520
  interactive: false,
10570
11521
  zIndex: 500,
11522
+ name: `ecdfRegressionLine-${lineIndex}`,
10571
11523
  style: {
10572
- lineWidth: lineWidth ?? theme?.lineWidth,
10573
- lineDash: lineDash ?? theme?.lineDash,
10574
- stroke: color ?? ((datum, ctx)=>{
10575
- const vchart = ctx.vchart;
10576
- const chart = vchart.getChart();
10577
- const series = chart.getAllSeries().filter((s)=>'bar' === s.type);
10578
- return series.length ? series[0].getOption().globalScale.getScale('color')?.scale(series[0].getSeriesKeys()[0]) : void 0;
10579
- }),
10580
- points: (datum, ctx)=>{
11524
+ data: (datum, ctx)=>{
10581
11525
  const vchart = ctx.vchart;
10582
11526
  const chart = vchart.getChart();
10583
11527
  const series = chart.getAllSeries().filter((s)=>'bar' === s.type);
@@ -10587,18 +11531,16 @@
10587
11531
  const fieldX = s.fieldX?.[0];
10588
11532
  const scaleY = s.getYAxisHelper().getScale?.(0);
10589
11533
  const viewData = s.getViewData()?.latestData;
10590
- if (!dataset || !dataset.length || !viewData || !viewData.length || !scaleY) return;
11534
+ if (!dataset || !dataset.length || !viewData || !viewData.length || !scaleY) return null;
10591
11535
  const simpleData = dataset.filter((entry)=>rowColumnFields.length ? rowColumnFields.every((dim)=>entry[dim.id] === viewData[0][dim.id]) : true).map((d)=>d[encoding.value?.[0]]);
10592
- const res = getRegressionByType(type, simpleData, 'kde' === type ? {
10593
- bandwidth: Math.abs(viewData[0][BinEndMeasureId] - viewData[0][BinStartMeasureId])
10594
- } : void 0);
11536
+ const res = ecdf(simpleData);
10595
11537
  const N = Math.max(3, Math.floor(simpleData.length / 4));
10596
11538
  const lineData = res.evaluateGrid(N);
10597
11539
  const yRange = scaleY.range();
10598
11540
  const y0 = yRange[0];
10599
11541
  const y1 = yRange[yRange.length - 1];
10600
- const scaleR = 'kde' === type ? (k)=>scaleY.scale(k * simpleData.length * res.bandwidth) : (e)=>y0 + (y1 - y0) * e;
10601
- return lineData.map((ld)=>{
11542
+ const scaleR = (e)=>y0 + (y1 - y0) * e;
11543
+ const linePoints = lineData.map((ld)=>{
10602
11544
  const d = {
10603
11545
  [fieldX]: ld.x
10604
11546
  };
@@ -10607,54 +11549,43 @@
10607
11549
  y: scaleR(ld.y) + region.y
10608
11550
  };
10609
11551
  });
11552
+ return {
11553
+ linePoints,
11554
+ color: color ?? s.getOption().globalScale.getScale('color')?.scale(s.getSeriesKeys()[0])
11555
+ };
10610
11556
  }
11557
+ return null;
11558
+ }
11559
+ },
11560
+ children: childrenMarks
11561
+ });
11562
+ childrenMarks.push({
11563
+ type: 'line',
11564
+ interactive: false,
11565
+ zIndex: 500,
11566
+ style: {
11567
+ lineWidth: lineWidth ?? theme.lineWidth,
11568
+ lineDash: lineDash ?? theme.lineDash,
11569
+ stroke: color ?? defaultRegressionLineColor,
11570
+ points: (datum, ctx, opt)=>{
11571
+ const parentNode = opt.mark?._product?.parent;
11572
+ if (parentNode?.attribute?.data) return parentNode.attribute.data.linePoints;
10611
11573
  return [];
10612
11574
  }
10613
11575
  }
10614
11576
  });
10615
- if (!chunk_JK3VNB42_n(text)) result.customMark.push({
11577
+ if (!chunk_JK3VNB42_n(text)) childrenMarks.push({
10616
11578
  type: 'text',
10617
11579
  interactive: false,
10618
11580
  zIndex: 500,
10619
11581
  style: {
10620
11582
  textAlign: 'end',
10621
- fill: textColor ?? theme?.textColor,
10622
- fontSize: textFontSize ?? theme?.textFontSize,
10623
- fontWeight: textFontWeight ?? theme?.textFontWeight,
11583
+ fill: textColor ?? theme.textColor,
11584
+ fontSize: textFontSize ?? theme.textFontSize,
11585
+ fontWeight: textFontWeight ?? theme.textFontWeight,
10624
11586
  text: text,
10625
- x: (datum, ctx)=>{
10626
- const vchart = ctx.vchart;
10627
- const chart = vchart.getChart();
10628
- const series = chart.getAllSeries().filter((s)=>'bar' === s.type);
10629
- if (series && series.length) {
10630
- const s = series[0];
10631
- const startPoint = s.getRegion().getLayoutStartPoint();
10632
- const fieldX = s.fieldX[0];
10633
- const fieldX2 = s.fieldX2;
10634
- const scaleY = s.getYAxisHelper().getScale?.(0);
10635
- const viewData = s.getViewData()?.latestData;
10636
- if (!dataset || !dataset.length || !viewData || !viewData.length || !scaleY) return;
10637
- const maxX = Math.max.apply(null, viewData.map((d)=>Math.max(d[fieldX], d[fieldX2])));
10638
- return startPoint.x + s.dataToPositionX({
10639
- [fieldX]: maxX
10640
- });
10641
- }
10642
- },
10643
- y: (datum, ctx)=>{
10644
- const vchart = ctx.vchart;
10645
- const chart = vchart.getChart();
10646
- const series = chart.getAllSeries().filter((s)=>'bar' === s.type);
10647
- if (series && series.length) {
10648
- const s = series[0];
10649
- const startPoint = s.getRegion().getLayoutStartPoint();
10650
- const fieldY = s.fieldY[0];
10651
- const viewData = s.getViewData()?.latestData;
10652
- if (!viewData || !viewData.length) return;
10653
- return 'ecdf' === type ? startPoint.y + 12 : startPoint.y + s.dataToPositionY({
10654
- [fieldY]: viewData[viewData.length - 1]?.[fieldY]
10655
- });
10656
- }
10657
- }
11587
+ x: defaultRegressionLineLabelX,
11588
+ y: defaultRegressionLineLabelY
10658
11589
  }
10659
11590
  });
10660
11591
  });
@@ -10677,7 +11608,8 @@
10677
11608
  annotationVerticalLine_annotationVerticalLine,
10678
11609
  annotationHorizontalLine_annotationHorizontalLine,
10679
11610
  annotationAreaBand,
10680
- histogramRegressionLine_histogramRegressionLine
11611
+ kdeRegressionLine,
11612
+ ecdfRegressionLine
10681
11613
  ];
10682
11614
  const pivotHistogram = [
10683
11615
  initPivot,
@@ -10699,7 +11631,8 @@
10699
11631
  annotationVerticalLine_annotationVerticalLine,
10700
11632
  annotationHorizontalLine_annotationHorizontalLine,
10701
11633
  annotationAreaBand,
10702
- histogramRegressionLine_histogramRegressionLine
11634
+ kdeRegressionLine,
11635
+ ecdfRegressionLine
10703
11636
  ]),
10704
11637
  pivotRowDimensions,
10705
11638
  pivotColumnDimensions,
@@ -11130,18 +12063,70 @@
11130
12063
  const getDarkHeatmapCellTheme = ()=>({
11131
12064
  stroke: '#404349'
11132
12065
  });
11133
- const getDefaultHistogramRegressionLine = ()=>({
12066
+ const getDefaultRegressionLine = ()=>({
11134
12067
  lineWidth: 2,
11135
12068
  textFontSize: 12,
11136
12069
  textFontWeight: 400
11137
12070
  });
11138
- const getLightHistogramRegressionLine = ()=>({
11139
- ...getDefaultHistogramRegressionLine(),
11140
- textColor: '#364159'
12071
+ const getLightRegressionLine = ()=>({
12072
+ kdeRegressionLine: {
12073
+ ...getDefaultRegressionLine(),
12074
+ textColor: '#364159'
12075
+ },
12076
+ ecdfRegressionLine: {
12077
+ ...getDefaultRegressionLine(),
12078
+ textColor: '#364159'
12079
+ },
12080
+ linearRegressionLine: {
12081
+ ...getDefaultRegressionLine(),
12082
+ textColor: '#364159',
12083
+ confidenceIntervalOpacity: 0.2
12084
+ },
12085
+ lowessRegressionLine: {
12086
+ ...getDefaultRegressionLine(),
12087
+ textColor: '#364159',
12088
+ confidenceIntervalOpacity: 0.2
12089
+ },
12090
+ polynomialRegressionLine: {
12091
+ ...getDefaultRegressionLine(),
12092
+ textColor: '#364159',
12093
+ confidenceIntervalOpacity: 0.2
12094
+ },
12095
+ logisticRegressionLine: {
12096
+ ...getDefaultRegressionLine(),
12097
+ textColor: '#364159',
12098
+ confidenceIntervalOpacity: 0.2
12099
+ }
11141
12100
  });
11142
- const getDarkHistogramRegressionLine = ()=>({
11143
- ...getDefaultHistogramRegressionLine(),
11144
- textColor: '#ffffff'
12101
+ const getDarkRegressionLine = ()=>({
12102
+ kdeRegressionLine: {
12103
+ ...getDefaultRegressionLine(),
12104
+ textColor: '#FFFFFF'
12105
+ },
12106
+ ecdfRegressionLine: {
12107
+ ...getDefaultRegressionLine(),
12108
+ textColor: '#FFFFFF'
12109
+ },
12110
+ linearRegressionLine: {
12111
+ ...getDefaultRegressionLine(),
12112
+ textColor: '#FFFFFF',
12113
+ confidenceIntervalOpacity: 0.2
12114
+ },
12115
+ lowessRegressionLine: {
12116
+ ...getDefaultRegressionLine(),
12117
+ textColor: '#FFFFFF',
12118
+ confidenceIntervalOpacity: 0.2
12119
+ },
12120
+ polynomialRegressionLine: {
12121
+ ...getDefaultRegressionLine(),
12122
+ textColor: '#FFFFFF',
12123
+ confidenceIntervalOpacity: 0.2
12124
+ },
12125
+ logisticRegressionLine: {
12126
+ ...getDefaultRegressionLine(),
12127
+ textColor: '#FFFFFF',
12128
+ confidenceIntervalOpacity: 0.2
12129
+ }
11145
12130
  });
11146
12131
  const lightTheme = ()=>{
11147
12132
  const linearAxis = getLightLinearAxis();
@@ -11193,7 +12178,8 @@
11193
12178
  0
11194
12179
  ],
11195
12180
  pivotGrid: getLightPivotChartGridConfig(),
11196
- annotation: getLightAnnotation()
12181
+ annotation: getLightAnnotation(),
12182
+ regressionLine: getLightRegressionLine()
11197
12183
  },
11198
12184
  columnParallel: {
11199
12185
  ...baseConfig,
@@ -11314,7 +12300,8 @@
11314
12300
  showValuePercent: false
11315
12301
  },
11316
12302
  pivotGrid: getLightPivotChartGridConfig(),
11317
- annotation: getLightAnnotation()
12303
+ annotation: getLightAnnotation(),
12304
+ regressionLine: getLightRegressionLine()
11318
12305
  },
11319
12306
  dualAxis: {
11320
12307
  ...baseConfig,
@@ -11397,7 +12384,7 @@
11397
12384
  crosshairRect,
11398
12385
  pivotGrid: getLightPivotChartGridConfig(),
11399
12386
  annotation: getLightAnnotation(),
11400
- histogramRegressionLine: getLightHistogramRegressionLine()
12387
+ regressionLine: getLightRegressionLine()
11401
12388
  },
11402
12389
  boxPlot: {
11403
12390
  ...baseConfig,
@@ -11460,7 +12447,8 @@
11460
12447
  0
11461
12448
  ],
11462
12449
  pivotGrid: getDarkPivotChartGridConfig(),
11463
- annotation: getDarkAnnotation()
12450
+ annotation: getDarkAnnotation(),
12451
+ regressionLine: getDarkRegressionLine()
11464
12452
  },
11465
12453
  columnParallel: {
11466
12454
  ...baseConfig,
@@ -11575,7 +12563,8 @@
11575
12563
  showValuePercent: false
11576
12564
  },
11577
12565
  pivotGrid: getDarkPivotChartGridConfig(),
11578
- annotation: getDarkAnnotation()
12566
+ annotation: getDarkAnnotation(),
12567
+ regressionLine: getDarkRegressionLine()
11579
12568
  },
11580
12569
  dualAxis: {
11581
12570
  ...baseConfig,
@@ -11658,7 +12647,7 @@
11658
12647
  crosshairRect: crosshairRect,
11659
12648
  pivotGrid: getDarkPivotChartGridConfig(),
11660
12649
  annotation: getDarkAnnotation(),
11661
- histogramRegressionLine: getDarkHistogramRegressionLine()
12650
+ regressionLine: getDarkRegressionLine()
11662
12651
  },
11663
12652
  boxPlot: {
11664
12653
  ...baseConfig,
@@ -15753,7 +16742,35 @@
15753
16742
  ]);
15754
16743
  const zBarMaxWidth = schemas_number().or(schemas_string());
15755
16744
  const zBarGapInGroup = schemas_number().or(schemas_string());
15756
- const zColumnConfig = schemas_object({
16745
+ const zEcdfRegressionLine = schemas_object({
16746
+ color: schemas_string().nullish(),
16747
+ lineWidth: schemas_number().nullish(),
16748
+ lineDash: schemas_array(schemas_number()).nullish(),
16749
+ text: schemas_string().nullish(),
16750
+ textColor: schemas_string().nullish(),
16751
+ textFontSize: schemas_number().nullish(),
16752
+ textFontWeight: schemas_number().nullish()
16753
+ });
16754
+ const zKdeRegressionLine = zEcdfRegressionLine.extend({});
16755
+ const zLinearRegressionLine = zEcdfRegressionLine.extend({
16756
+ confidenceIntervalVisible: schemas_boolean().nullish(),
16757
+ confidenceIntervalColor: schemas_string().nullish(),
16758
+ confidenceIntervalOpacity: schemas_number().nullish()
16759
+ });
16760
+ const zLogisticRegressionLine = zLinearRegressionLine.extend({});
16761
+ const zLowessRegressionLine = zLinearRegressionLine.extend({});
16762
+ const zPolynomialRegressionLine = zLinearRegressionLine.extend({
16763
+ degree: schemas_number().nullish()
16764
+ });
16765
+ const zRegressionLine = schemas_object({
16766
+ ecdfRegressionLine: zEcdfRegressionLine.or(schemas_array(zEcdfRegressionLine)).nullish(),
16767
+ kdeRegressionLine: zKdeRegressionLine.or(schemas_array(zKdeRegressionLine)).nullish(),
16768
+ linearRegressionLine: zLinearRegressionLine.or(schemas_array(zLinearRegressionLine)).nullish(),
16769
+ lowessRegressionLine: zLowessRegressionLine.or(schemas_array(zLowessRegressionLine)).nullish(),
16770
+ polynomialRegressionLine: zPolynomialRegressionLine.or(schemas_array(zPolynomialRegressionLine)).nullish(),
16771
+ logisticRegressionLine: zLogisticRegressionLine.or(schemas_array(zLogisticRegressionLine)).nullish()
16772
+ });
16773
+ const zColumnParallelConfig = schemas_object({
15757
16774
  backgroundColor: zBackgroundColor.nullish(),
15758
16775
  label: zLabel.nullish(),
15759
16776
  color: zColor.nullish(),
@@ -15768,8 +16785,10 @@
15768
16785
  pivotGrid: zPivotChartGridConfig.nullish(),
15769
16786
  annotation: zAnnotationConfig.nullish()
15770
16787
  });
15771
- const zColumnParallelConfig = zColumnConfig;
15772
- const zColumnPercentConfig = zColumnConfig;
16788
+ const zColumnConfig = zColumnParallelConfig.extend({
16789
+ regressionLine: zRegressionLine.nullish()
16790
+ });
16791
+ const zColumnPercentConfig = zColumnParallelConfig.extend({});
15773
16792
  const zBarConfig = schemas_object({
15774
16793
  backgroundColor: zBackgroundColor.nullish(),
15775
16794
  label: zLabel.nullish(),
@@ -15810,7 +16829,8 @@
15810
16829
  size: schemas_number().or(schemas_array(schemas_number())).nullish(),
15811
16830
  sizeRange: schemas_number().or(schemas_array(schemas_number())).nullish(),
15812
16831
  pivotGrid: zPivotChartGridConfig.nullish(),
15813
- annotation: zAnnotationConfig.nullish()
16832
+ annotation: zAnnotationConfig.nullish(),
16833
+ regressionLine: zRegressionLine.nullish()
15814
16834
  });
15815
16835
  const zDualAxisConfig = schemas_object({
15816
16836
  backgroundColor: zBackgroundColor.nullish(),
@@ -15896,19 +16916,6 @@
15896
16916
  annotation: zAnnotationConfig.nullish(),
15897
16917
  whiskers: zWhiskersConfig.nullish()
15898
16918
  });
15899
- const zHistogramRegressionLine = schemas_object({
15900
- type: union([
15901
- literal('kde'),
15902
- literal('ecdf')
15903
- ]).nullish(),
15904
- color: schemas_string().nullish(),
15905
- lineWidth: schemas_number().nullish(),
15906
- lineDash: schemas_array(schemas_number()).nullish(),
15907
- text: schemas_string().nullish(),
15908
- textColor: schemas_string().nullish(),
15909
- textFontSize: schemas_number().nullish(),
15910
- textFontWeight: schemas_number().nullish()
15911
- });
15912
16919
  const zHistogramConfig = schemas_object({
15913
16920
  backgroundColor: zBackgroundColor.nullish(),
15914
16921
  label: zLabel.nullish(),
@@ -15924,7 +16931,7 @@
15924
16931
  binCount: schemas_number().positive().nullish(),
15925
16932
  binStep: schemas_number().positive().nullish(),
15926
16933
  binValueType: literal('count').or(literal('percentage')).nullish(),
15927
- histogramRegressionLine: zHistogramRegressionLine.nullish()
16934
+ regressionLine: zRegressionLine.nullish()
15928
16935
  });
15929
16936
  const zConfig = schemas_object({
15930
16937
  table: zTableConfig.nullish(),
@@ -16199,6 +17206,7 @@
16199
17206
  annotationVerticalLine: schemas_array(zAnnotationVerticalLine).or(zAnnotationVerticalLine).nullish(),
16200
17207
  annotationHorizontalLine: schemas_array(zAnnotationHorizontalLine).or(zAnnotationHorizontalLine).nullish(),
16201
17208
  annotationArea: schemas_array(zAnnotationArea).or(zAnnotationArea).nullish(),
17209
+ polynomialRegressionLine: schemas_array(zPolynomialRegressionLine).or(zPolynomialRegressionLine).or(schemas_boolean()).nullish(),
16202
17210
  locale: zLocale.nullish()
16203
17211
  });
16204
17212
  const zColumnParallel = schemas_object({
@@ -16394,6 +17402,10 @@
16394
17402
  annotationVerticalLine: schemas_array(zAnnotationVerticalLine).or(zAnnotationVerticalLine).nullish(),
16395
17403
  annotationHorizontalLine: schemas_array(zAnnotationHorizontalLine).or(zAnnotationHorizontalLine).nullish(),
16396
17404
  annotationArea: schemas_array(zAnnotationArea).or(zAnnotationArea).nullish(),
17405
+ linearRegressionLine: schemas_array(zLinearRegressionLine).or(zLinearRegressionLine).or(schemas_boolean()).nullish(),
17406
+ lowessRegressionLine: schemas_array(zLowessRegressionLine).or(zLowessRegressionLine).or(schemas_boolean()).nullish(),
17407
+ polynomialRegressionLine: schemas_array(zPolynomialRegressionLine).or(zPolynomialRegressionLine).or(schemas_boolean()).nullish(),
17408
+ logisticRegressionLine: schemas_array(zLogisticRegressionLine).or(zLogisticRegressionLine).or(schemas_boolean()).nullish(),
16397
17409
  locale: zLocale.nullish()
16398
17410
  });
16399
17411
  const zDualAxis = schemas_object({
@@ -16451,7 +17463,8 @@
16451
17463
  annotationVerticalLine: schemas_array(zAnnotationVerticalLine).or(zAnnotationVerticalLine).nullish(),
16452
17464
  annotationHorizontalLine: schemas_array(zAnnotationHorizontalLine).or(zAnnotationHorizontalLine).nullish(),
16453
17465
  annotationArea: schemas_array(zAnnotationArea).or(zAnnotationArea).nullish(),
16454
- histogramRegressionLine: schemas_array(zHistogramRegressionLine).or(zHistogramRegressionLine).nullish(),
17466
+ ecdfRegressionLine: schemas_array(zEcdfRegressionLine).or(zEcdfRegressionLine).or(schemas_boolean()).nullish(),
17467
+ kdeRegressionLine: schemas_array(zKdeRegressionLine).or(zKdeRegressionLine).or(schemas_boolean()).nullish(),
16455
17468
  locale: zLocale.nullish()
16456
17469
  });
16457
17470
  const zRose = schemas_object({
@@ -16613,7 +17626,7 @@
16613
17626
  customTheme: zCustomThemeConfig,
16614
17627
  annotation: zAnnotation,
16615
17628
  locale: zLocale,
16616
- histogramRegressionLine: zHistogramRegressionLine.or(schemas_array(zHistogramRegressionLine)).nullish()
17629
+ regressionLine: zRegressionLine
16617
17630
  });
16618
17631
  return __webpack_exports__;
16619
17632
  })());