@milaboratories/miplots4 1.0.162 → 1.0.163

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 (62) hide show
  1. package/dist/common/BandAxis.d.ts +2 -1
  2. package/dist/common/BandAxis.js +19 -18
  3. package/dist/common/BandAxis.js.map +1 -1
  4. package/dist/common/ContinuousAxis.js +20 -20
  5. package/dist/common/ContinuousAxis.js.map +1 -1
  6. package/dist/common/Legend.js +3 -3
  7. package/dist/common/Legend.js.map +1 -1
  8. package/dist/discrete/DiscreteSettingsImpl.d.ts +6 -4
  9. package/dist/discrete/DiscreteSettingsImpl.js +9 -9
  10. package/dist/discrete/DiscreteSettingsImpl.js.map +1 -1
  11. package/dist/discrete/constants.d.ts +1 -1
  12. package/dist/discrete/constants.js +1 -1
  13. package/dist/discrete/constants.js.map +1 -1
  14. package/dist/discrete/index.js +107 -106
  15. package/dist/discrete/index.js.map +1 -1
  16. package/dist/discrete/layers/bar.js +25 -22
  17. package/dist/discrete/layers/bar.js.map +1 -1
  18. package/dist/discrete/layers/errorbars.js +57 -48
  19. package/dist/discrete/layers/errorbars.js.map +1 -1
  20. package/dist/discrete/layers/lines.js +40 -31
  21. package/dist/discrete/layers/lines.js.map +1 -1
  22. package/dist/discrete/layers/stackedBar.js.map +1 -1
  23. package/dist/heatmap/fillCellsData.js +49 -46
  24. package/dist/heatmap/fillCellsData.js.map +1 -1
  25. package/dist/histogram/ChartRenderer.js +57 -54
  26. package/dist/histogram/ChartRenderer.js.map +1 -1
  27. package/dist/histogram/constants.d.ts +1 -1
  28. package/dist/histogram/constants.js.map +1 -1
  29. package/dist/histogram/index.js +58 -51
  30. package/dist/histogram/index.js.map +1 -1
  31. package/dist/scatterplot/ChartRenderer.js +89 -89
  32. package/dist/scatterplot/ChartRenderer.js.map +1 -1
  33. package/dist/scatterplot/components/ChartAxis.js +30 -30
  34. package/dist/scatterplot/components/ChartAxis.js.map +1 -1
  35. package/dist/scatterplot/components/ChartAxisTitles.js +22 -22
  36. package/dist/scatterplot/components/ChartAxisTitles.js.map +1 -1
  37. package/dist/scatterplot/constants.d.ts +1 -1
  38. package/dist/scatterplot/constants.js +1 -1
  39. package/dist/scatterplot/constants.js.map +1 -1
  40. package/dist/scatterplot/dots.d.ts +1 -1
  41. package/dist/scatterplot/dots.js +14 -14
  42. package/dist/scatterplot/dots.js.map +1 -1
  43. package/dist/scatterplot/index.js +94 -79
  44. package/dist/scatterplot/index.js.map +1 -1
  45. package/dist/scatterplot-umap/ChartRenderer.d.ts +1 -1
  46. package/dist/scatterplot-umap/ChartRenderer.js +14 -14
  47. package/dist/scatterplot-umap/ChartRenderer.js.map +1 -1
  48. package/dist/scatterplot-umap/components/LowerSVG.js +38 -38
  49. package/dist/scatterplot-umap/components/LowerSVG.js.map +1 -1
  50. package/dist/types/bubble.d.ts +5 -5
  51. package/dist/types/bubble.js +40 -40
  52. package/dist/types/bubble.js.map +1 -1
  53. package/dist/types/common.d.ts +25 -2
  54. package/dist/types/common.js +16 -15
  55. package/dist/types/common.js.map +1 -1
  56. package/dist/types/discrete.d.ts +66 -56
  57. package/dist/types/discrete.js +40 -38
  58. package/dist/types/discrete.js.map +1 -1
  59. package/dist/types/heatmap.d.ts +5 -6
  60. package/dist/types/heatmap.js +29 -29
  61. package/dist/types/heatmap.js.map +1 -1
  62. package/package.json +1 -1
@@ -1,20 +1,21 @@
1
1
  import G from "../_virtual/lodash.js";
2
2
  import { exhaustive as ae } from "../utils/index.js";
3
3
  import { getFacetOrGroupKey as N } from "../utils/getFacetOrGroupKey.js";
4
+ import te from "../node_modules/.pnpm/d3-array@3.2.4/node_modules/d3-array/src/sum.js";
4
5
  import U from "../node_modules/.pnpm/d3-array@3.2.4/node_modules/d3-array/src/mean.js";
5
- import { quantileSorted as te } from "../node_modules/.pnpm/d3-array@3.2.4/node_modules/d3-array/src/quantile.js";
6
- import oe from "../node_modules/.pnpm/d3-array@3.2.4/node_modules/d3-array/src/deviation.js";
7
- import ne from "../node_modules/.pnpm/d3-array@3.2.4/node_modules/d3-array/src/extent.js";
8
- function se(e) {
9
- const t = oe(e), o = U(e);
6
+ import { quantileSorted as oe } from "../node_modules/.pnpm/d3-array@3.2.4/node_modules/d3-array/src/quantile.js";
7
+ import ne from "../node_modules/.pnpm/d3-array@3.2.4/node_modules/d3-array/src/deviation.js";
8
+ import se from "../node_modules/.pnpm/d3-array@3.2.4/node_modules/d3-array/src/extent.js";
9
+ function ce(e) {
10
+ const t = ne(e), o = U(e);
10
11
  return t === void 0 || o === void 0 || t === 0 ? (n) => n : (n) => (n - o) / t;
11
12
  }
12
- function ce(e) {
13
- const t = U(e), [o, n] = ne(e);
13
+ function ue(e) {
14
+ const t = U(e), [o, n] = se(e);
14
15
  return t === void 0 || o === void 0 || n === void 0 || n === o ? (u) => u : (u) => (u - t) / (n - o);
15
16
  }
16
- function ue(e, t) {
17
- return e === "standardScaling" ? se(t) : e === "meanNormalization" ? ce(t) : (o) => o;
17
+ function ie(e, t) {
18
+ return e === "standardScaling" ? ce(t) : e === "meanNormalization" ? ue(t) : (o) => o;
18
19
  }
19
20
  function _(e, t) {
20
21
  switch (e) {
@@ -32,10 +33,12 @@ function _(e, t) {
32
33
  }
33
34
  case "median": {
34
35
  const o = t.sort((n, u) => n - u);
35
- return te(o, 0.5);
36
+ return oe(o, 0.5);
36
37
  }
37
38
  case "mean":
38
39
  return U(t) ?? t[0];
40
+ case "sum":
41
+ return te(t);
39
42
  default:
40
43
  ae(e, `Unknown aggregation function ${e}`);
41
44
  }
@@ -58,68 +61,68 @@ function R(e) {
58
61
  const W = (e, t, o = {}) => e.sort(
59
62
  (n, u) => t === "asc" ? (o[n] ?? n).localeCompare(o[u] ?? u, "en", { numeric: !0 }) : (o[u] ?? u).localeCompare(o[n] ?? n, "en", { numeric: !0 })
60
63
  );
61
- function ie(e, t, o, n, u) {
64
+ function fe(e, t, o, n, u) {
62
65
  if (t.x || t.y) {
63
66
  const d = e.meta.valueSources.reduce((m, p) => (m[p] = [1 / 0, -1 / 0], m), {});
64
67
  e.meta.facetKeys.forEach((m) => {
65
68
  var E, D;
66
- const { xKeys: p, yKeys: C, cells: $, xKeysByGroups: I, yKeysByGroups: j } = e.facets[m], V = t.x ? I : p.reduce((i, l) => (i[l] = [l], i), {}), y = t.y ? j : C.reduce((i, l) => (i[l] = [l], i), {}), b = Object.keys(V), M = Object.keys(y);
69
+ const { xKeys: p, yKeys: C, cells: $, xKeysByGroups: I, yKeysByGroups: j } = e.facets[m], V = t.x ? I : p.reduce((i, f) => (i[f] = [f], i), {}), y = t.y ? j : C.reduce((i, f) => (i[f] = [f], i), {}), b = Object.keys(V), M = Object.keys(y);
67
70
  for (const i of b)
68
- for (const l of M) {
69
- const S = e.meta.valueSources.reduce((f, K) => (f[K] = [], f), {});
70
- V[i].forEach((f) => {
71
- y[l].forEach((K) => {
71
+ for (const f of M) {
72
+ const S = e.meta.valueSources.reduce((l, K) => (l[K] = [], l), {});
73
+ V[i].forEach((l) => {
74
+ y[f].forEach((K) => {
72
75
  var r, L, B, z;
73
76
  for (const A of e.meta.valueSources) {
74
- const Y = (B = (L = (r = $[f]) == null ? void 0 : r[K]) == null ? void 0 : L.value) == null ? void 0 : B[A];
77
+ const Y = (B = (L = (r = $[l]) == null ? void 0 : r[K]) == null ? void 0 : L.value) == null ? void 0 : B[A];
75
78
  Y !== void 0 && S[A].push(Y);
76
79
  }
77
- (z = $[f]) == null || delete z[K];
80
+ (z = $[l]) == null || delete z[K];
78
81
  });
79
82
  });
80
- for (const f of e.meta.valueSources) {
81
- const K = S[f];
83
+ for (const l of e.meta.valueSources) {
84
+ const K = S[l];
82
85
  if (K.length > 0) {
83
86
  const r = _(t.method, K);
84
- e.facets[m].cells[i] || (e.facets[m].cells[i] = {}), e.facets[m].cells[i][l] || (e.facets[m].cells[i][l] = {
87
+ e.facets[m].cells[i] || (e.facets[m].cells[i] = {}), e.facets[m].cells[i][f] || (e.facets[m].cells[i][f] = {
85
88
  isCell: !0,
86
89
  idx: 0,
87
- id: `${i}_${l}`,
90
+ id: `${i}_${f}`,
88
91
  x: i,
89
- y: l,
92
+ y: f,
90
93
  value: e.meta.valueSources.reduce((B, z) => (B[z] = null, B), {}),
91
94
  normalizedValue: e.meta.valueSources.reduce((B, z) => (B[z] = null, B), {})
92
95
  });
93
- const L = e.facets[m].cells[i][l];
94
- L.value[f] = r, L.normalizedValue[f] = r, d[f][0] = Math.min((E = L.normalizedValue) == null ? void 0 : E[f], d[f][0]), d[f][1] = Math.max((D = L.normalizedValue) == null ? void 0 : D[f], d[f][1]);
96
+ const L = e.facets[m].cells[i][f];
97
+ L.value[l] = r, L.normalizedValue[l] = r, d[l][0] = Math.min((E = L.normalizedValue) == null ? void 0 : E[l], d[l][0]), d[l][1] = Math.max((D = L.normalizedValue) == null ? void 0 : D[l], d[l][1]);
95
98
  }
96
99
  }
97
100
  }
98
101
  t.x && b.forEach((i) => {
99
- o.forEach((l) => {
100
- const S = u.find((r) => r.valueColumn.value === l || r.valueColumn.valueLabels === l);
102
+ o.forEach((f) => {
103
+ const S = u.find((r) => r.valueColumn.value === f || r.valueColumn.valueLabels === f);
101
104
  if (!S)
102
105
  return;
103
- const f = [];
106
+ const l = [];
104
107
  V[i].forEach((r) => {
105
- f.push(e.meta.xDataByKeys[l][r]), delete e.meta.xDataByKeys[l][r];
108
+ l.push(e.meta.xDataByKeys[f][r]), delete e.meta.xDataByKeys[f][r];
106
109
  });
107
- const K = S.type === "continuous" ? _(t.method, f) : T(f);
108
- e.meta.xDataByKeys[l][i] = K;
110
+ const K = S.type === "continuous" ? _(t.method, l) : T(l);
111
+ e.meta.xDataByKeys[f][i] = K;
109
112
  });
110
113
  }), t.y && (n.forEach((i) => {
111
114
  e.meta.yDataByKeys[i] = {};
112
115
  }), M.forEach((i) => {
113
- n.forEach((l) => {
114
- const S = u.find((r) => r.valueColumn.value === l || r.valueColumn.valueLabels === l);
116
+ n.forEach((f) => {
117
+ const S = u.find((r) => r.valueColumn.value === f || r.valueColumn.valueLabels === f);
115
118
  if (!S)
116
119
  return;
117
- const f = [];
120
+ const l = [];
118
121
  y[i].forEach((r) => {
119
- f.push(e.meta.yDataByKeys[l][r]), delete e.meta.yDataByKeys[l][r];
122
+ l.push(e.meta.yDataByKeys[f][r]), delete e.meta.yDataByKeys[f][r];
120
123
  });
121
- const K = S.type === "continuous" ? _(t.method, f) : T(f);
122
- e.meta.yDataByKeys[l][i] = K;
124
+ const K = S.type === "continuous" ? _(t.method, l) : T(l);
125
+ e.meta.yDataByKeys[f][i] = K;
123
126
  });
124
127
  })), t.x && (e.facets[m].xKeys = Object.keys(I), e.facets[m].xKeysByGroups = { null: e.facets[m].xKeys }, e.meta.xLabels = e.meta.xGroupLabels, e.meta.xGroupKeys = ["null"], e.meta.xGroupKeyValues = { null: ["null"] }), t.y && (e.facets[m].yKeys = Object.keys(j), e.facets[m].yKeysByGroups = { null: e.facets[m].yKeys }, e.meta.yLabels = e.meta.yGroupLabels, e.meta.yGroupKeys = ["null"], e.meta.yGroupKeyValues = { null: ["null"] });
125
128
  }), e.meta.valueExtent = d;
@@ -130,7 +133,7 @@ function le(e, t) {
130
133
  for (const u of e.meta.valueSources)
131
134
  e.meta.valueExtent[u][0] = Math.min((o = t.normalizedValue) == null ? void 0 : o[u], e.meta.valueExtent[u][0]), e.meta.valueExtent[u][1] = Math.max((n = t.normalizedValue) == null ? void 0 : n[u], e.meta.valueExtent[u][1]);
132
135
  }
133
- function fe(e, t) {
136
+ function me(e, t) {
134
137
  if (Object.values(t).length) {
135
138
  const o = e.meta.valueSources.reduce((n, u) => (t[u] && (n[u] = [1 / 0, -1 / 0]), n), {});
136
139
  e.meta.facetKeys.forEach((n) => {
@@ -153,20 +156,20 @@ function fe(e, t) {
153
156
  const E = (i = (D = j(M, V)) == null ? void 0 : D.value) == null ? void 0 : i[p];
154
157
  E !== void 0 && y.push(E);
155
158
  });
156
- const b = ue(C.method, y);
159
+ const b = ie(C.method, y);
157
160
  $.forEach((M) => {
158
- var D, i, l;
161
+ var D, i, f;
159
162
  const E = j(M, V);
160
- E !== void 0 && (E.normalizedValue[p] = b((D = E.value) == null ? void 0 : D[p]), o[p][0] = Math.min((i = E.normalizedValue) == null ? void 0 : i[p], o[p][0]), o[p][1] = Math.max((l = E.normalizedValue) == null ? void 0 : l[p], o[p][1]));
163
+ E !== void 0 && (E.normalizedValue[p] = b((D = E.value) == null ? void 0 : D[p]), o[p][0] = Math.min((i = E.normalizedValue) == null ? void 0 : i[p], o[p][0]), o[p][1] = Math.max((f = E.normalizedValue) == null ? void 0 : f[p], o[p][1]));
161
164
  });
162
165
  });
163
166
  }
164
167
  }), e.meta.valueExtent = { ...e.meta.valueExtent, valueExtent: o };
165
168
  }
166
169
  }
167
- function de(e, t, o, n, u, d, m, p, C, $, I, j, V, y, b, M, E) {
168
- const D = d.length ? d.map((a) => y[a.value] ?? t.getColumnCategories(a.value)) : [["null"]], i = m.length ? m.map((a) => y[a.value] ?? t.getColumnCategories(a.value)) : [["null"]], l = p.length ? p.map((a) => y[a.value] ?? t.getColumnCategories(a.value)) : [["null"]], S = R(D), f = R(i), K = R(l), r = S.map(N), L = f.map(N), B = K.map(N);
169
- e.meta.facetKeys = r, e.meta.xGroupKeys = L, e.meta.yGroupKeys = B, e.meta.facetKeyValues = r.reduce((a, s, x) => (a[s] = S[x], a), {}), e.meta.xGroupKeyValues = L.reduce((a, s, x) => (a[s] = f[x], a), {}), e.meta.yGroupKeyValues = B.reduce((a, s, x) => (a[s] = K[x], a), {});
170
+ function Ge(e, t, o, n, u, d, m, p, C, $, I, j, V, y, b, M, E) {
171
+ const D = d.length ? d.map((a) => y[a.value] ?? t.getColumnCategories(a.value)) : [["null"]], i = m.length ? m.map((a) => y[a.value] ?? t.getColumnCategories(a.value)) : [["null"]], f = p.length ? p.map((a) => y[a.value] ?? t.getColumnCategories(a.value)) : [["null"]], S = R(D), l = R(i), K = R(f), r = S.map(N), L = l.map(N), B = K.map(N);
172
+ e.meta.facetKeys = r, e.meta.xGroupKeys = L, e.meta.yGroupKeys = B, e.meta.facetKeyValues = r.reduce((a, s, x) => (a[s] = S[x], a), {}), e.meta.xGroupKeyValues = L.reduce((a, s, x) => (a[s] = l[x], a), {}), e.meta.yGroupKeyValues = B.reduce((a, s, x) => (a[s] = K[x], a), {});
170
173
  const z = o.valueLabels ?? o.value, A = n.valueLabels ?? n.value, Y = C.filter((a) => a.axis === "x").map((a) => a.valueColumn.valueLabels ?? a.valueColumn.value), Z = C.filter((a) => a.axis === "y").map((a) => a.valueColumn.valueLabels ?? a.valueColumn.value), O = Object.values($ ?? {}).map((a) => a.value), k = Object.values(I ?? {}).map((a) => a.value), H = G.uniq([...Y, ...O, z]), J = G.uniq([...Z, ...k, A]);
171
174
  for (let a = 0; a < t.rowsCount; a++) {
172
175
  const s = N(d.map((c) => t.getColumnValue(c.value, a))), x = N(m.map((c) => t.getColumnValue(c.value, a))), g = N(p.map((c) => t.getColumnValue(c.value, a))), q = m.map((c) => t.getColumnValue(c.valueLabels ?? c.value, a)).join(", "), ee = p.map((c) => t.getColumnValue(c.valueLabels ?? c.value, a)).join(", ");
@@ -223,7 +226,7 @@ function de(e, t, o, n, u, d, m, p, C, $, I, j, V, y, b, M, E) {
223
226
  e.facets[a].yKeysByGroups[q]
224
227
  );
225
228
  });
226
- }), ie(e, E, H, J, C), fe(e, j), e.meta.xKeysByGroups = e.meta.xGroupKeys.reduce((a, s) => {
229
+ }), fe(e, E, H, J, C), me(e, j), e.meta.xKeysByGroups = e.meta.xGroupKeys.reduce((a, s) => {
227
230
  const x = W(G.uniq(
228
231
  G.flatten(e.meta.facetKeys.map((g) => e.facets[g].xKeysByGroups[s]))
229
232
  ), b.sorting, e.meta.xLabels);
@@ -239,6 +242,6 @@ function de(e, t, o, n, u, d, m, p, C, $, I, j, V, y, b, M, E) {
239
242
  return e;
240
243
  }
241
244
  export {
242
- de as fillCellsData
245
+ Ge as fillCellsData
243
246
  };
244
247
  //# sourceMappingURL=fillCellsData.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"fillCellsData.js","sources":["../../src/heatmap/fillCellsData.ts"],"sourcesContent":["import { deviation, extent, mean, quantileSorted } from 'd3-array';\nimport lodash from 'lodash';\nimport type { DataFrame } from '../DataFrame';\nimport type { AggregationMethod, ColumnName, DataValue, NormalizationMethod } from '../types';\nimport type { HeatmapSettingsImpl } from './HeatmapSettingsImpl';\nimport { exhaustive } from '../utils';\nimport { getFacetOrGroupKey } from '../utils/getFacetOrGroupKey';\nimport type { BubbleSettingsImpl } from '../bubble/BubbleSettingsImpl';\n\nexport type Cell<T extends string> = {\n isCell: true;\n idx: number;\n id: string;\n value: Record<T, DataValue>;\n normalizedValue: Record<T, DataValue>;\n x: DataValue;\n y: DataValue;\n};\n\nexport type GroupedCellsData<T extends string> = {\n meta: {\n valueSources: T[]; // dataSource for heatmap, color and size for bubble - main data for every cell\n\n facetKeys: string[];\n xGroupKeys: string[];\n yGroupKeys: string[];\n\n xKeys: string[];\n yKeys: string[];\n xKeysByGroups: Record<string, string[]>;\n yKeysByGroups: Record<string, string[]>;\n\n // for titles, if facet by more 1 columns title has several values separated by commas\n facetKeyValues: Record<string, string[]>;\n xGroupKeyValues: Record<string, string[]>;\n yGroupKeyValues: Record<string, string[]>;\n\n xLabels: Record<string, string>;\n yLabels: Record<string, string>;\n xGroupLabels: Record<string, string>;\n yGroupLabels: Record<string, string>;\n\n valueExtent: Record<T, [number, number]>; // for color/size scales\n // data for labels, annotations and dendrograms\n xDataByKeys: Record<string, Record<string, DataValue>>;\n yDataByKeys: Record<string, Record<string, DataValue>>;\n };\n //facet groups\n facets: Record<\n string,\n {\n // axis keys\n xKeys: string[];\n yKeys: string[];\n // axis keys grouped by group keys from meta\n xKeysByGroups: Record<string, string[]>;\n yKeysByGroups: Record<string, string[]>;\n // cells grouped by X, then by Y\n cells: Record<string, Record<string, Cell<T>>>;\n }\n >;\n};\n\nfunction normalizeByStd(values: number[]) {\n const stdValue = deviation(values);\n const meanValue = mean(values);\n\n if (stdValue === undefined || meanValue === undefined || stdValue === 0) {\n return (v: number) => v;\n }\n return (v: number) => (v - meanValue) / stdValue;\n}\nfunction normalizeByMinMax(values: number[]) {\n const meanValue = mean(values);\n const [min, max] = extent(values);\n if (meanValue === undefined || min === undefined || max === undefined || max === min) {\n return (v: number) => v;\n }\n return (v: number) => (v - meanValue) / (max - min);\n}\n\nfunction getNormalizationFn(method: NormalizationMethod, values: number[]) {\n if (method === 'standardScaling') {\n return normalizeByStd(values);\n }\n if (method === 'meanNormalization') {\n return normalizeByMinMax(values);\n }\n return (v: number) => v;\n}\n\nfunction aggregateNumeric(method: AggregationMethod, values: number[]) {\n switch (method) {\n case 'max': {\n let res = values[0];\n for (const v of values) {\n res = Math.max(res, v);\n }\n return res;\n }\n case 'min': {\n let res = values[0];\n for (const v of values) {\n res = Math.min(res, v);\n }\n return res;\n }\n case 'median': {\n const valuesSorted = values.sort((a, b) => a - b);\n return quantileSorted(valuesSorted, 0.5) as number;\n }\n case 'mean': {\n return mean(values) ?? values[0];\n }\n default: exhaustive(method, `Unknown aggregation function ${method}`);\n }\n}\nfunction aggregateString(values: string[]) {\n const list = [...new Set(values)].sort();\n if (list.length > 3) {\n return [...list.slice(0, 3), '...'].join(', ');\n }\n return list.join(', ');\n}\n\n// all combinations with 1 key from each list\nfunction getKeysCombinations(keysLists: string[][]) {\n if (!keysLists.length) {\n return [];\n }\n let result: string[][] = [[]];\n keysLists.forEach(keys => {\n const nextResult: string[][] = [];\n keys.forEach(key => {\n nextResult.push(...result.map(resultItem => [...resultItem, key]));\n });\n result = nextResult;\n });\n return result;\n}\nconst sortByLabels = (arr: string[], direction: 'asc' | 'desc', labels: Record<string, string> = {}) => {\n return arr.sort((a, b) => direction === 'asc'\n ? (labels[a] ?? a).localeCompare((labels[b] ?? b), 'en', { numeric: true })\n : (labels[b] ?? b).localeCompare((labels[a] ?? a), 'en', { numeric: true })\n );\n};\nfunction applyAggregation<T extends string>(\n result: GroupedCellsData<T>,\n aggregation: HeatmapSettingsImpl['aggregation'],\n additionalDataColumnsX: string[],\n additionalDataColumnsY: string[],\n annotations: HeatmapSettingsImpl['annotations']\n) {\n if (aggregation.x || aggregation.y) {\n const valueExtent: GroupedCellsData<T>['meta']['valueExtent'] = result.meta.valueSources.reduce((r, key) => {\n r[key] = [Infinity, -Infinity] as [number, number];\n return r;\n }, {} as GroupedCellsData<T>['meta']['valueExtent']);\n result.meta.facetKeys.forEach(facetKey => {\n const { xKeys, yKeys, cells, xKeysByGroups, yKeysByGroups } = result.facets[facetKey];\n const xGroups = aggregation.x ? xKeysByGroups : xKeys.reduce((res, xKey) => { res[xKey] = [xKey]; return res; }, {} as Record<string, string[]>);\n const yGroups = aggregation.y ? yKeysByGroups : yKeys.reduce((res, yKey) => { res[yKey] = [yKey]; return res; }, {} as Record<string, string[]>);\n const xNewKeys = Object.keys(xGroups);\n const yNewKeys = Object.keys(yGroups);\n\n for (const xGroupKey of xNewKeys) {\n for (const yGroupKey of yNewKeys) {\n // collect values for aggregation to arrays\n const valuesBySources: Record<T, number[]> = result.meta.valueSources.reduce((r, v) => {\n r[v] = [];\n return r;\n }, {} as Record<T, number[]>);\n xGroups[xGroupKey].forEach((xKey) => {\n yGroups[yGroupKey].forEach((yKey) => {\n for (const valueSource of result.meta.valueSources) {\n const cellValue = cells[xKey]?.[yKey]?.value?.[valueSource];\n if (cellValue !== undefined) {\n valuesBySources[valueSource].push(cellValue as number);\n }\n }\n delete cells[xKey]?.[yKey];\n });\n });\n // create new cells with aggregated values\n for (const valueSource of result.meta.valueSources) {\n const values = valuesBySources[valueSource];\n if (values.length > 0) {\n const value = aggregateNumeric(aggregation.method, values);\n if (!result.facets[facetKey].cells[xGroupKey]) {\n result.facets[facetKey].cells[xGroupKey] = {};\n }\n if (!result.facets[facetKey].cells[xGroupKey][yGroupKey]) {\n result.facets[facetKey].cells[xGroupKey][yGroupKey] = {\n isCell: true,\n idx: 0,\n id: `${xGroupKey}_${yGroupKey}`,\n x: xGroupKey,\n y: yGroupKey,\n value: result.meta.valueSources.reduce((r, v) => { r[v] = null; return r; }, {} as Record<T, DataValue>),\n normalizedValue: result.meta.valueSources.reduce((r, v) => { r[v] = null; return r; }, {} as Record<T, DataValue>),\n };\n }\n const cell = result.facets[facetKey].cells[xGroupKey][yGroupKey];\n cell.value[valueSource] = value;\n cell.normalizedValue[valueSource] = value;\n\n valueExtent[valueSource][0] = Math.min(cell.normalizedValue?.[valueSource], valueExtent[valueSource][0]);\n valueExtent[valueSource][1] = Math.max(cell.normalizedValue?.[valueSource], valueExtent[valueSource][1]);\n }\n }\n }\n }\n // add aggregated values for X annotations\n if (aggregation.x) {\n xNewKeys.forEach(xGroupKey => {\n additionalDataColumnsX.forEach(columnKey => {\n const annotation = annotations.find((v) => v.valueColumn.value === columnKey || v.valueColumn.valueLabels === columnKey);\n if (!annotation) {\n return;\n }\n const values: DataValue[] = [];\n xGroups[xGroupKey].forEach((xKey) => {\n values.push(result.meta.xDataByKeys[columnKey][xKey]);\n delete result.meta.xDataByKeys[columnKey][xKey];\n });\n const value = annotation.type === 'continuous' ? aggregateNumeric(aggregation.method, values as number[]) : aggregateString(values as string[]);\n result.meta.xDataByKeys[columnKey][xGroupKey] = value;\n });\n });\n }\n // add aggregated values for Y annotations\n if (aggregation.y) {\n additionalDataColumnsY.forEach(columnKey => {\n result.meta.yDataByKeys[columnKey] = {};\n });\n yNewKeys.forEach(yGroupKey => {\n additionalDataColumnsY.forEach(columnKey => {\n const annotation = annotations.find((v) => v.valueColumn.value === columnKey || v.valueColumn.valueLabels === columnKey);\n if (!annotation) {\n return;\n }\n const values: DataValue[] = [];\n yGroups[yGroupKey].forEach((yKey) => {\n values.push(result.meta.yDataByKeys[columnKey][yKey]);\n delete result.meta.yDataByKeys[columnKey][yKey];\n });\n const value = annotation.type === 'continuous' ? aggregateNumeric(aggregation.method, values as number[]) : aggregateString(values as string[]);\n result.meta.yDataByKeys[columnKey][yGroupKey] = value;\n });\n });\n }\n // erase grouping - we aggregated by them and now there is no grouping in the chart;\n // replace axis keys with group keys - now group keys are new axis keys\n if (aggregation.x) {\n result.facets[facetKey].xKeys = Object.keys(xKeysByGroups);\n result.facets[facetKey].xKeysByGroups = { 'null': result.facets[facetKey].xKeys };\n result.meta.xLabels = result.meta.xGroupLabels;\n result.meta.xGroupKeys = ['null'];\n result.meta.xGroupKeyValues = { null: ['null'] };\n }\n if (aggregation.y) {\n result.facets[facetKey].yKeys = Object.keys(yKeysByGroups);\n result.facets[facetKey].yKeysByGroups = { 'null': result.facets[facetKey].yKeys };\n result.meta.yLabels = result.meta.yGroupLabels;\n result.meta.yGroupKeys = ['null'];\n result.meta.yGroupKeyValues = { null: ['null'] };\n }\n });\n result.meta.valueExtent = valueExtent;\n }\n}\n\nfunction updateValueExtent<T extends string>(result: GroupedCellsData<T>, cell: Cell<T>) {\n for (const valueSource of result.meta.valueSources) {\n result.meta.valueExtent[valueSource][0] = Math.min(cell.normalizedValue?.[valueSource] as number, result.meta.valueExtent[valueSource][0]);\n result.meta.valueExtent[valueSource][1] = Math.max(cell.normalizedValue?.[valueSource] as number, result.meta.valueExtent[valueSource][1]);\n }\n\n}\nfunction applyNormalization<T extends string>(\n result: GroupedCellsData<T>,\n normalizationBySources: Record<T, HeatmapSettingsImpl['normalization']>,\n) {\n if (Object.values(normalizationBySources).length) {\n const valueExtent: GroupedCellsData<T>['meta']['valueExtent'] = result.meta.valueSources.reduce((r, key) => {\n if (normalizationBySources[key]) {\n r[key] = [Infinity, -Infinity] as [number, number];\n }\n return r;\n }, {} as GroupedCellsData<T>['meta']['valueExtent']);\n result.meta.facetKeys.forEach(facetKey => {\n const { xKeys, yKeys, cells } = result.facets[facetKey];\n\n for (const valueSource of result.meta.valueSources) {\n const normalization = normalizationBySources[valueSource];\n if (!normalization) {\n continue;\n }\n const cellKeys = normalization.direction === 'row' ? xKeys : yKeys;\n const groupKeys = normalization.direction === 'row' ? yKeys : xKeys;\n const cellGetter = normalization.direction === 'row'\n ? (cellKey: string, groupKey: string) => cells[cellKey]?.[groupKey]\n : (cellKey: string, groupKey: string) => cells[groupKey]?.[cellKey];\n groupKeys.forEach((groupKey) => {\n const values: number[] = [];\n cellKeys.forEach((cellKey) => {\n const v = cellGetter(cellKey, groupKey)?.value?.[valueSource];\n if (v !== undefined) {\n values.push(v as number);\n }\n });\n const normalize = getNormalizationFn(normalization.method, values);\n cellKeys.forEach((cellKey) => {\n const cell = cellGetter(cellKey, groupKey);\n if (cell !== undefined) {\n cell.normalizedValue[valueSource] = normalize(cell.value?.[valueSource] as number);\n valueExtent[valueSource][0] = Math.min(cell.normalizedValue?.[valueSource], valueExtent[valueSource][0]);\n valueExtent[valueSource][1] = Math.max(cell.normalizedValue?.[valueSource], valueExtent[valueSource][1]);\n }\n });\n });\n }\n\n });\n result.meta.valueExtent = {...result.meta.valueExtent, valueExtent};\n }\n}\n\nexport function fillCellsData<T extends string>(\n result: GroupedCellsData<T>,\n data: DataFrame,\n xColumn: ColumnName,\n yColumn: ColumnName,\n valueColumns: Record<string, ColumnName>,\n facetBy: ColumnName[],\n xGroupBy: ColumnName[],\n yGroupBy: ColumnName[],\n annotations: HeatmapSettingsImpl['annotations'],\n dendrogramX: HeatmapSettingsImpl['dendrogramX'],\n dendrogramY: HeatmapSettingsImpl['dendrogramY'],\n normalizationBySource: Record<T, HeatmapSettingsImpl['normalization']>, // separated for color and size for example\n NAValueAs: HeatmapSettingsImpl['NAValueAs'],\n keysOrder: HeatmapSettingsImpl['keysOrder'],\n xAxis: HeatmapSettingsImpl['chartSettings']['xAxis'] | BubbleSettingsImpl['chartSettings']['xAxis'],\n yAxis: HeatmapSettingsImpl['chartSettings']['yAxis'] | BubbleSettingsImpl['chartSettings']['yAxis'],\n aggregation: HeatmapSettingsImpl['aggregation'],\n) {\n const facetKeysLists = facetBy.length\n ? facetBy.map(column => keysOrder[column.value] ?? data.getColumnCategories(column.value))\n : [['null']];\n const xGroupKeysLists = xGroupBy.length\n ? xGroupBy.map(column => keysOrder[column.value] ?? data.getColumnCategories(column.value))\n : [['null']];\n const yGroupKeysLists = yGroupBy.length\n ? yGroupBy.map(column => keysOrder[column.value] ?? data.getColumnCategories(column.value))\n : [['null']];\n const facetKeysCombinations = getKeysCombinations(facetKeysLists);\n const xGroupKeysCombinations = getKeysCombinations(xGroupKeysLists);\n const yGroupKeysCombinations = getKeysCombinations(yGroupKeysLists);\n\n const facetKeys = facetKeysCombinations.map(getFacetOrGroupKey);\n const xGroupKeys = xGroupKeysCombinations.map(getFacetOrGroupKey);\n const yGroupKeys = yGroupKeysCombinations.map(getFacetOrGroupKey);\n\n result.meta.facetKeys = facetKeys;\n result.meta.xGroupKeys = xGroupKeys;\n result.meta.yGroupKeys = yGroupKeys;\n result.meta.facetKeyValues = facetKeys.reduce((res: Record<string, string[]>, key, index) => {\n res[key] = facetKeysCombinations[index];\n return res;\n }, {});\n result.meta.xGroupKeyValues = xGroupKeys.reduce((res: Record<string, string[]>, key, index) => {\n res[key] = xGroupKeysCombinations[index];\n return res;\n }, {});\n result.meta.yGroupKeyValues = yGroupKeys.reduce((res: Record<string, string[]>, key, index) => {\n res[key] = yGroupKeysCombinations[index];\n return res;\n }, {});\n\n const xLabelsSource = xColumn.valueLabels ?? xColumn.value;\n const yLabelsSource = yColumn.valueLabels ?? yColumn.value;\n const annotationColumnsX = annotations.filter(item => item.axis === 'x').map(item => item.valueColumn.valueLabels ?? item.valueColumn.value);\n const annotationColumnsY = annotations.filter(item => item.axis === 'y').map(item => item.valueColumn.valueLabels ?? item.valueColumn.value);\n const dendrogramXColumns = Object.values(dendrogramX ?? {}).map(column => column.value);\n const dendrogramYColumns = Object.values(dendrogramY ?? {}).map(column => column.value);\n const additionalDataColumnsX = lodash.uniq([...annotationColumnsX, ...dendrogramXColumns, xLabelsSource]);\n const additionalDataColumnsY = lodash.uniq([...annotationColumnsY, ...dendrogramYColumns, yLabelsSource]);\n\n for (let i = 0; i < data.rowsCount; i++) {\n const facetKey = getFacetOrGroupKey(facetBy.map(column => data.getColumnValue(column.value, i)));\n const xGroupKey = getFacetOrGroupKey(xGroupBy.map(column => data.getColumnValue(column.value, i)));\n const yGroupKey = getFacetOrGroupKey(yGroupBy.map(column => data.getColumnValue(column.value, i)));\n const xGroupLabel = xGroupBy.map(column => data.getColumnValue(column.valueLabels ?? column.value, i)).join(', ');\n const yGroupLabel = yGroupBy.map(column => data.getColumnValue(column.valueLabels ?? column.value, i)).join(', ');\n result.meta.xGroupLabels[xGroupKey] = xGroupLabel;\n result.meta.yGroupLabels[yGroupKey] = yGroupLabel;\n const x = String(data.getColumnValue(xColumn.value, i));\n const y = String(data.getColumnValue(yColumn.value, i));\n\n const values = result.meta.valueSources.reduce((r, key) => {\n r[key] = (data.getColumnValue(valueColumns[key].value, i) ?? NAValueAs) as number | null;\n return r;\n }, {} as Record<string, DataValue>);\n\n if (x === 'null' || y === 'null' || Object.values(values).every(v => v === null)) {\n continue;\n }\n\n if (!result.facets[facetKey]) {\n result.facets[facetKey] = {\n xKeys: [],\n yKeys: [],\n xKeysByGroups: {},\n yKeysByGroups: {},\n cells: {},\n };\n }\n if (!result.facets[facetKey].xKeysByGroups[xGroupKey]) {\n result.facets[facetKey].xKeysByGroups[xGroupKey] = [];\n }\n if (!result.facets[facetKey].yKeysByGroups[yGroupKey]) {\n result.facets[facetKey].yKeysByGroups[yGroupKey] = [];\n }\n result.facets[facetKey].xKeys.push(x);\n result.facets[facetKey].yKeys.push(y);\n result.facets[facetKey].xKeysByGroups[xGroupKey].push(x);\n result.facets[facetKey].yKeysByGroups[yGroupKey].push(y);\n\n if (!result.facets[facetKey].cells[x]) {\n result.facets[facetKey].cells[x] = {};\n }\n\n for (const valueSource of result.meta.valueSources) {\n if (result.facets[facetKey].cells[x][y] && result.facets[facetKey].cells[x][y].value[valueSource] !== values[valueSource]) {\n throw Error(`More than 1 value for x=${x}, y=${y}`);\n }\n }\n\n const xLabelsSourceValue = data.getColumnValue(xLabelsSource, i);\n if (result.meta.xLabels[x] && String(xLabelsSourceValue) !== result.meta.xLabels[x]) {\n throw Error(`More than 1 x-label value for x=${x}`);\n }\n const yLabelsSourceValue = data.getColumnValue(yLabelsSource, i);\n if (result.meta.yLabels[y] && String(yLabelsSourceValue) !== result.meta.yLabels[y]) {\n throw Error(`More than 1 y-label value for y=${y}`);\n }\n result.meta.xLabels[x] = String(xLabelsSourceValue);\n result.meta.yLabels[y] = String(yLabelsSourceValue);\n // data for labels, annotations and dendrograms by X\n additionalDataColumnsX.forEach(columnKey => {\n const isAddedColumn = typeof result.meta.xDataByKeys[columnKey] !== 'undefined';\n const isAddedValue = isAddedColumn && typeof result.meta.xDataByKeys[columnKey][x] !== 'undefined';\n if (!isAddedColumn) {\n result.meta.xDataByKeys[columnKey] = {};\n }\n if (isAddedValue && result.meta.xDataByKeys[columnKey][x] !== data.getColumnValue(columnKey, i)) {\n throw Error(`More than 1 value for x = ${x} and column = ${columnKey}`);\n }\n if (!isAddedValue) {\n result.meta.xDataByKeys[columnKey][x] = data.getColumnValue(columnKey, i);\n }\n });\n // data for labels, annotations and dendrograms by Y\n additionalDataColumnsY.forEach(columnKey => {\n const isAddedColumn = typeof result.meta.yDataByKeys[columnKey] !== 'undefined';\n const isAddedValue = isAddedColumn && typeof result.meta.yDataByKeys[columnKey][y] !== 'undefined';\n if (!isAddedColumn) {\n result.meta.yDataByKeys[columnKey] = {};\n }\n if (isAddedValue && result.meta.yDataByKeys[columnKey][y] !== data.getColumnValue(columnKey, i)) {\n throw Error(`More than 1 value for y = ${y} and column = ${columnKey}`);\n }\n if (!isAddedValue) {\n result.meta.yDataByKeys[columnKey][y] = data.getColumnValue(columnKey, i);\n }\n });\n result.facets[facetKey].cells[x][y] = {\n isCell: true,\n idx: i,\n id: `${x}_${y}`,\n x,\n y,\n value: values,\n normalizedValue: values,\n };\n\n updateValueExtent(result, result.facets[facetKey].cells[x][y]);\n }\n\n result.meta.facetKeys = result.meta.facetKeys.filter((key) => result.facets[key]); // filter only used;\n\n // make uniq x, y, x-group and y-group keys\n result.meta.facetKeys.forEach(facetKey => {\n const facet = result.facets[facetKey];\n const uniqueXKeys = lodash.uniq(facet.xKeys);\n const uniqueYKeys = lodash.uniq(facet.yKeys);\n facet.xKeys = keysOrder[xColumn.value] ? lodash.intersection(keysOrder[xColumn.value], uniqueXKeys) : uniqueXKeys;\n facet.yKeys = keysOrder[yColumn.value] ? lodash.intersection(keysOrder[yColumn.value], uniqueYKeys) : uniqueYKeys;\n xGroupKeys.forEach(xGroupKey => {\n result.facets[facetKey].xKeysByGroups[xGroupKey] = lodash.intersection(\n facet.xKeys,\n result.facets[facetKey].xKeysByGroups[xGroupKey]\n );\n });\n yGroupKeys.forEach(yGroupKey => {\n result.facets[facetKey].yKeysByGroups[yGroupKey] = lodash.intersection(\n facet.yKeys,\n result.facets[facetKey].yKeysByGroups[yGroupKey]\n );\n });\n });\n\n applyAggregation(result, aggregation, additionalDataColumnsX, additionalDataColumnsY, annotations);\n applyNormalization(result, normalizationBySource);\n\n // every facet may contain not all of available keys, but for shared axes it is necessary to have all of them\n result.meta.xKeysByGroups = result.meta.xGroupKeys.reduce((res: Record<string, string[]>, xGroupKey) => {\n const existingXKeys = sortByLabels(lodash.uniq(\n lodash.flatten(result.meta.facetKeys.map(facetKey => result.facets[facetKey].xKeysByGroups[xGroupKey]))\n ), xAxis.sorting, result.meta.xLabels);\n res[xGroupKey] = keysOrder[xColumn.value] ? lodash.intersection(keysOrder[xColumn.value], existingXKeys) : existingXKeys;\n return res;\n }, {});\n result.meta.xKeys = result.meta.xGroupKeys.reduce((res: string[], xGroupKey: string) => {\n res = res.concat(result.meta.xKeysByGroups[xGroupKey]);\n return res;\n }, []);\n\n result.meta.yKeysByGroups = result.meta.yGroupKeys.reduce((res: Record<string, string[]>, yGroupKey) => {\n const existingYKeys = sortByLabels(lodash.uniq(\n lodash.flatten(result.meta.facetKeys.map(facetKey => result.facets[facetKey].yKeysByGroups[yGroupKey]))\n ), yAxis.sorting, result.meta.yLabels);\n res[yGroupKey] = keysOrder[yColumn.value] ? lodash.intersection(keysOrder[yColumn.value], existingYKeys) : existingYKeys;\n return res;\n }, {});\n result.meta.yKeys = result.meta.yGroupKeys.reduce((res: string[], yGroupKey: string) => {\n res = res.concat(result.meta.yKeysByGroups[yGroupKey]);\n return res;\n }, []);\n\n for (const valueSource of result.meta.valueSources) {\n // avoid render errors on empty data\n if (result.meta.valueExtent[valueSource][0] === Infinity) {\n result.meta.valueExtent[valueSource][0] = 0;\n }\n if (result.meta.valueExtent[valueSource][1] === -Infinity) {\n result.meta.valueExtent[valueSource][1] = 0;\n }\n }\n\n return result;\n}"],"names":["normalizeByStd","values","stdValue","deviation","meanValue","mean","v","normalizeByMinMax","min","max","extent","getNormalizationFn","method","aggregateNumeric","res","valuesSorted","a","b","quantileSorted","exhaustive","aggregateString","list","getKeysCombinations","keysLists","result","keys","nextResult","key","resultItem","sortByLabels","arr","direction","labels","applyAggregation","aggregation","additionalDataColumnsX","additionalDataColumnsY","annotations","valueExtent","r","facetKey","xKeys","yKeys","cells","xKeysByGroups","yKeysByGroups","xGroups","xKey","yGroups","yKey","xNewKeys","yNewKeys","xGroupKey","yGroupKey","valuesBySources","valueSource","cellValue","_c","_b","_a","_d","value","cell","columnKey","annotation","updateValueExtent","applyNormalization","normalizationBySources","normalization","cellKeys","groupKeys","cellGetter","cellKey","groupKey","normalize","fillCellsData","data","xColumn","yColumn","valueColumns","facetBy","xGroupBy","yGroupBy","dendrogramX","dendrogramY","normalizationBySource","NAValueAs","keysOrder","xAxis","yAxis","facetKeysLists","column","xGroupKeysLists","yGroupKeysLists","facetKeysCombinations","xGroupKeysCombinations","yGroupKeysCombinations","facetKeys","getFacetOrGroupKey","xGroupKeys","yGroupKeys","index","xLabelsSource","yLabelsSource","annotationColumnsX","item","annotationColumnsY","dendrogramXColumns","dendrogramYColumns","lodash","i","xGroupLabel","yGroupLabel","x","y","xLabelsSourceValue","yLabelsSourceValue","isAddedColumn","isAddedValue","facet","uniqueXKeys","uniqueYKeys","existingXKeys","existingYKeys"],"mappings":"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"}
1
+ {"version":3,"file":"fillCellsData.js","sources":["../../src/heatmap/fillCellsData.ts"],"sourcesContent":["import { deviation, extent, mean, quantileSorted, sum } from 'd3-array';\nimport lodash from 'lodash';\nimport type { DataFrame } from '../DataFrame';\nimport type { AggregationMethod, ColumnName, DataValue, NormalizationMethod } from '../types';\nimport type { HeatmapSettingsImpl } from './HeatmapSettingsImpl';\nimport { exhaustive } from '../utils';\nimport { getFacetOrGroupKey } from '../utils/getFacetOrGroupKey';\nimport type { BubbleSettingsImpl } from '../bubble/BubbleSettingsImpl';\n\nexport type Cell<T extends string> = {\n isCell: true;\n idx: number;\n id: string;\n value: Record<T, DataValue>;\n normalizedValue: Record<T, DataValue>;\n x: DataValue;\n y: DataValue;\n};\n\nexport type GroupedCellsData<T extends string> = {\n meta: {\n valueSources: T[]; // dataSource for heatmap, color and size for bubble - main data for every cell\n\n facetKeys: string[];\n xGroupKeys: string[];\n yGroupKeys: string[];\n\n xKeys: string[];\n yKeys: string[];\n xKeysByGroups: Record<string, string[]>;\n yKeysByGroups: Record<string, string[]>;\n\n // for titles, if facet by more 1 columns title has several values separated by commas\n facetKeyValues: Record<string, string[]>;\n xGroupKeyValues: Record<string, string[]>;\n yGroupKeyValues: Record<string, string[]>;\n\n xLabels: Record<string, string>;\n yLabels: Record<string, string>;\n xGroupLabels: Record<string, string>;\n yGroupLabels: Record<string, string>;\n\n valueExtent: Record<T, [number, number]>; // for color/size scales\n // data for labels, annotations and dendrograms\n xDataByKeys: Record<string, Record<string, DataValue>>;\n yDataByKeys: Record<string, Record<string, DataValue>>;\n };\n //facet groups\n facets: Record<\n string,\n {\n // axis keys\n xKeys: string[];\n yKeys: string[];\n // axis keys grouped by group keys from meta\n xKeysByGroups: Record<string, string[]>;\n yKeysByGroups: Record<string, string[]>;\n // cells grouped by X, then by Y\n cells: Record<string, Record<string, Cell<T>>>;\n }\n >;\n};\n\nfunction normalizeByStd(values: number[]) {\n const stdValue = deviation(values);\n const meanValue = mean(values);\n\n if (stdValue === undefined || meanValue === undefined || stdValue === 0) {\n return (v: number) => v;\n }\n return (v: number) => (v - meanValue) / stdValue;\n}\nfunction normalizeByMinMax(values: number[]) {\n const meanValue = mean(values);\n const [min, max] = extent(values);\n if (meanValue === undefined || min === undefined || max === undefined || max === min) {\n return (v: number) => v;\n }\n return (v: number) => (v - meanValue) / (max - min);\n}\n\nfunction getNormalizationFn(method: NormalizationMethod, values: number[]) {\n if (method === 'standardScaling') {\n return normalizeByStd(values);\n }\n if (method === 'meanNormalization') {\n return normalizeByMinMax(values);\n }\n return (v: number) => v;\n}\n\nfunction aggregateNumeric(method: AggregationMethod, values: number[]) {\n switch (method) {\n case 'max': {\n let res = values[0];\n for (const v of values) {\n res = Math.max(res, v);\n }\n return res;\n }\n case 'min': {\n let res = values[0];\n for (const v of values) {\n res = Math.min(res, v);\n }\n return res;\n }\n case 'median': {\n const valuesSorted = values.sort((a, b) => a - b);\n return quantileSorted(valuesSorted, 0.5) as number;\n }\n case 'mean': {\n return mean(values) ?? values[0];\n }\n case 'sum': {\n return sum(values) as number;\n }\n default: exhaustive(method, `Unknown aggregation function ${method}`);\n }\n}\nfunction aggregateString(values: string[]) {\n const list = [...new Set(values)].sort();\n if (list.length > 3) {\n return [...list.slice(0, 3), '...'].join(', ');\n }\n return list.join(', ');\n}\n\n// all combinations with 1 key from each list\nfunction getKeysCombinations(keysLists: string[][]) {\n if (!keysLists.length) {\n return [];\n }\n let result: string[][] = [[]];\n keysLists.forEach(keys => {\n const nextResult: string[][] = [];\n keys.forEach(key => {\n nextResult.push(...result.map(resultItem => [...resultItem, key]));\n });\n result = nextResult;\n });\n return result;\n}\nconst sortByLabels = (arr: string[], direction: 'asc' | 'desc', labels: Record<string, string> = {}) => {\n return arr.sort((a, b) => direction === 'asc'\n ? (labels[a] ?? a).localeCompare((labels[b] ?? b), 'en', { numeric: true })\n : (labels[b] ?? b).localeCompare((labels[a] ?? a), 'en', { numeric: true })\n );\n};\nfunction applyAggregation<T extends string>(\n result: GroupedCellsData<T>,\n aggregation: HeatmapSettingsImpl['aggregation'],\n additionalDataColumnsX: string[],\n additionalDataColumnsY: string[],\n annotations: HeatmapSettingsImpl['annotations']\n) {\n if (aggregation.x || aggregation.y) {\n const valueExtent: GroupedCellsData<T>['meta']['valueExtent'] = result.meta.valueSources.reduce((r, key) => {\n r[key] = [Infinity, -Infinity] as [number, number];\n return r;\n }, {} as GroupedCellsData<T>['meta']['valueExtent']);\n result.meta.facetKeys.forEach(facetKey => {\n const { xKeys, yKeys, cells, xKeysByGroups, yKeysByGroups } = result.facets[facetKey];\n const xGroups = aggregation.x ? xKeysByGroups : xKeys.reduce((res, xKey) => { res[xKey] = [xKey]; return res; }, {} as Record<string, string[]>);\n const yGroups = aggregation.y ? yKeysByGroups : yKeys.reduce((res, yKey) => { res[yKey] = [yKey]; return res; }, {} as Record<string, string[]>);\n const xNewKeys = Object.keys(xGroups);\n const yNewKeys = Object.keys(yGroups);\n\n for (const xGroupKey of xNewKeys) {\n for (const yGroupKey of yNewKeys) {\n // collect values for aggregation to arrays\n const valuesBySources: Record<T, number[]> = result.meta.valueSources.reduce((r, v) => {\n r[v] = [];\n return r;\n }, {} as Record<T, number[]>);\n xGroups[xGroupKey].forEach((xKey) => {\n yGroups[yGroupKey].forEach((yKey) => {\n for (const valueSource of result.meta.valueSources) {\n const cellValue = cells[xKey]?.[yKey]?.value?.[valueSource];\n if (cellValue !== undefined) {\n valuesBySources[valueSource].push(cellValue as number);\n }\n }\n delete cells[xKey]?.[yKey];\n });\n });\n // create new cells with aggregated values\n for (const valueSource of result.meta.valueSources) {\n const values = valuesBySources[valueSource];\n if (values.length > 0) {\n const value = aggregateNumeric(aggregation.method, values);\n if (!result.facets[facetKey].cells[xGroupKey]) {\n result.facets[facetKey].cells[xGroupKey] = {};\n }\n if (!result.facets[facetKey].cells[xGroupKey][yGroupKey]) {\n result.facets[facetKey].cells[xGroupKey][yGroupKey] = {\n isCell: true,\n idx: 0,\n id: `${xGroupKey}_${yGroupKey}`,\n x: xGroupKey,\n y: yGroupKey,\n value: result.meta.valueSources.reduce((r, v) => { r[v] = null; return r; }, {} as Record<T, DataValue>),\n normalizedValue: result.meta.valueSources.reduce((r, v) => { r[v] = null; return r; }, {} as Record<T, DataValue>),\n };\n }\n const cell = result.facets[facetKey].cells[xGroupKey][yGroupKey];\n cell.value[valueSource] = value;\n cell.normalizedValue[valueSource] = value;\n\n valueExtent[valueSource][0] = Math.min(cell.normalizedValue?.[valueSource], valueExtent[valueSource][0]);\n valueExtent[valueSource][1] = Math.max(cell.normalizedValue?.[valueSource], valueExtent[valueSource][1]);\n }\n }\n }\n }\n // add aggregated values for X annotations\n if (aggregation.x) {\n xNewKeys.forEach(xGroupKey => {\n additionalDataColumnsX.forEach(columnKey => {\n const annotation = annotations.find((v) => v.valueColumn.value === columnKey || v.valueColumn.valueLabels === columnKey);\n if (!annotation) {\n return;\n }\n const values: DataValue[] = [];\n xGroups[xGroupKey].forEach((xKey) => {\n values.push(result.meta.xDataByKeys[columnKey][xKey]);\n delete result.meta.xDataByKeys[columnKey][xKey];\n });\n const value = annotation.type === 'continuous' ? aggregateNumeric(aggregation.method, values as number[]) : aggregateString(values as string[]);\n result.meta.xDataByKeys[columnKey][xGroupKey] = value;\n });\n });\n }\n // add aggregated values for Y annotations\n if (aggregation.y) {\n additionalDataColumnsY.forEach(columnKey => {\n result.meta.yDataByKeys[columnKey] = {};\n });\n yNewKeys.forEach(yGroupKey => {\n additionalDataColumnsY.forEach(columnKey => {\n const annotation = annotations.find((v) => v.valueColumn.value === columnKey || v.valueColumn.valueLabels === columnKey);\n if (!annotation) {\n return;\n }\n const values: DataValue[] = [];\n yGroups[yGroupKey].forEach((yKey) => {\n values.push(result.meta.yDataByKeys[columnKey][yKey]);\n delete result.meta.yDataByKeys[columnKey][yKey];\n });\n const value = annotation.type === 'continuous' ? aggregateNumeric(aggregation.method, values as number[]) : aggregateString(values as string[]);\n result.meta.yDataByKeys[columnKey][yGroupKey] = value;\n });\n });\n }\n // erase grouping - we aggregated by them and now there is no grouping in the chart;\n // replace axis keys with group keys - now group keys are new axis keys\n if (aggregation.x) {\n result.facets[facetKey].xKeys = Object.keys(xKeysByGroups);\n result.facets[facetKey].xKeysByGroups = { 'null': result.facets[facetKey].xKeys };\n result.meta.xLabels = result.meta.xGroupLabels;\n result.meta.xGroupKeys = ['null'];\n result.meta.xGroupKeyValues = { null: ['null'] };\n }\n if (aggregation.y) {\n result.facets[facetKey].yKeys = Object.keys(yKeysByGroups);\n result.facets[facetKey].yKeysByGroups = { 'null': result.facets[facetKey].yKeys };\n result.meta.yLabels = result.meta.yGroupLabels;\n result.meta.yGroupKeys = ['null'];\n result.meta.yGroupKeyValues = { null: ['null'] };\n }\n });\n result.meta.valueExtent = valueExtent;\n }\n}\n\nfunction updateValueExtent<T extends string>(result: GroupedCellsData<T>, cell: Cell<T>) {\n for (const valueSource of result.meta.valueSources) {\n result.meta.valueExtent[valueSource][0] = Math.min(cell.normalizedValue?.[valueSource] as number, result.meta.valueExtent[valueSource][0]);\n result.meta.valueExtent[valueSource][1] = Math.max(cell.normalizedValue?.[valueSource] as number, result.meta.valueExtent[valueSource][1]);\n }\n\n}\nfunction applyNormalization<T extends string>(\n result: GroupedCellsData<T>,\n normalizationBySources: Record<T, HeatmapSettingsImpl['normalization']>,\n) {\n if (Object.values(normalizationBySources).length) {\n const valueExtent: GroupedCellsData<T>['meta']['valueExtent'] = result.meta.valueSources.reduce((r, key) => {\n if (normalizationBySources[key]) {\n r[key] = [Infinity, -Infinity] as [number, number];\n }\n return r;\n }, {} as GroupedCellsData<T>['meta']['valueExtent']);\n result.meta.facetKeys.forEach(facetKey => {\n const { xKeys, yKeys, cells } = result.facets[facetKey];\n\n for (const valueSource of result.meta.valueSources) {\n const normalization = normalizationBySources[valueSource];\n if (!normalization) {\n continue;\n }\n const cellKeys = normalization.direction === 'row' ? xKeys : yKeys;\n const groupKeys = normalization.direction === 'row' ? yKeys : xKeys;\n const cellGetter = normalization.direction === 'row'\n ? (cellKey: string, groupKey: string) => cells[cellKey]?.[groupKey]\n : (cellKey: string, groupKey: string) => cells[groupKey]?.[cellKey];\n groupKeys.forEach((groupKey) => {\n const values: number[] = [];\n cellKeys.forEach((cellKey) => {\n const v = cellGetter(cellKey, groupKey)?.value?.[valueSource];\n if (v !== undefined) {\n values.push(v as number);\n }\n });\n const normalize = getNormalizationFn(normalization.method, values);\n cellKeys.forEach((cellKey) => {\n const cell = cellGetter(cellKey, groupKey);\n if (cell !== undefined) {\n cell.normalizedValue[valueSource] = normalize(cell.value?.[valueSource] as number);\n valueExtent[valueSource][0] = Math.min(cell.normalizedValue?.[valueSource], valueExtent[valueSource][0]);\n valueExtent[valueSource][1] = Math.max(cell.normalizedValue?.[valueSource], valueExtent[valueSource][1]);\n }\n });\n });\n }\n\n });\n result.meta.valueExtent = {...result.meta.valueExtent, valueExtent};\n }\n}\n\nexport function fillCellsData<T extends string>(\n result: GroupedCellsData<T>,\n data: DataFrame,\n xColumn: ColumnName,\n yColumn: ColumnName,\n valueColumns: Record<string, ColumnName>,\n facetBy: ColumnName[],\n xGroupBy: ColumnName[],\n yGroupBy: ColumnName[],\n annotations: HeatmapSettingsImpl['annotations'],\n dendrogramX: HeatmapSettingsImpl['dendrogramX'],\n dendrogramY: HeatmapSettingsImpl['dendrogramY'],\n normalizationBySource: Record<T, HeatmapSettingsImpl['normalization']>, // separated for color and size for example\n NAValueAs: HeatmapSettingsImpl['NAValueAs'],\n keysOrder: HeatmapSettingsImpl['keysOrder'],\n xAxis: HeatmapSettingsImpl['chartSettings']['xAxis'] | BubbleSettingsImpl['chartSettings']['xAxis'],\n yAxis: HeatmapSettingsImpl['chartSettings']['yAxis'] | BubbleSettingsImpl['chartSettings']['yAxis'],\n aggregation: HeatmapSettingsImpl['aggregation'],\n) {\n const facetKeysLists = facetBy.length\n ? facetBy.map(column => keysOrder[column.value] ?? data.getColumnCategories(column.value))\n : [['null']];\n const xGroupKeysLists = xGroupBy.length\n ? xGroupBy.map(column => keysOrder[column.value] ?? data.getColumnCategories(column.value))\n : [['null']];\n const yGroupKeysLists = yGroupBy.length\n ? yGroupBy.map(column => keysOrder[column.value] ?? data.getColumnCategories(column.value))\n : [['null']];\n const facetKeysCombinations = getKeysCombinations(facetKeysLists);\n const xGroupKeysCombinations = getKeysCombinations(xGroupKeysLists);\n const yGroupKeysCombinations = getKeysCombinations(yGroupKeysLists);\n\n const facetKeys = facetKeysCombinations.map(getFacetOrGroupKey);\n const xGroupKeys = xGroupKeysCombinations.map(getFacetOrGroupKey);\n const yGroupKeys = yGroupKeysCombinations.map(getFacetOrGroupKey);\n\n result.meta.facetKeys = facetKeys;\n result.meta.xGroupKeys = xGroupKeys;\n result.meta.yGroupKeys = yGroupKeys;\n result.meta.facetKeyValues = facetKeys.reduce((res: Record<string, string[]>, key, index) => {\n res[key] = facetKeysCombinations[index];\n return res;\n }, {});\n result.meta.xGroupKeyValues = xGroupKeys.reduce((res: Record<string, string[]>, key, index) => {\n res[key] = xGroupKeysCombinations[index];\n return res;\n }, {});\n result.meta.yGroupKeyValues = yGroupKeys.reduce((res: Record<string, string[]>, key, index) => {\n res[key] = yGroupKeysCombinations[index];\n return res;\n }, {});\n\n const xLabelsSource = xColumn.valueLabels ?? xColumn.value;\n const yLabelsSource = yColumn.valueLabels ?? yColumn.value;\n const annotationColumnsX = annotations.filter(item => item.axis === 'x').map(item => item.valueColumn.valueLabels ?? item.valueColumn.value);\n const annotationColumnsY = annotations.filter(item => item.axis === 'y').map(item => item.valueColumn.valueLabels ?? item.valueColumn.value);\n const dendrogramXColumns = Object.values(dendrogramX ?? {}).map(column => column.value);\n const dendrogramYColumns = Object.values(dendrogramY ?? {}).map(column => column.value);\n const additionalDataColumnsX = lodash.uniq([...annotationColumnsX, ...dendrogramXColumns, xLabelsSource]);\n const additionalDataColumnsY = lodash.uniq([...annotationColumnsY, ...dendrogramYColumns, yLabelsSource]);\n\n for (let i = 0; i < data.rowsCount; i++) {\n const facetKey = getFacetOrGroupKey(facetBy.map(column => data.getColumnValue(column.value, i)));\n const xGroupKey = getFacetOrGroupKey(xGroupBy.map(column => data.getColumnValue(column.value, i)));\n const yGroupKey = getFacetOrGroupKey(yGroupBy.map(column => data.getColumnValue(column.value, i)));\n const xGroupLabel = xGroupBy.map(column => data.getColumnValue(column.valueLabels ?? column.value, i)).join(', ');\n const yGroupLabel = yGroupBy.map(column => data.getColumnValue(column.valueLabels ?? column.value, i)).join(', ');\n result.meta.xGroupLabels[xGroupKey] = xGroupLabel;\n result.meta.yGroupLabels[yGroupKey] = yGroupLabel;\n const x = String(data.getColumnValue(xColumn.value, i));\n const y = String(data.getColumnValue(yColumn.value, i));\n\n const values = result.meta.valueSources.reduce((r, key) => {\n r[key] = (data.getColumnValue(valueColumns[key].value, i) ?? NAValueAs) as number | null;\n return r;\n }, {} as Record<string, DataValue>);\n\n if (x === 'null' || y === 'null' || Object.values(values).every(v => v === null)) {\n continue;\n }\n\n if (!result.facets[facetKey]) {\n result.facets[facetKey] = {\n xKeys: [],\n yKeys: [],\n xKeysByGroups: {},\n yKeysByGroups: {},\n cells: {},\n };\n }\n if (!result.facets[facetKey].xKeysByGroups[xGroupKey]) {\n result.facets[facetKey].xKeysByGroups[xGroupKey] = [];\n }\n if (!result.facets[facetKey].yKeysByGroups[yGroupKey]) {\n result.facets[facetKey].yKeysByGroups[yGroupKey] = [];\n }\n result.facets[facetKey].xKeys.push(x);\n result.facets[facetKey].yKeys.push(y);\n result.facets[facetKey].xKeysByGroups[xGroupKey].push(x);\n result.facets[facetKey].yKeysByGroups[yGroupKey].push(y);\n\n if (!result.facets[facetKey].cells[x]) {\n result.facets[facetKey].cells[x] = {};\n }\n\n for (const valueSource of result.meta.valueSources) {\n if (result.facets[facetKey].cells[x][y] && result.facets[facetKey].cells[x][y].value[valueSource] !== values[valueSource]) {\n throw Error(`More than 1 value for x=${x}, y=${y}`);\n }\n }\n\n const xLabelsSourceValue = data.getColumnValue(xLabelsSource, i);\n if (result.meta.xLabels[x] && String(xLabelsSourceValue) !== result.meta.xLabels[x]) {\n throw Error(`More than 1 x-label value for x=${x}`);\n }\n const yLabelsSourceValue = data.getColumnValue(yLabelsSource, i);\n if (result.meta.yLabels[y] && String(yLabelsSourceValue) !== result.meta.yLabels[y]) {\n throw Error(`More than 1 y-label value for y=${y}`);\n }\n result.meta.xLabels[x] = String(xLabelsSourceValue);\n result.meta.yLabels[y] = String(yLabelsSourceValue);\n // data for labels, annotations and dendrograms by X\n additionalDataColumnsX.forEach(columnKey => {\n const isAddedColumn = typeof result.meta.xDataByKeys[columnKey] !== 'undefined';\n const isAddedValue = isAddedColumn && typeof result.meta.xDataByKeys[columnKey][x] !== 'undefined';\n if (!isAddedColumn) {\n result.meta.xDataByKeys[columnKey] = {};\n }\n if (isAddedValue && result.meta.xDataByKeys[columnKey][x] !== data.getColumnValue(columnKey, i)) {\n throw Error(`More than 1 value for x = ${x} and column = ${columnKey}`);\n }\n if (!isAddedValue) {\n result.meta.xDataByKeys[columnKey][x] = data.getColumnValue(columnKey, i);\n }\n });\n // data for labels, annotations and dendrograms by Y\n additionalDataColumnsY.forEach(columnKey => {\n const isAddedColumn = typeof result.meta.yDataByKeys[columnKey] !== 'undefined';\n const isAddedValue = isAddedColumn && typeof result.meta.yDataByKeys[columnKey][y] !== 'undefined';\n if (!isAddedColumn) {\n result.meta.yDataByKeys[columnKey] = {};\n }\n if (isAddedValue && result.meta.yDataByKeys[columnKey][y] !== data.getColumnValue(columnKey, i)) {\n throw Error(`More than 1 value for y = ${y} and column = ${columnKey}`);\n }\n if (!isAddedValue) {\n result.meta.yDataByKeys[columnKey][y] = data.getColumnValue(columnKey, i);\n }\n });\n result.facets[facetKey].cells[x][y] = {\n isCell: true,\n idx: i,\n id: `${x}_${y}`,\n x,\n y,\n value: values,\n normalizedValue: values,\n };\n\n updateValueExtent(result, result.facets[facetKey].cells[x][y]);\n }\n\n result.meta.facetKeys = result.meta.facetKeys.filter((key) => result.facets[key]); // filter only used;\n\n // make uniq x, y, x-group and y-group keys\n result.meta.facetKeys.forEach(facetKey => {\n const facet = result.facets[facetKey];\n const uniqueXKeys = lodash.uniq(facet.xKeys);\n const uniqueYKeys = lodash.uniq(facet.yKeys);\n facet.xKeys = keysOrder[xColumn.value] ? lodash.intersection(keysOrder[xColumn.value], uniqueXKeys) : uniqueXKeys;\n facet.yKeys = keysOrder[yColumn.value] ? lodash.intersection(keysOrder[yColumn.value], uniqueYKeys) : uniqueYKeys;\n xGroupKeys.forEach(xGroupKey => {\n result.facets[facetKey].xKeysByGroups[xGroupKey] = lodash.intersection(\n facet.xKeys,\n result.facets[facetKey].xKeysByGroups[xGroupKey]\n );\n });\n yGroupKeys.forEach(yGroupKey => {\n result.facets[facetKey].yKeysByGroups[yGroupKey] = lodash.intersection(\n facet.yKeys,\n result.facets[facetKey].yKeysByGroups[yGroupKey]\n );\n });\n });\n\n applyAggregation(result, aggregation, additionalDataColumnsX, additionalDataColumnsY, annotations);\n applyNormalization(result, normalizationBySource);\n\n // every facet may contain not all of available keys, but for shared axes it is necessary to have all of them\n result.meta.xKeysByGroups = result.meta.xGroupKeys.reduce((res: Record<string, string[]>, xGroupKey) => {\n const existingXKeys = sortByLabels(lodash.uniq(\n lodash.flatten(result.meta.facetKeys.map(facetKey => result.facets[facetKey].xKeysByGroups[xGroupKey]))\n ), xAxis.sorting, result.meta.xLabels);\n res[xGroupKey] = keysOrder[xColumn.value] ? lodash.intersection(keysOrder[xColumn.value], existingXKeys) : existingXKeys;\n return res;\n }, {});\n result.meta.xKeys = result.meta.xGroupKeys.reduce((res: string[], xGroupKey: string) => {\n res = res.concat(result.meta.xKeysByGroups[xGroupKey]);\n return res;\n }, []);\n\n result.meta.yKeysByGroups = result.meta.yGroupKeys.reduce((res: Record<string, string[]>, yGroupKey) => {\n const existingYKeys = sortByLabels(lodash.uniq(\n lodash.flatten(result.meta.facetKeys.map(facetKey => result.facets[facetKey].yKeysByGroups[yGroupKey]))\n ), yAxis.sorting, result.meta.yLabels);\n res[yGroupKey] = keysOrder[yColumn.value] ? lodash.intersection(keysOrder[yColumn.value], existingYKeys) : existingYKeys;\n return res;\n }, {});\n result.meta.yKeys = result.meta.yGroupKeys.reduce((res: string[], yGroupKey: string) => {\n res = res.concat(result.meta.yKeysByGroups[yGroupKey]);\n return res;\n }, []);\n\n for (const valueSource of result.meta.valueSources) {\n // avoid render errors on empty data\n if (result.meta.valueExtent[valueSource][0] === Infinity) {\n result.meta.valueExtent[valueSource][0] = 0;\n }\n if (result.meta.valueExtent[valueSource][1] === -Infinity) {\n result.meta.valueExtent[valueSource][1] = 0;\n }\n }\n\n return result;\n}"],"names":["normalizeByStd","values","stdValue","deviation","meanValue","mean","v","normalizeByMinMax","min","max","extent","getNormalizationFn","method","aggregateNumeric","res","valuesSorted","a","b","quantileSorted","sum","exhaustive","aggregateString","list","getKeysCombinations","keysLists","result","keys","nextResult","key","resultItem","sortByLabels","arr","direction","labels","applyAggregation","aggregation","additionalDataColumnsX","additionalDataColumnsY","annotations","valueExtent","r","facetKey","xKeys","yKeys","cells","xKeysByGroups","yKeysByGroups","xGroups","xKey","yGroups","yKey","xNewKeys","yNewKeys","xGroupKey","yGroupKey","valuesBySources","valueSource","cellValue","_c","_b","_a","_d","value","cell","columnKey","annotation","updateValueExtent","applyNormalization","normalizationBySources","normalization","cellKeys","groupKeys","cellGetter","cellKey","groupKey","normalize","fillCellsData","data","xColumn","yColumn","valueColumns","facetBy","xGroupBy","yGroupBy","dendrogramX","dendrogramY","normalizationBySource","NAValueAs","keysOrder","xAxis","yAxis","facetKeysLists","column","xGroupKeysLists","yGroupKeysLists","facetKeysCombinations","xGroupKeysCombinations","yGroupKeysCombinations","facetKeys","getFacetOrGroupKey","xGroupKeys","yGroupKeys","index","xLabelsSource","yLabelsSource","annotationColumnsX","item","annotationColumnsY","dendrogramXColumns","dendrogramYColumns","lodash","i","xGroupLabel","yGroupLabel","x","y","xLabelsSourceValue","yLabelsSourceValue","isAddedColumn","isAddedValue","facet","uniqueXKeys","uniqueYKeys","existingXKeys","existingYKeys"],"mappings":"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"}