@milaboratories/miplots4 1.0.133 → 1.0.135

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 (148) hide show
  1. package/dist/{discrete/components → common}/BandAxis.d.ts +2 -2
  2. package/dist/common/BandAxis.d.ts.map +1 -0
  3. package/dist/{discrete/components → common}/BandAxis.js +3 -3
  4. package/dist/common/BandAxis.js.map +1 -0
  5. package/dist/common/ContinuousGrid.d.ts +3 -3
  6. package/dist/common/ContinuousGrid.d.ts.map +1 -1
  7. package/dist/common/ContinuousGrid.js.map +1 -1
  8. package/dist/discrete/ChartRenderer.d.ts.map +1 -1
  9. package/dist/discrete/ChartRenderer.js +192 -265
  10. package/dist/discrete/ChartRenderer.js.map +1 -1
  11. package/dist/discrete/DiscreteSettingsImpl.d.ts +17 -2
  12. package/dist/discrete/DiscreteSettingsImpl.d.ts.map +1 -1
  13. package/dist/discrete/DiscreteSettingsImpl.js +93 -67
  14. package/dist/discrete/DiscreteSettingsImpl.js.map +1 -1
  15. package/dist/discrete/components/Chart.d.ts.map +1 -1
  16. package/dist/discrete/components/Chart.js +153 -136
  17. package/dist/discrete/components/Chart.js.map +1 -1
  18. package/dist/discrete/components/Grid.d.ts +3 -3
  19. package/dist/discrete/components/Grid.d.ts.map +1 -1
  20. package/dist/discrete/components/Grid.js.map +1 -1
  21. package/dist/discrete/components/layers/StackedAreaElement.d.ts +24 -0
  22. package/dist/discrete/components/layers/StackedAreaElement.d.ts.map +1 -0
  23. package/dist/discrete/components/layers/StackedAreaElement.js +105 -0
  24. package/dist/discrete/components/layers/StackedAreaElement.js.map +1 -0
  25. package/dist/discrete/components/layers/StackedBarElement.d.ts +3 -1
  26. package/dist/discrete/components/layers/StackedBarElement.d.ts.map +1 -1
  27. package/dist/discrete/components/layers/StackedBarElement.js +67 -60
  28. package/dist/discrete/components/layers/StackedBarElement.js.map +1 -1
  29. package/dist/discrete/components/types.d.ts +5 -3
  30. package/dist/discrete/components/types.d.ts.map +1 -1
  31. package/dist/discrete/index.d.ts.map +1 -1
  32. package/dist/discrete/index.js +58 -55
  33. package/dist/discrete/index.js.map +1 -1
  34. package/dist/discrete/layers/index.d.ts +1 -0
  35. package/dist/discrete/layers/index.d.ts.map +1 -1
  36. package/dist/discrete/layers/stackedArea.d.ts +10 -0
  37. package/dist/discrete/layers/stackedArea.d.ts.map +1 -0
  38. package/dist/discrete/layers/stackedArea.js +17 -0
  39. package/dist/discrete/layers/stackedArea.js.map +1 -0
  40. package/dist/discrete/layers/types.d.ts +12 -1
  41. package/dist/discrete/layers/types.d.ts.map +1 -1
  42. package/dist/discrete/utils/index.d.ts +1 -1
  43. package/dist/discrete/utils/index.d.ts.map +1 -1
  44. package/dist/histogram/ChartRenderer.js +1 -1
  45. package/dist/index.d.ts +2 -2
  46. package/dist/index.d.ts.map +1 -1
  47. package/dist/node_modules/d3-scale/src/band.js +45 -35
  48. package/dist/node_modules/d3-scale/src/band.js.map +1 -1
  49. package/dist/scatterplot/ChartRenderer.d.ts +10 -5
  50. package/dist/scatterplot/ChartRenderer.d.ts.map +1 -1
  51. package/dist/scatterplot/ChartRenderer.js +276 -197
  52. package/dist/scatterplot/ChartRenderer.js.map +1 -1
  53. package/dist/scatterplot/ScatterplotSettingsImpl.d.ts +5 -3
  54. package/dist/scatterplot/ScatterplotSettingsImpl.d.ts.map +1 -1
  55. package/dist/scatterplot/ScatterplotSettingsImpl.js +53 -53
  56. package/dist/scatterplot/ScatterplotSettingsImpl.js.map +1 -1
  57. package/dist/scatterplot/components/Chart.d.ts +3 -1
  58. package/dist/scatterplot/components/Chart.d.ts.map +1 -1
  59. package/dist/scatterplot/components/Chart.js +23 -19
  60. package/dist/scatterplot/components/Chart.js.map +1 -1
  61. package/dist/scatterplot/components/ChartAxis.d.ts +3 -1
  62. package/dist/scatterplot/components/ChartAxis.d.ts.map +1 -1
  63. package/dist/scatterplot/components/ChartAxis.js +31 -27
  64. package/dist/scatterplot/components/ChartAxis.js.map +1 -1
  65. package/dist/scatterplot/components/ChartLayersData.d.ts.map +1 -1
  66. package/dist/scatterplot/components/ChartLayersData.js.map +1 -1
  67. package/dist/scatterplot/components/ChartTooltip.js.map +1 -1
  68. package/dist/scatterplot/components/ChartTrendsData.d.ts.map +1 -1
  69. package/dist/scatterplot/components/ChartTrendsData.js +20 -17
  70. package/dist/scatterplot/components/ChartTrendsData.js.map +1 -1
  71. package/dist/scatterplot/components/ChartsGroup.d.ts +5 -1
  72. package/dist/scatterplot/components/ChartsGroup.d.ts.map +1 -1
  73. package/dist/scatterplot/components/ChartsGroup.js +49 -46
  74. package/dist/scatterplot/components/ChartsGroup.js.map +1 -1
  75. package/dist/scatterplot/components/Grid.d.ts +3 -3
  76. package/dist/scatterplot/components/Grid.d.ts.map +1 -1
  77. package/dist/scatterplot/components/Grid.js +31 -27
  78. package/dist/scatterplot/components/Grid.js.map +1 -1
  79. package/dist/scatterplot/components/types.d.ts +15 -5
  80. package/dist/scatterplot/components/types.d.ts.map +1 -1
  81. package/dist/scatterplot/dots.d.ts +2 -2
  82. package/dist/scatterplot/dots.d.ts.map +1 -1
  83. package/dist/scatterplot/dots.js.map +1 -1
  84. package/dist/scatterplot/getLayersData.d.ts +3 -2
  85. package/dist/scatterplot/getLayersData.d.ts.map +1 -1
  86. package/dist/scatterplot/getLayersData.js +29 -18
  87. package/dist/scatterplot/getLayersData.js.map +1 -1
  88. package/dist/scatterplot/index.d.ts +3 -0
  89. package/dist/scatterplot/index.d.ts.map +1 -1
  90. package/dist/scatterplot/index.js +73 -59
  91. package/dist/scatterplot/index.js.map +1 -1
  92. package/dist/scatterplot/linearRegression.d.ts +4 -6
  93. package/dist/scatterplot/linearRegression.d.ts.map +1 -1
  94. package/dist/scatterplot/linearRegression.js.map +1 -1
  95. package/dist/scatterplot/utils/isNumericScale.d.ts +6 -0
  96. package/dist/scatterplot/utils/isNumericScale.d.ts.map +1 -0
  97. package/dist/scatterplot/utils/isNumericScale.js +11 -0
  98. package/dist/scatterplot/utils/isNumericScale.js.map +1 -0
  99. package/dist/scatterplot-umap/ChartRenderer.js +1 -1
  100. package/dist/scatterplot-umap/ChartRenderer.js.map +1 -1
  101. package/dist/scatterplot-umap/SettingsImpl.d.ts +7 -4
  102. package/dist/scatterplot-umap/SettingsImpl.d.ts.map +1 -1
  103. package/dist/scatterplot-umap/SettingsImpl.js.map +1 -1
  104. package/dist/scatterplot-umap/components/LowerSVG.js +7 -7
  105. package/dist/scatterplot-umap/components/LowerSVG.js.map +1 -1
  106. package/dist/types/bubble.d.ts +12 -12
  107. package/dist/types/common.d.ts +186 -21
  108. package/dist/types/common.d.ts.map +1 -1
  109. package/dist/types/common.js +36 -26
  110. package/dist/types/common.js.map +1 -1
  111. package/dist/types/dendro.d.ts +22 -22
  112. package/dist/types/discrete.d.ts +291 -53
  113. package/dist/types/discrete.d.ts.map +1 -1
  114. package/dist/types/discrete.js +48 -33
  115. package/dist/types/discrete.js.map +1 -1
  116. package/dist/types/heatmap.d.ts +12 -12
  117. package/dist/types/histogram.d.ts +4 -4
  118. package/dist/types/scatterplot-umap.d.ts +4 -34
  119. package/dist/types/scatterplot-umap.d.ts.map +1 -1
  120. package/dist/types/scatterplot-umap.js +1 -1
  121. package/dist/types/scatterplot-umap.js.map +1 -1
  122. package/dist/types/scatterplot.d.ts +186 -32
  123. package/dist/types/scatterplot.d.ts.map +1 -1
  124. package/dist/utils/createMultilineDiscreteLabels.d.ts +4 -0
  125. package/dist/utils/createMultilineDiscreteLabels.d.ts.map +1 -0
  126. package/dist/utils/createMultilineDiscreteLabels.js +32 -0
  127. package/dist/utils/createMultilineDiscreteLabels.js.map +1 -0
  128. package/dist/utils/getFacetRowsColumns.d.ts +3 -0
  129. package/dist/utils/getFacetRowsColumns.d.ts.map +1 -0
  130. package/dist/utils/getFacetRowsColumns.js +18 -0
  131. package/dist/utils/getFacetRowsColumns.js.map +1 -0
  132. package/dist/utils/measureMultilineDiscreteLabels.d.ts +9 -0
  133. package/dist/utils/measureMultilineDiscreteLabels.d.ts.map +1 -0
  134. package/dist/utils/measureMultilineDiscreteLabels.js +63 -0
  135. package/dist/utils/measureMultilineDiscreteLabels.js.map +1 -0
  136. package/dist/utils/splitTextByWidth.d.ts.map +1 -0
  137. package/dist/{discrete/utils → utils}/splitTextByWidth.js +1 -1
  138. package/dist/utils/splitTextByWidth.js.map +1 -0
  139. package/package.json +1 -1
  140. package/dist/discrete/components/BandAxis.d.ts.map +0 -1
  141. package/dist/discrete/components/BandAxis.js.map +0 -1
  142. package/dist/discrete/utils/splitTextByWidth.d.ts.map +0 -1
  143. package/dist/discrete/utils/splitTextByWidth.js.map +0 -1
  144. package/dist/scatterplot/components/Axis.d.ts +0 -13
  145. package/dist/scatterplot/components/Axis.d.ts.map +0 -1
  146. package/dist/scatterplot/components/Axis.js +0 -59
  147. package/dist/scatterplot/components/Axis.js.map +0 -1
  148. /package/dist/{discrete/utils → utils}/splitTextByWidth.d.ts +0 -0
@@ -1,20 +1,30 @@
1
1
  var K = Object.defineProperty;
2
- var v = (h, d, t) => d in h ? K(h, d, { enumerable: !0, configurable: !0, writable: !0, value: t }) : h[d] = t;
3
- var f = (h, d, t) => v(h, typeof d != "symbol" ? d + "" : d, t);
4
- import { renderToString as L } from "../node_modules/react-dom/server.browser.js";
5
- import { AbstractChart as S } from "../AbstractChart.js";
6
- import { arraysAreDifferent as C } from "../utils/arraysAreDifferent.js";
7
- import { getKeysCombinations as _ } from "../utils/getKeysCombination.js";
8
- import j from "./ChartRenderer.js";
9
- import { getDots as T } from "./dots.js";
10
- import { getLayersData as x } from "./getLayersData.js";
11
- import { getRegressionData as O } from "./linearRegression.js";
12
- import { ScatterplotSettingsImpl as E } from "./ScatterplotSettingsImpl.js";
13
- import { createLegendInfo as k, addPalettesToAesMapping as G } from "./utils/createLegendInfo.js";
14
- function I(h) {
15
- return typeof h == "object" && "type" in h && h.type === "grouping";
2
+ var v = (l, c, t) => c in l ? K(l, c, { enumerable: !0, configurable: !0, writable: !0, value: t }) : l[c] = t;
3
+ var f = (l, c, t) => v(l, typeof c != "symbol" ? c + "" : c, t);
4
+ import { renderToString as j } from "../node_modules/react-dom/server.browser.js";
5
+ import { AbstractChart as T } from "../AbstractChart.js";
6
+ import { arraysAreDifferent as D } from "../utils/arraysAreDifferent.js";
7
+ import { getKeysCombinations as x } from "../utils/getKeysCombination.js";
8
+ import I from "./ChartRenderer.js";
9
+ import { getDots as M } from "./dots.js";
10
+ import { getLayersData as O } from "./getLayersData.js";
11
+ import { getRegressionData as G } from "./linearRegression.js";
12
+ import { ScatterplotSettingsImpl as _ } from "./ScatterplotSettingsImpl.js";
13
+ import { createLegendInfo as P, addPalettesToAesMapping as U } from "./utils/createLegendInfo.js";
14
+ function F(l) {
15
+ return typeof l == "object" && "type" in l && l.type === "grouping";
16
16
  }
17
- class W extends S {
17
+ function E(l, c, t) {
18
+ if (c.scale === "discrete") {
19
+ const e = c.keys ? c.keys : l.getColumnCategories(t.value);
20
+ return { keys: e, labels: e.reduce((a, s) => {
21
+ const i = (c.labels ?? {})[s] ?? (t.valueLabels ? l.getColumnValue(t.valueLabels, l.getColumnCategoryRowIndex(t.value, s)) : s);
22
+ return a[s] = String(i), a;
23
+ }, {}) };
24
+ }
25
+ return { keys: [], labels: {} };
26
+ }
27
+ class $ extends T {
18
28
  constructor(t, e, a) {
19
29
  super(t, e);
20
30
  f(this, "settings");
@@ -22,7 +32,7 @@ class W extends S {
22
32
  f(this, "onTooltipHintSwitch", () => {
23
33
  });
24
34
  f(this, "calculatedData", null);
25
- this.chartRenderer = new j(), this.settings = new E(e), a && (this.onTooltipHintSwitch = a.onTooltipHintSwitch);
35
+ this.chartRenderer = new I(), this.settings = new _(e), a && (this.onTooltipHintSwitch = a.onTooltipHintSwitch);
26
36
  }
27
37
  mount(t) {
28
38
  try {
@@ -36,8 +46,8 @@ class W extends S {
36
46
  }
37
47
  updateSettingsAndData(t, e) {
38
48
  try {
39
- const a = this.settings, o = this.data;
40
- this.settings = new E(e), this.data = t, this._needUpdateCalculatedDataBySettings(a, this.settings) || this._needUpdateCalculatedDataByData(o, this.data) ? this._updateData() : this._updateAesInData(), this._updateChart(), this.hasError = !1;
49
+ const a = this.settings, s = this.data;
50
+ this.settings = new _(e), this.data = t, this._needUpdateCalculatedDataBySettings(a, this.settings) || this._needUpdateCalculatedDataByData(s, this.data) ? this._updateData() : this._updateAesInData(), this._updateChart(), this.hasError = !1;
41
51
  } catch (a) {
42
52
  this.hasError = !0, console.error(a), a instanceof Error && (this.chartRenderer.renderError(a.message), console.error(a));
43
53
  }
@@ -46,74 +56,76 @@ class W extends S {
46
56
  console.warn("no chart state for scatterplot");
47
57
  }
48
58
  export() {
49
- return this._updateChart(), L(this.chartRenderer.component);
59
+ return this._updateChart(), j(this.chartRenderer.component);
50
60
  }
51
61
  _needUpdateCalculatedDataBySettings(t, e) {
52
- var a, o, l, i;
53
- return t.facetBy.some((r, s) => {
54
- var c;
55
- return r.value !== ((c = e.facetBy[s]) == null ? void 0 : c.value);
56
- }) || t.grouping.length !== e.grouping.length || C(
62
+ var a, s, h, i;
63
+ return t.facetBy.some((r, o) => {
64
+ var u;
65
+ return r.value !== ((u = e.facetBy[o]) == null ? void 0 : u.value);
66
+ }) || t.grouping.length !== e.grouping.length || D(
57
67
  t.grouping.map((r) => r.columnName.value),
58
68
  e.grouping.map((r) => r.columnName.value)
59
- ) || t.grouping.some((r, s) => {
60
- var c;
61
- return C(r.order, (c = e.grouping) == null ? void 0 : c[s].order);
62
- }) || (((a = t.label) == null ? void 0 : a.value) || ((o = e.label) == null ? void 0 : o.value)) && ((l = t.label) == null ? void 0 : l.value) !== ((i = e.label) == null ? void 0 : i.value) || t.layers.length !== e.layers.length || t.layers.some((r, s) => r.type !== e.layers[s].type) || !!t.trend != !!e.trend;
69
+ ) || t.grouping.some((r, o) => {
70
+ var u;
71
+ return D(r.order, (u = e.grouping) == null ? void 0 : u[o].order);
72
+ }) || D(t.chartSettings.xAxis.keys, e.chartSettings.xAxis.keys) || D(t.chartSettings.yAxis.keys, e.chartSettings.yAxis.keys) || (((a = t.label) == null ? void 0 : a.value) || ((s = e.label) == null ? void 0 : s.value)) && ((h = t.label) == null ? void 0 : h.value) !== ((i = e.label) == null ? void 0 : i.value) || t.layers.length !== e.layers.length || t.layers.some((r, o) => r.type !== e.layers[o].type) || !!t.trend != !!e.trend;
63
73
  }
64
74
  _needUpdateCalculatedDataByData(t, e) {
65
- const a = Object.keys(t.data), o = Object.keys(e.data);
66
- return t.id !== e.id || a.length !== o.length || a.some((l) => {
75
+ const a = Object.keys(t.data), s = Object.keys(e.data);
76
+ return t.id !== e.id || a.length !== s.length || a.some((h) => {
67
77
  var i;
68
- return t.data[l].length !== ((i = e.data[l]) == null ? void 0 : i.length);
78
+ return t.data[h].length !== ((i = e.data[h]) == null ? void 0 : i.length);
69
79
  });
70
80
  }
71
81
  _updateData() {
72
- const { x: t, y: e, facetBy: a, grouping: o, trend: l, layers: i, label: r, highlight: s } = this.settings, c = a.map((n) => this.data.getColumnCategories(n.value)).filter((n) => n.length > 0), p = o.map(({ columnName: n }) => this.data.getColumnCategories(n.value)).filter((n) => n.length > 0), g = c.length ? _(c) : [["null"]], m = p.length ? _(p) : [["null"]], u = a.map((n) => n.value) ?? null;
73
- this.data.setGrouping([...u]);
74
- const B = {
82
+ const { x: t, y: e, facetBy: a, grouping: s, trend: h, layers: i, label: r, highlight: o, chartSettings: u } = this.settings, g = a.map((n) => this.data.getColumnCategories(n.value)).filter((n) => n.length > 0), p = s.map(({ columnName: n }) => this.data.getColumnCategories(n.value)).filter((n) => n.length > 0), y = g.length ? x(g) : [["null"]], d = p.length ? x(p) : [["null"]], k = a.map((n) => n.value) ?? null;
83
+ this.data.setGrouping([...k]);
84
+ const S = {
75
85
  x: this.data.getColumn(t.value).every((n) => n === null || !(Number(n) < 0)),
76
86
  y: this.data.getColumn(e.value).every((n) => n === null || !(Number(n) < 0))
77
- }, b = o.map((n) => n.columnName), y = T(this.data, g, t, e, r, s, o), D = Object.keys(y), R = O(this.data, y, D, m, b, l), w = k(this.data, o, i), A = x(this.data, i, D, y, m, b);
87
+ }, C = s.map((n) => n.columnName), m = M(this.data, y, t, e, r, o, s), b = Object.keys(m), B = G(this.data, m, b, d, C, h), A = E(this.data, u.xAxis, t), R = E(this.data, u.yAxis, e), w = P(this.data, s, i), L = O(this.data, i, b, m, d, C, u.xAxis, A);
78
88
  this.calculatedData = {
79
- onlyPositive: B,
80
- dotsByFacets: y,
81
- facetKeys: D,
82
- facetKeysCombinations: g,
83
- trendsData: R,
89
+ onlyPositive: S,
90
+ dotsByFacets: m,
91
+ facetKeys: b,
92
+ facetKeysCombinations: y,
93
+ trendsData: B,
84
94
  legendLabels: w,
85
- layersData: A
95
+ layersData: L,
96
+ discreteAxisDataX: A,
97
+ discreteAxisDataY: R
86
98
  };
87
99
  }
88
100
  _updateAesInData() {
89
101
  const t = this.calculatedData;
90
102
  if (!t)
91
103
  return;
92
- const { grouping: e, trend: a, layers: o } = this.settings, { facetKeys: l, trendsData: i } = t;
93
- l.forEach((r) => {
94
- for (let s = 0; s < o.length; s++)
95
- t.layersData[r][s].info = o[s];
96
- }), e.forEach(({ columnName: r, inheritedAes: s }) => {
97
- const c = /* @__PURE__ */ new Set(), p = {};
98
- o.forEach((g) => {
99
- g.aes && Object.entries(g.aes).forEach(([m, u]) => {
100
- I(u) && u.value === r.value && (c.add(m), u.palette && (p[m] = u.palette));
104
+ const { grouping: e, trend: a, layers: s } = this.settings, { facetKeys: h, trendsData: i } = t;
105
+ h.forEach((r) => {
106
+ for (let o = 0; o < s.length; o++)
107
+ t.layersData[r][o].info = s[o];
108
+ }), e.forEach(({ columnName: r, inheritedAes: o }) => {
109
+ const u = /* @__PURE__ */ new Set(), g = {};
110
+ s.forEach((p) => {
111
+ p.aes && Object.entries(p.aes).forEach(([y, d]) => {
112
+ F(d) && d.value === r.value && (u.add(y), d.palette && (g[y] = d.palette));
101
113
  });
102
- }), t.legendLabels[r.value].usedAes = [...c], t.legendLabels[r.value].aesMap = G(
114
+ }), t.legendLabels[r.value].usedAes = [...u], t.legendLabels[r.value].aesMap = U(
103
115
  r,
104
- p,
105
- s
116
+ g,
117
+ o
106
118
  );
107
119
  }), i && a && Object.keys(i).forEach((r) => {
108
- i[r].forEach((s) => {
109
- s.color = a.color, s.bounded = a.bounded;
120
+ i[r].forEach((o) => {
121
+ o.color = a.color, o.bounded = a.bounded;
110
122
  });
111
123
  });
112
124
  }
113
125
  _updateChart() {
114
126
  if (!this.calculatedData)
115
127
  return;
116
- const { id: t, chartSettings: e, facetSettings: a, grouping: o, keyColumn: l, layers: i, trend: r } = this.settings;
128
+ const { id: t, chartSettings: e, facetSettings: a, grouping: s, keyColumn: h, layers: i, trend: r } = this.settings;
117
129
  this.chartRenderer.render(
118
130
  this.data,
119
131
  t,
@@ -124,18 +136,20 @@ class W extends S {
124
136
  //for titles, if facet by more than 1 column
125
137
  this.calculatedData.dotsByFacets,
126
138
  this.calculatedData.trendsData,
127
- l,
139
+ h,
128
140
  this.calculatedData.onlyPositive,
129
141
  this.calculatedData.legendLabels,
130
142
  this.calculatedData.layersData,
131
- o.map((s) => s.columnName),
143
+ s.map((o) => o.columnName),
132
144
  i,
133
145
  r,
146
+ this.calculatedData.discreteAxisDataX,
147
+ this.calculatedData.discreteAxisDataY,
134
148
  this.onTooltipHintSwitch
135
149
  );
136
150
  }
137
151
  }
138
152
  export {
139
- W as ChartScatterplot
153
+ $ as ChartScatterplot
140
154
  };
141
155
  //# sourceMappingURL=index.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sources":["../../src/scatterplot/index.ts"],"sourcesContent":["import { renderToString } from 'react-dom/server';\nimport { AbstractChart } from '../AbstractChart';\nimport type { DataFrame } from '../DataFrame';\nimport type {\n AesItem,\n ContinuousAesFromColumn,\n InheritAesScatterplot,\n ScatterplotEventHandlers,\n ScatterplotLegendInfo,\n ScatterplotSettings,\n} from '../types';\nimport { arraysAreDifferent } from '../utils/arraysAreDifferent';\nimport { getKeysCombinations } from '../utils/getKeysCombination';\nimport ChartRenderer from './ChartRenderer';\nimport type { GroupedDots } from './dots';\nimport { getDots } from './dots';\nimport type { ScatterplotLayerData } from './getLayersData';\nimport { getLayersData } from './getLayersData';\nimport type { TrendsData } from './linearRegression';\nimport { getRegressionData } from './linearRegression';\nimport { ScatterplotSettingsImpl } from './ScatterplotSettingsImpl';\nimport { addPalettesToAesMapping, createLegendInfo } from './utils/createLegendInfo';\n\nfunction isInheritMapping<T extends (string | number)>(value:T | InheritAesScatterplot | ContinuousAesFromColumn<T>):value is InheritAesScatterplot {\n return typeof value === 'object' && 'type' in value && value.type === 'grouping';\n}\n\nexport class ChartScatterplot extends AbstractChart {\n settings: ScatterplotSettingsImpl;\n chartRenderer: ChartRenderer;\n\n onTooltipHintSwitch: (v:boolean) => void = () => undefined;\n calculatedData: {\n onlyPositive: {x: boolean; y: boolean};\n dotsByFacets: GroupedDots;\n facetKeys: string[];\n facetKeysCombinations: string[][];\n trendsData: TrendsData | null;\n legendLabels: ScatterplotLegendInfo;\n layersData: Record<string, ScatterplotLayerData[]>;\n } | null = null;\n\n constructor(data: DataFrame, settings: ScatterplotSettings, eventHandlers?:ScatterplotEventHandlers) {\n super(data, settings);\n\n this.chartRenderer = new ChartRenderer();\n this.settings = new ScatterplotSettingsImpl(settings);\n if (eventHandlers) {\n this.onTooltipHintSwitch = eventHandlers.onTooltipHintSwitch;\n }\n }\n\n mount(node: HTMLElement) {\n try {\n this.chartRenderer.init(node);\n this._updateData();\n this._updateChart();\n this.hasError = false;\n } catch (err) {\n this.hasError = true;\n console.error(err);\n if (err instanceof Error) {\n this.chartRenderer.renderError(err.message as string);\n console.error(err);\n }\n }\n }\n\n unmount() {\n this.chartRenderer.clear();\n }\n\n updateSettingsAndData(data: DataFrame, settings: ScatterplotSettings) {\n try {\n const previousSettings = this.settings;\n const previousData = this.data;\n this.settings = new ScatterplotSettingsImpl(settings);\n this.data = data;\n if (\n this._needUpdateCalculatedDataBySettings(previousSettings, this.settings) ||\n this._needUpdateCalculatedDataByData(previousData, this.data)\n ) {\n this._updateData();\n } else {\n this._updateAesInData();\n }\n this._updateChart();\n this.hasError = false;\n } catch (err) {\n this.hasError = true;\n console.error(err);\n if (err instanceof Error) {\n this.chartRenderer.renderError(err.message as string);\n console.error(err);\n }\n }\n }\n\n updateChartState(_field: string, _value: unknown) {\n console.warn('no chart state for scatterplot');\n }\n\n export(): string {\n this._updateChart();\n return renderToString(this.chartRenderer.component);\n }\n\n _needUpdateCalculatedDataBySettings(prevSettings: ScatterplotSettingsImpl, settings: ScatterplotSettingsImpl) {\n return (\n prevSettings.facetBy.some((el, idx) => el.value !== settings.facetBy[idx]?.value) ||\n prevSettings.grouping.length !== settings.grouping.length ||\n arraysAreDifferent(\n prevSettings.grouping.map(v => v.columnName.value),\n settings.grouping.map(v => v.columnName.value),\n ) ||\n prevSettings.grouping.some((v, idx) => arraysAreDifferent(v.order, settings.grouping?.[idx].order)) ||\n (prevSettings.label?.value || settings.label?.value) && prevSettings.label?.value !== settings.label?.value ||\n prevSettings.layers.length !== settings.layers.length ||\n prevSettings.layers.some((l, idx) => l.type !== settings.layers[idx].type) ||\n Boolean(prevSettings.trend) !== Boolean(settings.trend)\n );\n }\n\n _needUpdateCalculatedDataByData(prevData: DataFrame, data: DataFrame) {\n const prevKeys = Object.keys(prevData.data);\n const keys = Object.keys(data.data);\n return (\n prevData.id !== data.id ||\n prevKeys.length !== keys.length ||\n prevKeys.some(key => prevData.data[key].length !== data.data[key]?.length)\n );\n }\n\n _updateData() {\n const {x, y, facetBy, grouping, trend, layers, label, highlight} = this.settings;\n const facetKeysLists = facetBy.map(column => this.data.getColumnCategories(column.value)).filter(v => v.length > 0);\n const categoryGroupingKeysLists = grouping.map(({columnName}) => this.data.getColumnCategories(columnName.value)).filter(v => v.length > 0);\n\n const facetKeysCombinations = facetKeysLists.length\n ? getKeysCombinations(facetKeysLists)\n : [['null']];\n const categoryGroupingCombinations = categoryGroupingKeysLists.length\n ? getKeysCombinations(categoryGroupingKeysLists)\n : [['null']];\n\n const facetGroupingValues = facetBy.map(column => column.value) ?? null;\n\n this.data.setGrouping([...facetGroupingValues]);\n const onlyPositive = {\n x: this.data.getColumn(x.value).every(v => {\n return v === null || !(Number(v) < 0);\n }),\n y: this.data.getColumn(y.value).every(v => {\n return v === null || !(Number(v) < 0);\n }),\n };\n\n const groupingColumns = grouping.map(v => v.columnName);\n\n const dotsByFacets = getDots(this.data, facetKeysCombinations, x, y, label, highlight, grouping);\n const facetKeys = Object.keys(dotsByFacets);\n const trendsData = getRegressionData(this.data, dotsByFacets, facetKeys, categoryGroupingCombinations, groupingColumns, trend);\n\n const legendLabels = createLegendInfo(this.data, grouping, layers);\n const layersData = getLayersData(this.data, layers, facetKeys, dotsByFacets, categoryGroupingCombinations, groupingColumns);\n\n this.calculatedData = {\n onlyPositive,\n dotsByFacets,\n facetKeys,\n facetKeysCombinations,\n trendsData,\n legendLabels,\n layersData,\n };\n }\n\n _updateAesInData() {\n const calculated = this.calculatedData;\n if (!calculated) {\n return;\n }\n const {grouping, trend, layers} = this.settings;\n const {facetKeys, trendsData} = calculated;\n\n facetKeys.forEach(facetKey => {\n for (let i = 0; i < layers.length; i++) {\n calculated.layersData[facetKey][i].info = layers[i];\n }\n });\n\n grouping.forEach(({columnName, inheritedAes}) => {\n const usedAes = new Set<keyof AesItem>();\n const usedAesFromPalettes: Partial<Record<keyof AesItem, string[]>> = {}; // if there is palette in mapping then\n layers.forEach(layer => {\n if (layer.aes) {\n Object.entries(layer.aes).forEach(([key, value]) => {\n if (isInheritMapping(value) && value.value === columnName.value) {\n usedAes.add(key as keyof AesItem);\n if (value.palette) {\n usedAesFromPalettes[key as keyof AesItem] = value.palette;\n }\n }\n });\n }\n });\n calculated.legendLabels[columnName.value].usedAes = [...usedAes];\n calculated.legendLabels[columnName.value].aesMap = addPalettesToAesMapping(\n columnName,\n usedAesFromPalettes,\n inheritedAes\n );\n });\n if (trendsData && trend) {\n Object.keys(trendsData).forEach((key) => {\n trendsData[key].forEach(trendInfo => {\n trendInfo.color = trend.color;\n trendInfo.bounded = trend.bounded;\n });\n });\n }\n }\n\n _updateChart() {\n if (!this.calculatedData) {\n return;\n }\n const {id, chartSettings, facetSettings, grouping, keyColumn, layers, trend} = this.settings;\n this.chartRenderer.render(\n this.data,\n id,\n chartSettings,\n facetSettings,\n this.calculatedData.facetKeys,\n this.calculatedData.facetKeysCombinations, //for titles, if facet by more than 1 column\n this.calculatedData.dotsByFacets,\n this.calculatedData.trendsData,\n keyColumn,\n this.calculatedData.onlyPositive,\n this.calculatedData.legendLabels,\n this.calculatedData.layersData,\n grouping.map(v => v.columnName),\n layers,\n trend,\n this.onTooltipHintSwitch\n );\n }\n}\n"],"names":["isInheritMapping","value","ChartScatterplot","AbstractChart","data","settings","eventHandlers","__publicField","ChartRenderer","ScatterplotSettingsImpl","node","err","previousSettings","previousData","_field","_value","renderToString","prevSettings","el","idx","_a","arraysAreDifferent","v","_b","_c","_d","l","prevData","prevKeys","keys","key","x","y","facetBy","grouping","trend","layers","label","highlight","facetKeysLists","column","categoryGroupingKeysLists","columnName","facetKeysCombinations","getKeysCombinations","categoryGroupingCombinations","facetGroupingValues","onlyPositive","groupingColumns","dotsByFacets","getDots","facetKeys","trendsData","getRegressionData","legendLabels","createLegendInfo","layersData","getLayersData","calculated","facetKey","i","inheritedAes","usedAes","usedAesFromPalettes","layer","addPalettesToAesMapping","trendInfo","id","chartSettings","facetSettings","keyColumn"],"mappings":"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"}
1
+ {"version":3,"file":"index.js","sources":["../../src/scatterplot/index.ts"],"sourcesContent":["import { renderToString } from 'react-dom/server';\nimport { AbstractChart } from '../AbstractChart';\nimport type { DataFrame } from '../DataFrame';\nimport type {\n AesItem,\n AxisSettings,\n AxisSettingsDiscrete,\n Category,\n ColumnName,\n ContinuousAesFromColumn,\n InheritAesScatterplot,\n ScatterplotEventHandlers,\n ScatterplotLegendInfo,\n ScatterplotSettings,\n} from '../types';\nimport { arraysAreDifferent } from '../utils/arraysAreDifferent';\nimport { getKeysCombinations } from '../utils/getKeysCombination';\nimport ChartRenderer from './ChartRenderer';\nimport type { GroupedDots } from './dots';\nimport { getDots } from './dots';\nimport type { ScatterplotLayerData } from './getLayersData';\nimport { getLayersData } from './getLayersData';\nimport type { TrendsData } from './linearRegression';\nimport { getRegressionData } from './linearRegression';\nimport { ScatterplotSettingsImpl } from './ScatterplotSettingsImpl';\nimport { addPalettesToAesMapping, createLegendInfo } from './utils/createLegendInfo';\nimport type { DiscreteAxisData } from './components/types';\n\nfunction isInheritMapping<T extends (string | number)>(value:T | InheritAesScatterplot | ContinuousAesFromColumn<T>):value is InheritAesScatterplot {\n return typeof value === 'object' && 'type' in value && value.type === 'grouping';\n}\n\nfunction getDiscreteAxisData(data: DataFrame, axis: AxisSettings, column: ColumnName): DiscreteAxisData {\n if (axis.scale === 'discrete') {\n const keys = axis.keys ? axis.keys : data.getColumnCategories(column.value);\n return {keys, labels: keys.reduce((res, v) => {\n const labelsMap = axis.labels ?? {};\n const labelValue = labelsMap[v] ?? (column.valueLabels ? data.getColumnValue(column.valueLabels, data.getColumnCategoryRowIndex(column.value, v as Category)) : v);\n res[v] = String(labelValue);\n return res;\n }, {} as Record<string, string>)};\n }\n return {keys: [], labels: {}};\n}\n\nexport class ChartScatterplot extends AbstractChart {\n settings: ScatterplotSettingsImpl;\n chartRenderer: ChartRenderer;\n\n onTooltipHintSwitch: (v:boolean) => void = () => undefined;\n calculatedData: {\n onlyPositive: {x: boolean; y: boolean};\n dotsByFacets: GroupedDots;\n facetKeys: string[];\n facetKeysCombinations: string[][];\n trendsData: TrendsData | null;\n legendLabels: ScatterplotLegendInfo;\n layersData: Record<string, ScatterplotLayerData[]>;\n discreteAxisDataX: DiscreteAxisData;\n discreteAxisDataY: DiscreteAxisData;\n } | null = null;\n\n constructor(data: DataFrame, settings: ScatterplotSettings, eventHandlers?:ScatterplotEventHandlers) {\n super(data, settings);\n\n this.chartRenderer = new ChartRenderer();\n this.settings = new ScatterplotSettingsImpl(settings);\n if (eventHandlers) {\n this.onTooltipHintSwitch = eventHandlers.onTooltipHintSwitch;\n }\n }\n\n mount(node: HTMLElement) {\n try {\n this.chartRenderer.init(node);\n this._updateData();\n this._updateChart();\n this.hasError = false;\n } catch (err) {\n this.hasError = true;\n console.error(err);\n if (err instanceof Error) {\n this.chartRenderer.renderError(err.message as string);\n console.error(err);\n }\n }\n }\n\n unmount() {\n this.chartRenderer.clear();\n }\n\n updateSettingsAndData(data: DataFrame, settings: ScatterplotSettings) {\n try {\n const previousSettings = this.settings;\n const previousData = this.data;\n this.settings = new ScatterplotSettingsImpl(settings);\n this.data = data;\n if (\n this._needUpdateCalculatedDataBySettings(previousSettings, this.settings) ||\n this._needUpdateCalculatedDataByData(previousData, this.data)\n ) {\n this._updateData();\n } else {\n this._updateAesInData();\n }\n this._updateChart();\n this.hasError = false;\n } catch (err) {\n this.hasError = true;\n console.error(err);\n if (err instanceof Error) {\n this.chartRenderer.renderError(err.message as string);\n console.error(err);\n }\n }\n }\n\n updateChartState(_field: string, _value: unknown) {\n console.warn('no chart state for scatterplot');\n }\n\n export(): string {\n this._updateChart();\n return renderToString(this.chartRenderer.component);\n }\n\n _needUpdateCalculatedDataBySettings(prevSettings: ScatterplotSettingsImpl, settings: ScatterplotSettingsImpl) {\n return (\n prevSettings.facetBy.some((el, idx) => el.value !== settings.facetBy[idx]?.value) ||\n prevSettings.grouping.length !== settings.grouping.length ||\n arraysAreDifferent(\n prevSettings.grouping.map(v => v.columnName.value),\n settings.grouping.map(v => v.columnName.value),\n ) ||\n prevSettings.grouping.some((v, idx) => arraysAreDifferent(v.order, settings.grouping?.[idx].order)) ||\n arraysAreDifferent((prevSettings.chartSettings.xAxis as AxisSettingsDiscrete).keys, (settings.chartSettings.xAxis as AxisSettingsDiscrete).keys) ||\n arraysAreDifferent((prevSettings.chartSettings.yAxis as AxisSettingsDiscrete).keys, (settings.chartSettings.yAxis as AxisSettingsDiscrete).keys) ||\n (prevSettings.label?.value || settings.label?.value) && prevSettings.label?.value !== settings.label?.value ||\n prevSettings.layers.length !== settings.layers.length ||\n prevSettings.layers.some((l, idx) => l.type !== settings.layers[idx].type) ||\n Boolean(prevSettings.trend) !== Boolean(settings.trend)\n );\n }\n\n _needUpdateCalculatedDataByData(prevData: DataFrame, data: DataFrame) {\n const prevKeys = Object.keys(prevData.data);\n const keys = Object.keys(data.data);\n return (\n prevData.id !== data.id ||\n prevKeys.length !== keys.length ||\n prevKeys.some(key => prevData.data[key].length !== data.data[key]?.length)\n );\n }\n\n _updateData() {\n const {x, y, facetBy, grouping, trend, layers, label, highlight, chartSettings} = this.settings;\n const facetKeysLists = facetBy.map(column => this.data.getColumnCategories(column.value)).filter(v => v.length > 0);\n const categoryGroupingKeysLists = grouping.map(({columnName}) => this.data.getColumnCategories(columnName.value)).filter(v => v.length > 0);\n\n const facetKeysCombinations = facetKeysLists.length\n ? getKeysCombinations(facetKeysLists)\n : [['null']];\n const categoryGroupingCombinations = categoryGroupingKeysLists.length\n ? getKeysCombinations(categoryGroupingKeysLists)\n : [['null']];\n\n const facetGroupingValues = facetBy.map(column => column.value) ?? null;\n\n this.data.setGrouping([...facetGroupingValues]);\n const onlyPositive = {\n x: this.data.getColumn(x.value).every(v => {\n return v === null || !(Number(v) < 0);\n }),\n y: this.data.getColumn(y.value).every(v => {\n return v === null || !(Number(v) < 0);\n }),\n };\n\n const groupingColumns = grouping.map(v => v.columnName);\n\n const dotsByFacets = getDots(this.data, facetKeysCombinations, x, y, label, highlight, grouping);\n const facetKeys = Object.keys(dotsByFacets);\n const trendsData = getRegressionData(this.data, dotsByFacets, facetKeys, categoryGroupingCombinations, groupingColumns, trend);\n\n const discreteAxisDataX = getDiscreteAxisData(this.data, chartSettings.xAxis, x);\n const discreteAxisDataY = getDiscreteAxisData(this.data, chartSettings.yAxis, y);\n const legendLabels = createLegendInfo(this.data, grouping, layers);\n const layersData = getLayersData(this.data, layers, facetKeys, dotsByFacets, categoryGroupingCombinations, groupingColumns, chartSettings.xAxis, discreteAxisDataX);\n\n this.calculatedData = {\n onlyPositive,\n dotsByFacets,\n facetKeys,\n facetKeysCombinations,\n trendsData,\n legendLabels,\n layersData,\n discreteAxisDataX,\n discreteAxisDataY\n };\n }\n\n _updateAesInData() {\n const calculated = this.calculatedData;\n if (!calculated) {\n return;\n }\n const {grouping, trend, layers} = this.settings;\n const {facetKeys, trendsData} = calculated;\n\n facetKeys.forEach(facetKey => {\n for (let i = 0; i < layers.length; i++) {\n calculated.layersData[facetKey][i].info = layers[i];\n }\n });\n\n grouping.forEach(({columnName, inheritedAes}) => {\n const usedAes = new Set<keyof AesItem>();\n const usedAesFromPalettes: Partial<Record<keyof AesItem, string[]>> = {}; // if there is palette in mapping then\n layers.forEach(layer => {\n if (layer.aes) {\n Object.entries(layer.aes).forEach(([key, value]) => {\n if (isInheritMapping(value) && value.value === columnName.value) {\n usedAes.add(key as keyof AesItem);\n if (value.palette) {\n usedAesFromPalettes[key as keyof AesItem] = value.palette;\n }\n }\n });\n }\n });\n calculated.legendLabels[columnName.value].usedAes = [...usedAes];\n calculated.legendLabels[columnName.value].aesMap = addPalettesToAesMapping(\n columnName,\n usedAesFromPalettes,\n inheritedAes\n );\n });\n if (trendsData && trend) {\n Object.keys(trendsData).forEach((key) => {\n trendsData[key].forEach(trendInfo => {\n trendInfo.color = trend.color;\n trendInfo.bounded = trend.bounded;\n });\n });\n }\n }\n\n _updateChart() {\n if (!this.calculatedData) {\n return;\n }\n const {id, chartSettings, facetSettings, grouping, keyColumn, layers, trend} = this.settings;\n this.chartRenderer.render(\n this.data,\n id,\n chartSettings,\n facetSettings,\n this.calculatedData.facetKeys,\n this.calculatedData.facetKeysCombinations, //for titles, if facet by more than 1 column\n this.calculatedData.dotsByFacets,\n this.calculatedData.trendsData,\n keyColumn,\n this.calculatedData.onlyPositive,\n this.calculatedData.legendLabels,\n this.calculatedData.layersData,\n grouping.map(v => v.columnName),\n layers,\n trend,\n this.calculatedData.discreteAxisDataX,\n this.calculatedData.discreteAxisDataY,\n this.onTooltipHintSwitch\n );\n }\n}\n"],"names":["isInheritMapping","value","getDiscreteAxisData","data","axis","column","keys","res","v","labelValue","ChartScatterplot","AbstractChart","settings","eventHandlers","__publicField","ChartRenderer","ScatterplotSettingsImpl","node","err","previousSettings","previousData","_field","_value","renderToString","prevSettings","el","idx","_a","arraysAreDifferent","_b","_c","_d","l","prevData","prevKeys","key","x","y","facetBy","grouping","trend","layers","label","highlight","chartSettings","facetKeysLists","categoryGroupingKeysLists","columnName","facetKeysCombinations","getKeysCombinations","categoryGroupingCombinations","facetGroupingValues","onlyPositive","groupingColumns","dotsByFacets","getDots","facetKeys","trendsData","getRegressionData","discreteAxisDataX","discreteAxisDataY","legendLabels","createLegendInfo","layersData","getLayersData","calculated","facetKey","i","inheritedAes","usedAes","usedAesFromPalettes","layer","addPalettesToAesMapping","trendInfo","id","facetSettings","keyColumn"],"mappings":"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"}
@@ -3,20 +3,18 @@ import { DataFrame } from '../DataFrame';
3
3
  import { ColumnName, ContinuousAesFromColumn, InheritAesScatterplot } from '../types';
4
4
  import { GroupedDots } from './dots';
5
5
  import { ScatterplotSettingsImpl } from './ScatterplotSettingsImpl';
6
- export declare function linearRegression(data: {
6
+ type NumericDot = {
7
7
  x: number;
8
8
  y: number;
9
- }[]): [number, number];
9
+ };
10
+ export declare function linearRegression(data: NumericDot[]): [number, number];
10
11
  export type PointIntervalInfo = {
11
12
  x: number;
12
13
  y: number;
13
14
  left: number;
14
15
  right: number;
15
16
  };
16
- export declare function confidenceInterval(data: {
17
- x: number;
18
- y: number;
19
- }[], predict: (x: number) => number): (x: number) => PointIntervalInfo;
17
+ export declare function confidenceInterval(data: NumericDot[], predict: (x: number) => number): (x: number) => PointIntervalInfo;
20
18
  type TrendInfo = {
21
19
  idx: number;
22
20
  predict: (x: number) => number;
@@ -1 +1 @@
1
- {"version":3,"file":"linearRegression.d.ts","sourceRoot":"","sources":["../../src/scatterplot/linearRegression.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,UAAU,CAAC;AAE5C,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,cAAc,CAAC;AAC9C,OAAO,KAAK,EAAE,UAAU,EAAE,uBAAuB,EAAE,qBAAqB,EAAE,MAAM,UAAU,CAAC;AAC3F,OAAO,KAAK,EAAO,WAAW,EAAE,MAAM,QAAQ,CAAC;AAC/C,OAAO,KAAK,EAAE,uBAAuB,EAAE,MAAM,2BAA2B,CAAC;AAmJzE,wBAAgB,gBAAgB,CAAC,IAAI,EAAE;IAAC,CAAC,EAAE,MAAM,CAAC;IAAC,CAAC,EAAE,MAAM,CAAA;CAAC,EAAE,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,CAsBjF;AAmBD,MAAM,MAAM,iBAAiB,GAAG;IAC5B,CAAC,EAAE,MAAM,CAAC;IAAC,CAAC,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,MAAM,CAAA;CACpD,CAAA;AAED,wBAAgB,kBAAkB,CAC9B,IAAI,EAAE;IAAC,CAAC,EAAE,MAAM,CAAC;IAAC,CAAC,EAAE,MAAM,CAAA;CAAC,EAAE,EAC9B,OAAO,EAAE,CAAC,CAAC,EAAE,MAAM,KAAK,MAAM,GAC/B,CAAC,CAAC,EAAE,MAAM,KAAK,iBAAiB,CAiBlC;AAyED,KAAK,SAAS,GAAG;IACb,GAAG,EAAE,MAAM,CAAC;IACZ,OAAO,EAAE,CAAC,CAAC,EAAE,MAAM,KAAK,MAAM,CAAC;IAC/B,WAAW,EAAE,CAAC,CAAC,EAAE,MAAM,KAAK,iBAAiB,CAAC;IAC9C,OAAO,EAAE,CAAC,CAAC,EAAE,WAAW,CAAC,MAAM,EAAE,MAAM,CAAC,EAAE,CAAC,EAAE,WAAW,CAAC,MAAM,EAAE,MAAM,CAAC,EAAE,KAAK,EAAE,MAAM,EAAE,KAAK,MAAM,CAAC;IACrG,KAAK,EAAE,MAAM,GAAG,qBAAqB,GAAG,uBAAuB,CAAC,MAAM,CAAC,CAAC;IACxE,OAAO,EAAE,OAAO,CAAC;IACjB,SAAS,EAAE,OAAO,CAAC;IACnB,OAAO,EAAE,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAC1B,KAAK,EAAE;QACH,EAAE,CAAC,EAAE,MAAM,CAAC;QACZ,CAAC,CAAC,EAAE,MAAM,CAAC;QACX,MAAM,CAAC,EAAE,MAAM,CAAC;QAChB,YAAY,CAAC,EAAE;YAAC,KAAK,EAAE,MAAM,CAAC;YAAC,SAAS,EAAE,MAAM,CAAC;YAAC,UAAU,EAAC,MAAM,CAAC;YAAC,cAAc,EAAE,MAAM,CAAA;SAAC,CAAC;KAChG,CAAC;CACL,CAAC;AACF,MAAM,MAAM,UAAU,GAAG,MAAM,CAAC,MAAM,EAAE,SAAS,EAAE,CAAC,CAAC;AAErD,wBAAgB,iBAAiB,CAC7B,SAAS,EAAE,SAAS,EACpB,YAAY,EAAE,WAAW,EACzB,SAAS,EAAE,MAAM,EAAE,EACnB,kBAAkB,EAAE,MAAM,EAAE,EAAE,EAC9B,QAAQ,EAAE,UAAU,EAAE,EACtB,KAAK,EAAE,uBAAuB,CAAC,OAAO,CAAC,GACxC,UAAU,GAAG,IAAI,CA6CnB"}
1
+ {"version":3,"file":"linearRegression.d.ts","sourceRoot":"","sources":["../../src/scatterplot/linearRegression.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,UAAU,CAAC;AAE5C,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,cAAc,CAAC;AAC9C,OAAO,KAAK,EAAE,UAAU,EAAE,uBAAuB,EAAE,qBAAqB,EAAE,MAAM,UAAU,CAAC;AAC3F,OAAO,KAAK,EAAO,WAAW,EAAE,MAAM,QAAQ,CAAC;AAC/C,OAAO,KAAK,EAAE,uBAAuB,EAAE,MAAM,2BAA2B,CAAC;AAEzE,KAAK,UAAU,GAAG;IAAC,CAAC,EAAE,MAAM,CAAC;IAAC,CAAC,EAAC,MAAM,CAAA;CAAC,CAAC;AAkJxC,wBAAgB,gBAAgB,CAAC,IAAI,EAAE,UAAU,EAAE,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,CAsBrE;AAmBD,MAAM,MAAM,iBAAiB,GAAG;IAC5B,CAAC,EAAE,MAAM,CAAC;IAAC,CAAC,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,MAAM,CAAA;CACpD,CAAA;AAED,wBAAgB,kBAAkB,CAC9B,IAAI,EAAE,UAAU,EAAE,EAClB,OAAO,EAAE,CAAC,CAAC,EAAE,MAAM,KAAK,MAAM,GAC/B,CAAC,CAAC,EAAE,MAAM,KAAK,iBAAiB,CAiBlC;AAyED,KAAK,SAAS,GAAG;IACb,GAAG,EAAE,MAAM,CAAC;IACZ,OAAO,EAAE,CAAC,CAAC,EAAE,MAAM,KAAK,MAAM,CAAC;IAC/B,WAAW,EAAE,CAAC,CAAC,EAAE,MAAM,KAAK,iBAAiB,CAAC;IAC9C,OAAO,EAAE,CAAC,CAAC,EAAE,WAAW,CAAC,MAAM,EAAE,MAAM,CAAC,EAAE,CAAC,EAAE,WAAW,CAAC,MAAM,EAAE,MAAM,CAAC,EAAE,KAAK,EAAE,MAAM,EAAE,KAAK,MAAM,CAAC;IACrG,KAAK,EAAE,MAAM,GAAG,qBAAqB,GAAG,uBAAuB,CAAC,MAAM,CAAC,CAAC;IACxE,OAAO,EAAE,OAAO,CAAC;IACjB,SAAS,EAAE,OAAO,CAAC;IACnB,OAAO,EAAE,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAC1B,KAAK,EAAE;QACH,EAAE,CAAC,EAAE,MAAM,CAAC;QACZ,CAAC,CAAC,EAAE,MAAM,CAAC;QACX,MAAM,CAAC,EAAE,MAAM,CAAC;QAChB,YAAY,CAAC,EAAE;YAAC,KAAK,EAAE,MAAM,CAAC;YAAC,SAAS,EAAE,MAAM,CAAC;YAAC,UAAU,EAAC,MAAM,CAAC;YAAC,cAAc,EAAE,MAAM,CAAA;SAAC,CAAC;KAChG,CAAC;CACL,CAAC;AACF,MAAM,MAAM,UAAU,GAAG,MAAM,CAAC,MAAM,EAAE,SAAS,EAAE,CAAC,CAAC;AAErD,wBAAgB,iBAAiB,CAC7B,SAAS,EAAE,SAAS,EACpB,YAAY,EAAE,WAAW,EACzB,SAAS,EAAE,MAAM,EAAE,EACnB,kBAAkB,EAAE,MAAM,EAAE,EAAE,EAC9B,QAAQ,EAAE,UAAU,EAAE,EACtB,KAAK,EAAE,uBAAuB,CAAC,OAAO,CAAC,GACxC,UAAU,GAAG,IAAI,CA6CnB"}
@@ -1 +1 @@
1
- {"version":3,"file":"linearRegression.js","sources":["../../src/scatterplot/linearRegression.ts"],"sourcesContent":["import fCDF from '@stdlib/stats-base-dists-f-cdf';\nimport { extent, mean, sum } from 'd3-array';\nimport type { ScaleLinear } from 'd3-scale';\nimport { area } from 'd3-shape';\nimport type { DataFrame } from '../DataFrame';\nimport type { ColumnName, ContinuousAesFromColumn, InheritAesScatterplot } from '../types';\nimport type { Dot, GroupedDots } from './dots';\nimport type { ScatterplotSettingsImpl } from './ScatterplotSettingsImpl';\n\nconst CONFIDENCE_LEVEL = 0.05;\n\n/*\n Returns the normal deviate Z corresponding to a given lower tail area of P; Z is accurate to about 1 part in 10**16.\n\n Wichura, M. J. (1988) Algorithm AS 241: The percentage points of the normal distribution. Applied Statistics, 37, 477–484.\n\n extension of:\n Beasley, J. D./ Springer, S. G. (1977), The percentage points of the NormalDistribution, Applied Statistics. 26, 118–121.\n\n Excel: STANDNORMINV(); R: qnorm()\n */\n\nfunction normdev(p: number) {\n if (p < 0 || p > 1) throw Error('P p < 0 || p > 1 in linear regression calculation');\n if (p == 0) return -Infinity;\n if (p == 1) return Infinity;\n\n /* eslint-disable @typescript-eslint/no-loss-of-precision */\n const a0 = 3.387132872796366608,\n a1 = 1.3314166789178437745e2,\n a2 = 1.9715909503065514427e3,\n a3 = 1.3731693765509461125e4,\n a4 = 4.5921953931549871457e4,\n a5 = 6.7265770927008700853e4,\n a6 = 3.3430575583588128105e4,\n a7 = 2.5090809287301226727e3,\n b1 = 4.2313330701600911252e1,\n b2 = 6.871870074920579083e2,\n b3 = 5.3941960214247511077e3,\n b4 = 2.1213794301586595867e4,\n b5 = 3.930789580009271061e4,\n b6 = 2.8729085735721942674e4,\n b7 = 5.226495278852854561e3,\n c0 = 1.42343711074968357734,\n c1 = 4.6303378461565452959,\n c2 = 5.7694972214606914055,\n c3 = 3.64784832476320460504,\n c4 = 1.27045825245236838258,\n c5 = 2.4178072517745061177e-1,\n c6 = 2.27238449892691845833e-2,\n c7 = 7.7454501427834140764e-4,\n d1 = 2.05319162663775882187,\n d2 = 1.6763848301838038494,\n d3 = 6.8976733498510000455e-1,\n d4 = 1.4810397642748007459e-1,\n d5 = 1.51986665636164571966e-2,\n d6 = 5.475938084995344946e-4,\n d7 = 1.05075007164441684324e-9,\n e0 = 6.6579046435011037772,\n e1 = 5.4637849111641143699,\n e2 = 1.7848265399172913358,\n e3 = 2.9656057182850489123e-1,\n e4 = 2.6532189526576123093e-2,\n e5 = 1.2426609473880784386e-3,\n e6 = 2.71155556874348757815e-5,\n e7 = 2.01033439929228813265e-7,\n f1 = 5.9983220655588793769e-1,\n f2 = 1.3692988092273580531e-1,\n f3 = 1.48753612908506148525e-2,\n f4 = 7.868691311456132591e-4,\n f5 = 1.8463183175100546818e-5,\n f6 = 1.4215117583164458887e-7,\n f7 = 2.04426310338993978564e-15;\n /* eslint-enable @typescript-eslint/no-loss-of-precision */\n\n const q = p - 0.5;\n let r, z;\n\n // p close to 0.5\n if (Math.abs(q) <= 0.425) {\n r = 0.180625 - q * q;\n z =\n (q * (((((((a7 * r + a6) * r + a5) * r + a4) * r + a3) * r + a2) * r + a1) * r + a0)) /\n (((((((b7 * r + b6) * r + b5) * r + b4) * r + b3) * r + b2) * r + b1) * r + 1);\n return z;\n }\n\n if (q > 0) r = 1 - p;\n else r = p;\n r = Math.sqrt(-Math.log(r));\n\n // p neither close to 0.5 nor 0 or 1\n if (r <= 5) {\n r += -1.6;\n z =\n (((((((c7 * r + c6) * r + c5) * r + c4) * r + c3) * r + c2) * r + c1) * r + c0) /\n (((((((d7 * r + d6) * r + d5) * r + d4) * r + d3) * r + d2) * r + d1) * r + 1);\n }\n // p near 0 or 1\n else {\n r += -5;\n z =\n (((((((e7 * r + e6) * r + e5) * r + e4) * r + e3) * r + e2) * r + e1) * r + e0) /\n (((((((f7 * r + f6) * r + f5) * r + f4) * r + f3) * r + f2) * r + f1) * r + 1);\n }\n\n if (q < 0.0) z = -z;\n return z;\n}\n\n/*\nHill's approximated inverse t-distribution calculates t given df and two-tail probability:\nHill, G. W. (1970), Algorithm 396: Student's t-quantiles. Communications of the ACM, 13(10), 619–620.\n\nResult should be \"correct to at least 6 significant digits even for the analytic continuation through noninteger values of n > 5\". For higher precision (used in R, ...) see:\nHill, G. W. (1981) Remark on Algorithm 396, ACM Transactions on Mathematical Software, 7, 250–1.\n\nExcel: TINV(); R: qt()\n*/\nfunction inverseT(p: number, df: number) {\n const {sin, cos, sqrt, pow, exp, PI} = Math;\n let x: number, y: number;\n\n if (df == 1) return cos((p * PI) / 2) / sin((p * PI) / 2);\n if (df == 2) return sqrt(2 / (p * (2 - p)) - 2);\n\n const a = 1 / (df - 0.5);\n const b = 48 / (a * a);\n let c = (((20700 * a) / b - 98) * a - 16) * a + 96.36;\n const d = ((94.5 / (b + c) - 3) / b + 1) * sqrt(a * PI * 0.5) * df;\n x = d * p;\n y = pow(x, 2 / df);\n\n if (y > 0.05 + a) {\n // The procedure normdev(p) is assumed to return a negative normal\n // deviate at the lower tail probability level p, e.g. -2.32 for p = 0.01.\n x = normdev(p / 2);\n y = x * x;\n if (df < 5) c = c + 0.3 * (df - 4.5) * (x + 0.6);\n c = (((0.05 * d * x - 5) * x - 7) * x - 2) * x + b + c;\n y = (((((0.4 * y + 6.3) * y + 36) * y + 94.5) / c - y - 3) / b + 1) * x;\n y = a * y * y;\n if (y > 0.002) y = exp(y) - 1;\n else y = 0.5 * y * y + y;\n } else {\n y =\n (((1 / (((df + 6) / (df * y) - 0.089 * d - 0.822) * (df + 2) * 3) + 0.5 / (df + 4)) * y - 1) * (df + 1)) /\n (df + 2) +\n 1 / y;\n }\n\n return sqrt(df * y);\n}\n\nexport function linearRegression(data: {x: number; y: number}[]): [number, number] {\n let n = data.length,\n sumX = 0,\n sumY = 0,\n sumXY = 0,\n sumX2 = 0;\n for (let i = 0; i < data.length; ++i) {\n const xi = data[i].x;\n const yi = data[i].y;\n if (!Number.isFinite(xi) || !Number.isFinite(yi)) {\n --n;\n continue;\n }\n sumX += xi;\n sumY += yi;\n sumXY += xi * yi;\n sumX2 += xi * xi;\n }\n const slope = (n * sumXY - sumX * sumY) / (n * sumX2 - sumX * sumX);\n const intercept = (sumY - slope * sumX) / n;\n\n return [slope, intercept];\n}\n\nfunction getCoefficientsInterval(dots: Dot[], slope: number, intercept: number) {\n const predict = (x: number) => x * slope + intercept;\n const n = dots.length;\n const meanX = sum(dots, d => d.x) / dots.length;\n const t = inverseT(CONFIDENCE_LEVEL, n - 2);\n\n const se_b = Math.sqrt(\n sum(dots, dot => (dot.y - predict(dot.x)) ** 2) / (n - 2) / sum(dots, dot => (dot.x - meanX) ** 2)\n );\n const slopeError = se_b * t;\n\n const se_a = se_b * Math.sqrt(sum(dots, dot => dot.x ** 2) / n);\n const interceptError = se_a * t;\n\n return {slope, intercept, slopeError, interceptError};\n}\n\nexport type PointIntervalInfo = {\n x: number; y: number, left: number; right: number\n}\n// https://stats.stackexchange.com/questions/101318/understanding-shape-and-calculation-of-confidence-bands-in-linear-regression\nexport function confidenceInterval(\n data: {x: number; y: number}[],\n predict: (x: number) => number\n): (x: number) => PointIntervalInfo {\n const mean = sum(data, d => d.x) / data.length;\n let a = 0,\n b = 0;\n for (let i = 0; i < data.length; ++i) {\n a += Math.pow(data[i].x - mean, 2);\n b += Math.pow(data[i].y - predict(data[i].x), 2);\n }\n const sy = Math.sqrt(b / (data.length - 2));\n const t = inverseT(CONFIDENCE_LEVEL, data.length - 2);\n return function (x: number) {\n const Y = predict(x);\n const se = sy * Math.sqrt(1 / data.length + Math.pow(x - mean, 2) / a);\n const left = Y - t * se;\n const right = Y + t * se;\n return {x, y: Y, left: isNaN(left) ? Y : left, right: isNaN(right) ? Y : right};\n };\n}\n\nfunction getR2(dots: Dot[]) {\n const n = dots.length;\n return Math.pow(\n (n * sum(dots, (d: Dot) => d.x * d.y) - sum(dots, (d: Dot) => d.x) * sum(dots, (d: Dot) => d.y)) /\n (Math.sqrt(\n n * sum(dots, d => d.x * d.x) -\n Math.pow(\n sum(dots, d => d.x),\n 2\n )\n ) *\n Math.sqrt(\n n * sum(dots, d => d.y * d.y) -\n Math.pow(\n sum(dots, d => d.y),\n 2\n )\n )),\n 2\n );\n}\n\nfunction getVariance(arr: Dot[], getter: (d: Dot) => number) {\n const vMean = mean(arr, getter) as number;\n\n return mean(arr.map(v => (getter(v) - vMean) ** 2)) as number;\n}\n\nfunction getStandardDeviation(arr: Dot[], getter: (d: Dot) => number) {\n return Math.sqrt(getVariance(arr, getter));\n}\n\nfunction getCovariance(arr: Dot[], getterX: (d: Dot) => number, getterY: (d: Dot) => number) {\n const meanX = mean(arr, getterX) as number;\n const meanY = mean(arr, getterY) as number;\n const n = arr.length;\n\n return sum(arr, d => (d.x - meanX) * (d.y - meanY)) / n;\n}\n\nfunction getR(dots: Dot[]) {\n const cov = getCovariance(\n dots,\n d => d.x,\n d => d.y\n );\n const sigmaX = getStandardDeviation(dots, d => d.x);\n const sigmaY = getStandardDeviation(dots, d => d.y);\n\n return cov / (sigmaX * sigmaY);\n}\n\nfunction getPValue(dots: Dot[], predict: (x: number) => number) {\n const n = dots.length;\n const p = 1; // number of coefficients\n const dfm = 1; // degrees of freedom model\n const dfe = n - p - 1; // degrees of freedom error\n const meanY = mean(dots, d => d.y) as number;\n const ssr = sum(dots, d => (predict(d.x) - meanY) ** 2); // sum of squares regression\n const sse = sum(dots, d => (predict(d.x) - d.y) ** 2); // sum of squares errors\n\n const msr = ssr / dfm;\n const mse = sse / dfe;\n\n const f = msr / mse;\n\n const pval = fCDF(f, dfm, dfe);\n\n return 1.0 - pval; // \"greater\" p-value\n}\n\ntype TrendInfo = {\n idx: number;\n predict: (x: number) => number;\n getInterval: (x: number) => PointIntervalInfo;\n getArea: (x: ScaleLinear<number, number>, y: ScaleLinear<number, number>, range: number[]) => string;\n color: string | InheritAesScatterplot | ContinuousAesFromColumn<string>;\n bounded: boolean;\n showStats: boolean;\n xBounds: [number, number];\n stats: {\n r2?: number;\n r?: number;\n pValue?: number;\n coefficients?: {slope: number, intercept: number, slopeError:number, interceptError: number};\n };\n};\nexport type TrendsData = Record<string, TrendInfo[]>;\n\nexport function getRegressionData(\n dataFrame: DataFrame,\n dotsByFacets: GroupedDots,\n facetKeys: string[],\n groupingKeysValues: string[][],\n grouping: ColumnName[],\n trend: ScatterplotSettingsImpl['trend']\n): TrendsData | null {\n if (!trend) {\n return null;\n }\n return facetKeys.reduce((res: TrendsData, facetKey) => {\n const facetDots = dotsByFacets[facetKey].dots;\n \n res[facetKey] = groupingKeysValues\n .map(values => {\n const dots = facetDots.filter(dot =>\n grouping.every((column, idx) => String(dataFrame.getColumnValue(column.value, dot.idx)) === values[idx])\n );\n\n if (dots.length === 0) return null;\n\n const [minX = 0, maxX = 0] = extent(dots, (dot: Dot) => dot.x);\n const [slope, intercept] = linearRegression(dots);\n const predict = (x: number) => slope * x + intercept;\n const getInterval = confidenceInterval(dots, predict);\n\n return {\n idx: dots[0].idx,\n predict,\n getInterval,\n getArea: (scaleX: ScaleLinear<number, number>, scaleY: ScaleLinear<number, number>, range: number[]) =>\n area<PointIntervalInfo>()\n .x(d => scaleX(d.x))\n .y0(d => scaleY(d.left))\n .y1(d => scaleY(d.right))(range.map(getInterval)) ?? '',\n color: trend.color,\n bounded: trend.bounded,\n showStats: true,\n xBounds: [minX, maxX],\n stats: {\n r2: getR2(dots),\n r: getR(dots),\n pValue: getPValue(dots, predict),\n coefficients: getCoefficientsInterval(dots, slope, intercept),\n },\n };\n })\n .filter((item) => item !== null) as TrendInfo[];\n \n return res;\n }, {});\n}\n"],"names":["CONFIDENCE_LEVEL","normdev","p","a0","a1","a2","a3","a4","a5","a6","a7","b1","b2","b3","b4","b5","b6","b7","c0","c1","c2","c3","c4","c5","c6","c7","d1","d2","d3","d4","d5","d6","d7","e0","e1","e2","e3","e4","e5","e6","e7","f1","f2","f3","f4","f5","f6","f7","q","r","z","inverseT","df","sin","cos","sqrt","pow","exp","PI","x","y","a","b","c","d","linearRegression","data","n","sumX","sumY","sumXY","sumX2","xi","yi","slope","intercept","getCoefficientsInterval","dots","predict","meanX","sum","t","se_b","dot","slopeError","interceptError","confidenceInterval","mean","i","sy","Y","se","left","right","getR2","getVariance","arr","getter","vMean","v","getStandardDeviation","getCovariance","getterX","getterY","meanY","getR","cov","sigmaX","sigmaY","getPValue","dfm","dfe","ssr","sse","msr","mse","f","fCDF","getRegressionData","dataFrame","dotsByFacets","facetKeys","groupingKeysValues","grouping","trend","res","facetKey","facetDots","values","column","idx","minX","maxX","extent","getInterval","scaleX","scaleY","range","area","item"],"mappings":"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"}
1
+ {"version":3,"file":"linearRegression.js","sources":["../../src/scatterplot/linearRegression.ts"],"sourcesContent":["import fCDF from '@stdlib/stats-base-dists-f-cdf';\nimport { extent, mean, sum } from 'd3-array';\nimport type { ScaleLinear } from 'd3-scale';\nimport { area } from 'd3-shape';\nimport type { DataFrame } from '../DataFrame';\nimport type { ColumnName, ContinuousAesFromColumn, InheritAesScatterplot } from '../types';\nimport type { Dot, GroupedDots } from './dots';\nimport type { ScatterplotSettingsImpl } from './ScatterplotSettingsImpl';\n\ntype NumericDot = {x: number, y:number};\nconst CONFIDENCE_LEVEL = 0.05;\n\n/*\n Returns the normal deviate Z corresponding to a given lower tail area of P; Z is accurate to about 1 part in 10**16.\n\n Wichura, M. J. (1988) Algorithm AS 241: The percentage points of the normal distribution. Applied Statistics, 37, 477–484.\n\n extension of:\n Beasley, J. D./ Springer, S. G. (1977), The percentage points of the NormalDistribution, Applied Statistics. 26, 118–121.\n\n Excel: STANDNORMINV(); R: qnorm()\n */\n\nfunction normdev(p: number) {\n if (p < 0 || p > 1) throw Error('P p < 0 || p > 1 in linear regression calculation');\n if (p == 0) return -Infinity;\n if (p == 1) return Infinity;\n\n /* eslint-disable @typescript-eslint/no-loss-of-precision */\n const a0 = 3.387132872796366608,\n a1 = 1.3314166789178437745e2,\n a2 = 1.9715909503065514427e3,\n a3 = 1.3731693765509461125e4,\n a4 = 4.5921953931549871457e4,\n a5 = 6.7265770927008700853e4,\n a6 = 3.3430575583588128105e4,\n a7 = 2.5090809287301226727e3,\n b1 = 4.2313330701600911252e1,\n b2 = 6.871870074920579083e2,\n b3 = 5.3941960214247511077e3,\n b4 = 2.1213794301586595867e4,\n b5 = 3.930789580009271061e4,\n b6 = 2.8729085735721942674e4,\n b7 = 5.226495278852854561e3,\n c0 = 1.42343711074968357734,\n c1 = 4.6303378461565452959,\n c2 = 5.7694972214606914055,\n c3 = 3.64784832476320460504,\n c4 = 1.27045825245236838258,\n c5 = 2.4178072517745061177e-1,\n c6 = 2.27238449892691845833e-2,\n c7 = 7.7454501427834140764e-4,\n d1 = 2.05319162663775882187,\n d2 = 1.6763848301838038494,\n d3 = 6.8976733498510000455e-1,\n d4 = 1.4810397642748007459e-1,\n d5 = 1.51986665636164571966e-2,\n d6 = 5.475938084995344946e-4,\n d7 = 1.05075007164441684324e-9,\n e0 = 6.6579046435011037772,\n e1 = 5.4637849111641143699,\n e2 = 1.7848265399172913358,\n e3 = 2.9656057182850489123e-1,\n e4 = 2.6532189526576123093e-2,\n e5 = 1.2426609473880784386e-3,\n e6 = 2.71155556874348757815e-5,\n e7 = 2.01033439929228813265e-7,\n f1 = 5.9983220655588793769e-1,\n f2 = 1.3692988092273580531e-1,\n f3 = 1.48753612908506148525e-2,\n f4 = 7.868691311456132591e-4,\n f5 = 1.8463183175100546818e-5,\n f6 = 1.4215117583164458887e-7,\n f7 = 2.04426310338993978564e-15;\n /* eslint-enable @typescript-eslint/no-loss-of-precision */\n\n const q = p - 0.5;\n let r, z;\n\n // p close to 0.5\n if (Math.abs(q) <= 0.425) {\n r = 0.180625 - q * q;\n z =\n (q * (((((((a7 * r + a6) * r + a5) * r + a4) * r + a3) * r + a2) * r + a1) * r + a0)) /\n (((((((b7 * r + b6) * r + b5) * r + b4) * r + b3) * r + b2) * r + b1) * r + 1);\n return z;\n }\n\n if (q > 0) r = 1 - p;\n else r = p;\n r = Math.sqrt(-Math.log(r));\n\n // p neither close to 0.5 nor 0 or 1\n if (r <= 5) {\n r += -1.6;\n z =\n (((((((c7 * r + c6) * r + c5) * r + c4) * r + c3) * r + c2) * r + c1) * r + c0) /\n (((((((d7 * r + d6) * r + d5) * r + d4) * r + d3) * r + d2) * r + d1) * r + 1);\n }\n // p near 0 or 1\n else {\n r += -5;\n z =\n (((((((e7 * r + e6) * r + e5) * r + e4) * r + e3) * r + e2) * r + e1) * r + e0) /\n (((((((f7 * r + f6) * r + f5) * r + f4) * r + f3) * r + f2) * r + f1) * r + 1);\n }\n\n if (q < 0.0) z = -z;\n return z;\n}\n\n/*\nHill's approximated inverse t-distribution calculates t given df and two-tail probability:\nHill, G. W. (1970), Algorithm 396: Student's t-quantiles. Communications of the ACM, 13(10), 619–620.\n\nResult should be \"correct to at least 6 significant digits even for the analytic continuation through noninteger values of n > 5\". For higher precision (used in R, ...) see:\nHill, G. W. (1981) Remark on Algorithm 396, ACM Transactions on Mathematical Software, 7, 250–1.\n\nExcel: TINV(); R: qt()\n*/\nfunction inverseT(p: number, df: number) {\n const {sin, cos, sqrt, pow, exp, PI} = Math;\n let x: number, y: number;\n\n if (df == 1) return cos((p * PI) / 2) / sin((p * PI) / 2);\n if (df == 2) return sqrt(2 / (p * (2 - p)) - 2);\n\n const a = 1 / (df - 0.5);\n const b = 48 / (a * a);\n let c = (((20700 * a) / b - 98) * a - 16) * a + 96.36;\n const d = ((94.5 / (b + c) - 3) / b + 1) * sqrt(a * PI * 0.5) * df;\n x = d * p;\n y = pow(x, 2 / df);\n\n if (y > 0.05 + a) {\n // The procedure normdev(p) is assumed to return a negative normal\n // deviate at the lower tail probability level p, e.g. -2.32 for p = 0.01.\n x = normdev(p / 2);\n y = x * x;\n if (df < 5) c = c + 0.3 * (df - 4.5) * (x + 0.6);\n c = (((0.05 * d * x - 5) * x - 7) * x - 2) * x + b + c;\n y = (((((0.4 * y + 6.3) * y + 36) * y + 94.5) / c - y - 3) / b + 1) * x;\n y = a * y * y;\n if (y > 0.002) y = exp(y) - 1;\n else y = 0.5 * y * y + y;\n } else {\n y =\n (((1 / (((df + 6) / (df * y) - 0.089 * d - 0.822) * (df + 2) * 3) + 0.5 / (df + 4)) * y - 1) * (df + 1)) /\n (df + 2) +\n 1 / y;\n }\n\n return sqrt(df * y);\n}\n\nexport function linearRegression(data: NumericDot[]): [number, number] {\n let n = data.length,\n sumX = 0,\n sumY = 0,\n sumXY = 0,\n sumX2 = 0;\n for (let i = 0; i < data.length; ++i) {\n const xi = data[i].x;\n const yi = data[i].y;\n if (!Number.isFinite(xi) || !Number.isFinite(yi)) {\n --n;\n continue;\n }\n sumX += xi;\n sumY += yi;\n sumXY += xi * yi;\n sumX2 += xi * xi;\n }\n const slope = (n * sumXY - sumX * sumY) / (n * sumX2 - sumX * sumX);\n const intercept = (sumY - slope * sumX) / n;\n\n return [slope, intercept];\n}\n\nfunction getCoefficientsInterval(dots: NumericDot[], slope: number, intercept: number) {\n const predict = (x: number) => x * slope + intercept;\n const n = dots.length;\n const meanX = sum(dots, d => d.x) / dots.length;\n const t = inverseT(CONFIDENCE_LEVEL, n - 2);\n\n const se_b = Math.sqrt(\n sum(dots, dot => (dot.y - predict(dot.x)) ** 2) / (n - 2) / sum(dots, dot => (dot.x - meanX) ** 2)\n );\n const slopeError = se_b * t;\n\n const se_a = se_b * Math.sqrt(sum(dots, dot => dot.x ** 2) / n);\n const interceptError = se_a * t;\n\n return {slope, intercept, slopeError, interceptError};\n}\n\nexport type PointIntervalInfo = {\n x: number; y: number, left: number; right: number\n}\n// https://stats.stackexchange.com/questions/101318/understanding-shape-and-calculation-of-confidence-bands-in-linear-regression\nexport function confidenceInterval(\n data: NumericDot[],\n predict: (x: number) => number\n): (x: number) => PointIntervalInfo {\n const mean = sum(data, d => d.x) / data.length;\n let a = 0,\n b = 0;\n for (let i = 0; i < data.length; ++i) {\n a += Math.pow(data[i].x - mean, 2);\n b += Math.pow(data[i].y - predict(data[i].x), 2);\n }\n const sy = Math.sqrt(b / (data.length - 2));\n const t = inverseT(CONFIDENCE_LEVEL, data.length - 2);\n return function (x: number) {\n const Y = predict(x);\n const se = sy * Math.sqrt(1 / data.length + Math.pow(x - mean, 2) / a);\n const left = Y - t * se;\n const right = Y + t * se;\n return {x, y: Y, left: isNaN(left) ? Y : left, right: isNaN(right) ? Y : right};\n };\n}\n\nfunction getR2(dots: NumericDot[]) {\n const n = dots.length;\n return Math.pow(\n (n * sum(dots, (d: NumericDot) => d.x * d.y) - sum(dots, (d: NumericDot) => d.x) * sum(dots, (d: NumericDot) => d.y)) /\n (Math.sqrt(\n n * sum(dots, d => d.x * d.x) -\n Math.pow(\n sum(dots, d => d.x),\n 2\n )\n ) *\n Math.sqrt(\n n * sum(dots, d => d.y * d.y) -\n Math.pow(\n sum(dots, d => d.y),\n 2\n )\n )),\n 2\n );\n}\n\nfunction getVariance(arr: NumericDot[], getter: (d: NumericDot) => number) {\n const vMean = mean(arr, getter) as number;\n\n return mean(arr.map(v => (getter(v) - vMean) ** 2)) as number;\n}\n\nfunction getStandardDeviation(arr: NumericDot[], getter: (d: NumericDot) => number) {\n return Math.sqrt(getVariance(arr, getter));\n}\n\nfunction getCovariance(arr: NumericDot[], getterX: (d: NumericDot) => number, getterY: (d: NumericDot) => number) {\n const meanX = mean(arr, getterX) as number;\n const meanY = mean(arr, getterY) as number;\n const n = arr.length;\n\n return sum(arr, d => (d.x - meanX) * (d.y - meanY)) / n;\n}\n\nfunction getR(dots: NumericDot[]) {\n const cov = getCovariance(\n dots,\n d => d.x,\n d => d.y\n );\n const sigmaX = getStandardDeviation(dots, d => d.x);\n const sigmaY = getStandardDeviation(dots, d => d.y);\n\n return cov / (sigmaX * sigmaY);\n}\n\nfunction getPValue(dots: NumericDot[], predict: (x: number) => number) {\n const n = dots.length;\n const p = 1; // number of coefficients\n const dfm = 1; // degrees of freedom model\n const dfe = n - p - 1; // degrees of freedom error\n const meanY = mean(dots, d => d.y) as number;\n const ssr = sum(dots, d => (predict(d.x) - meanY) ** 2); // sum of squares regression\n const sse = sum(dots, d => (predict(d.x) - d.y) ** 2); // sum of squares errors\n\n const msr = ssr / dfm;\n const mse = sse / dfe;\n\n const f = msr / mse;\n\n const pval = fCDF(f, dfm, dfe);\n\n return 1.0 - pval; // \"greater\" p-value\n}\n\ntype TrendInfo = {\n idx: number;\n predict: (x: number) => number;\n getInterval: (x: number) => PointIntervalInfo;\n getArea: (x: ScaleLinear<number, number>, y: ScaleLinear<number, number>, range: number[]) => string;\n color: string | InheritAesScatterplot | ContinuousAesFromColumn<string>;\n bounded: boolean;\n showStats: boolean;\n xBounds: [number, number];\n stats: {\n r2?: number;\n r?: number;\n pValue?: number;\n coefficients?: {slope: number, intercept: number, slopeError:number, interceptError: number};\n };\n};\nexport type TrendsData = Record<string, TrendInfo[]>;\n\nexport function getRegressionData(\n dataFrame: DataFrame,\n dotsByFacets: GroupedDots,\n facetKeys: string[],\n groupingKeysValues: string[][],\n grouping: ColumnName[],\n trend: ScatterplotSettingsImpl['trend']\n): TrendsData | null {\n if (!trend) {\n return null;\n }\n return facetKeys.reduce((res: TrendsData, facetKey) => {\n const facetDots = dotsByFacets[facetKey].dots;\n \n res[facetKey] = groupingKeysValues\n .map(values => {\n const dots = facetDots.filter(dot =>\n grouping.every((column, idx) => String(dataFrame.getColumnValue(column.value, dot.idx)) === values[idx])\n ) as NumericDot[];\n\n if (dots.length === 0) return null;\n\n const [minX = 0, maxX = 0] = extent(dots, (dot: NumericDot) => dot.x);\n const [slope, intercept] = linearRegression(dots);\n const predict = (x: number) => slope * x + intercept;\n const getInterval = confidenceInterval(dots, predict);\n\n return {\n idx: (dots[0] as Dot).idx,\n predict,\n getInterval,\n getArea: (scaleX: ScaleLinear<number, number>, scaleY: ScaleLinear<number, number>, range: number[]) =>\n area<PointIntervalInfo>()\n .x(d => scaleX(d.x))\n .y0(d => scaleY(d.left))\n .y1(d => scaleY(d.right))(range.map(getInterval)) ?? '',\n color: trend.color,\n bounded: trend.bounded,\n showStats: true,\n xBounds: [minX, maxX],\n stats: {\n r2: getR2(dots),\n r: getR(dots),\n pValue: getPValue(dots, predict),\n coefficients: getCoefficientsInterval(dots, slope, intercept),\n },\n };\n })\n .filter((item) => item !== null) as TrendInfo[];\n \n return res;\n }, {});\n}\n"],"names":["CONFIDENCE_LEVEL","normdev","p","a0","a1","a2","a3","a4","a5","a6","a7","b1","b2","b3","b4","b5","b6","b7","c0","c1","c2","c3","c4","c5","c6","c7","d1","d2","d3","d4","d5","d6","d7","e0","e1","e2","e3","e4","e5","e6","e7","f1","f2","f3","f4","f5","f6","f7","q","r","z","inverseT","df","sin","cos","sqrt","pow","exp","PI","x","y","a","b","c","d","linearRegression","data","n","sumX","sumY","sumXY","sumX2","xi","yi","slope","intercept","getCoefficientsInterval","dots","predict","meanX","sum","t","se_b","dot","slopeError","interceptError","confidenceInterval","mean","i","sy","Y","se","left","right","getR2","getVariance","arr","getter","vMean","v","getStandardDeviation","getCovariance","getterX","getterY","meanY","getR","cov","sigmaX","sigmaY","getPValue","dfm","dfe","ssr","sse","msr","mse","f","fCDF","getRegressionData","dataFrame","dotsByFacets","facetKeys","groupingKeysValues","grouping","trend","res","facetKey","facetDots","values","column","idx","minX","maxX","extent","getInterval","scaleX","scaleY","range","area","item"],"mappings":"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"}
@@ -0,0 +1,6 @@
1
+ import { ScalePoint } from 'd3-scale';
2
+ import { ChartScales } from '../components/types';
3
+ import { AxisSettings, AxisSettingsContinuous } from '../../types';
4
+ export declare function isNumericScale(scale: ChartScales['x' | 'y']): scale is Exclude<ChartScales['x' | 'y'], ScalePoint<string | number>>;
5
+ export declare function isContinuousAxis(axis: AxisSettings): axis is AxisSettingsContinuous;
6
+ //# sourceMappingURL=isNumericScale.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"isNumericScale.d.ts","sourceRoot":"","sources":["../../../src/scatterplot/utils/isNumericScale.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,UAAU,CAAC;AAC3C,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,qBAAqB,CAAC;AACvD,OAAO,KAAK,EAAE,YAAY,EAAE,sBAAsB,EAAE,MAAM,aAAa,CAAC;AAExE,wBAAgB,cAAc,CAAC,KAAK,EAAE,WAAW,CAAC,GAAG,GAAG,GAAG,CAAC,GAAG,KAAK,IAAI,OAAO,CAAC,WAAW,CAAC,GAAG,GAAG,GAAG,CAAC,EAAE,UAAU,CAAC,MAAM,GAAG,MAAM,CAAC,CAAC,CAEnI;AAED,wBAAgB,gBAAgB,CAAC,IAAI,EAAC,YAAY,GAAG,IAAI,IAAI,sBAAsB,CAElF"}
@@ -0,0 +1,11 @@
1
+ function n(i) {
2
+ return !("bandwidth" in i);
3
+ }
4
+ function e(i) {
5
+ return i.scale !== "discrete";
6
+ }
7
+ export {
8
+ e as isContinuousAxis,
9
+ n as isNumericScale
10
+ };
11
+ //# sourceMappingURL=isNumericScale.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"isNumericScale.js","sources":["../../../src/scatterplot/utils/isNumericScale.ts"],"sourcesContent":["import type { ScalePoint } from 'd3-scale';\nimport type { ChartScales } from '../components/types';\nimport type { AxisSettings, AxisSettingsContinuous } from '../../types';\n\nexport function isNumericScale(scale: ChartScales['x' | 'y']): scale is Exclude<ChartScales['x' | 'y'], ScalePoint<string | number>> {\n return !('bandwidth' in (scale as ScalePoint<string | number>));\n}\n\nexport function isContinuousAxis(axis:AxisSettings): axis is AxisSettingsContinuous {\n return axis.scale !== 'discrete';\n}"],"names":["isNumericScale","scale","isContinuousAxis","axis"],"mappings":"AAIO,SAASA,EAAeC,GAAsG;AACjI,SAAO,EAAE,eAAgBA;AAC7B;AAEO,SAASC,EAAiBC,GAAmD;AAChF,SAAOA,EAAK,UAAU;AAC1B;"}
@@ -13,7 +13,7 @@ import "../node_modules/d3-zoom/src/transform.js";
13
13
  import { createRoot as Q } from "../node_modules/react-dom/client.js";
14
14
  import { Error as J } from "../common/Error.js";
15
15
  import { BLACK as R, DEFAULT_HEIGHT as w, DEFAULT_WIDTH as D, TITLE_LINE_HEIGHT as Z, TITLE_MARGIN as tt } from "../constants.js";
16
- import { splitTextByWidth as et } from "../discrete/utils/splitTextByWidth.js";
16
+ import { splitTextByWidth as et } from "../utils/splitTextByWidth.js";
17
17
  import { MIN_MARGIN as L, DEFAULT_DOT_AES as G } from "../scatterplot/constants.js";
18
18
  import { createAesGetter as H } from "../scatterplot/utils/createAesGetter.js";
19
19
  import { getTicksAndFormat as it } from "../scatterplot/utils/getTicksAndFormat.js";