@milaboratories/miplots4 1.1.0 → 1.2.1

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 (181) hide show
  1. package/dist/MiPlots.d.ts.map +1 -1
  2. package/dist/MiPlots.js +16 -14
  3. package/dist/MiPlots.js.map +1 -1
  4. package/dist/bubble/BubbleSettingsImpl.d.ts +3 -0
  5. package/dist/bubble/BubbleSettingsImpl.d.ts.map +1 -1
  6. package/dist/bubble/BubbleSettingsImpl.js +4 -1
  7. package/dist/bubble/BubbleSettingsImpl.js.map +1 -1
  8. package/dist/bubble/ChartRenderer.d.ts +2 -12
  9. package/dist/bubble/ChartRenderer.d.ts.map +1 -1
  10. package/dist/bubble/ChartRenderer.js +13 -13
  11. package/dist/bubble/ChartRenderer.js.map +1 -1
  12. package/dist/bubble/getGroupedCellsData.d.ts +1 -1
  13. package/dist/bubble/getGroupedCellsData.d.ts.map +1 -1
  14. package/dist/bubble/getGroupedCellsData.js +20 -14
  15. package/dist/bubble/getGroupedCellsData.js.map +1 -1
  16. package/dist/bubble/index.d.ts.map +1 -1
  17. package/dist/bubble/index.js +6 -10
  18. package/dist/bubble/index.js.map +1 -1
  19. package/dist/common/ContinuousAxis.d.ts +3 -1
  20. package/dist/common/ContinuousAxis.d.ts.map +1 -1
  21. package/dist/common/ContinuousAxis.js +8 -8
  22. package/dist/common/ContinuousAxis.js.map +1 -1
  23. package/dist/common/Legend.d.ts +12 -1
  24. package/dist/common/Legend.d.ts.map +1 -1
  25. package/dist/common/Legend.js +14 -6
  26. package/dist/common/Legend.js.map +1 -1
  27. package/dist/heatmap/ChartRenderer.d.ts +2 -12
  28. package/dist/heatmap/ChartRenderer.d.ts.map +1 -1
  29. package/dist/heatmap/ChartRenderer.js +26 -26
  30. package/dist/heatmap/ChartRenderer.js.map +1 -1
  31. package/dist/heatmap/HeatmapSettingsImpl.d.ts +3 -0
  32. package/dist/heatmap/HeatmapSettingsImpl.d.ts.map +1 -1
  33. package/dist/heatmap/HeatmapSettingsImpl.js +5 -2
  34. package/dist/heatmap/HeatmapSettingsImpl.js.map +1 -1
  35. package/dist/heatmap/fillCellsData.d.ts +6 -1
  36. package/dist/heatmap/fillCellsData.d.ts.map +1 -1
  37. package/dist/heatmap/fillCellsData.js +135 -96
  38. package/dist/heatmap/fillCellsData.js.map +1 -1
  39. package/dist/heatmap/getCells.d.ts +4 -1
  40. package/dist/heatmap/getCells.d.ts.map +1 -1
  41. package/dist/heatmap/getCells.js +19 -16
  42. package/dist/heatmap/getCells.js.map +1 -1
  43. package/dist/heatmap/index.d.ts.map +1 -1
  44. package/dist/heatmap/index.js +32 -34
  45. package/dist/heatmap/index.js.map +1 -1
  46. package/dist/index.d.ts +2 -2
  47. package/dist/index.d.ts.map +1 -1
  48. package/dist/selection/ChartRenderer.d.ts +90 -0
  49. package/dist/selection/ChartRenderer.d.ts.map +1 -0
  50. package/dist/selection/ChartRenderer.js +254 -0
  51. package/dist/selection/ChartRenderer.js.map +1 -0
  52. package/dist/selection/SelectionSettingsImpl.d.ts +53 -0
  53. package/dist/selection/SelectionSettingsImpl.d.ts.map +1 -0
  54. package/dist/selection/SelectionSettingsImpl.js +47 -0
  55. package/dist/selection/SelectionSettingsImpl.js.map +1 -0
  56. package/dist/selection/components/Chart/Bars/GroupSelectedBars.d.ts +8 -0
  57. package/dist/selection/components/Chart/Bars/GroupSelectedBars.d.ts.map +1 -0
  58. package/dist/selection/components/Chart/Bars/GroupSelectedBars.js +57 -0
  59. package/dist/selection/components/Chart/Bars/GroupSelectedBars.js.map +1 -0
  60. package/dist/selection/components/Chart/Bars/StackedBars.d.ts +12 -0
  61. package/dist/selection/components/Chart/Bars/StackedBars.d.ts.map +1 -0
  62. package/dist/selection/components/Chart/Bars/StackedBars.js +58 -0
  63. package/dist/selection/components/Chart/Bars/StackedBars.js.map +1 -0
  64. package/dist/selection/components/Chart/Bars/UngroupedBars.d.ts +6 -0
  65. package/dist/selection/components/Chart/Bars/UngroupedBars.d.ts.map +1 -0
  66. package/dist/selection/components/Chart/Bars/UngroupedBars.js +38 -0
  67. package/dist/selection/components/Chart/Bars/UngroupedBars.js.map +1 -0
  68. package/dist/selection/components/Chart/Bars.d.ts +10 -0
  69. package/dist/selection/components/Chart/Bars.d.ts.map +1 -0
  70. package/dist/selection/components/Chart/Bars.js +48 -0
  71. package/dist/selection/components/Chart/Bars.js.map +1 -0
  72. package/dist/selection/components/Chart/ChartAxes.d.ts +7 -0
  73. package/dist/selection/components/Chart/ChartAxes.d.ts.map +1 -0
  74. package/dist/selection/components/Chart/ChartAxes.js +51 -0
  75. package/dist/selection/components/Chart/ChartAxes.js.map +1 -0
  76. package/dist/selection/components/Chart/ChartFrame.d.ts +9 -0
  77. package/dist/selection/components/Chart/ChartFrame.d.ts.map +1 -0
  78. package/dist/selection/components/Chart/ChartFrame.js +41 -0
  79. package/dist/selection/components/Chart/ChartFrame.js.map +1 -0
  80. package/dist/selection/components/Chart/Dividers.d.ts +8 -0
  81. package/dist/selection/components/Chart/Dividers.d.ts.map +1 -0
  82. package/dist/selection/components/Chart/Dividers.js +27 -0
  83. package/dist/selection/components/Chart/Dividers.js.map +1 -0
  84. package/dist/selection/components/Chart/Gridlines.d.ts +10 -0
  85. package/dist/selection/components/Chart/Gridlines.d.ts.map +1 -0
  86. package/dist/selection/components/Chart/Gridlines.js +32 -0
  87. package/dist/selection/components/Chart/Gridlines.js.map +1 -0
  88. package/dist/selection/components/Chart/Ribbons/GroupFlowRibbon.d.ts +9 -0
  89. package/dist/selection/components/Chart/Ribbons/GroupFlowRibbon.d.ts.map +1 -0
  90. package/dist/selection/components/Chart/Ribbons/GroupFlowRibbon.js +36 -0
  91. package/dist/selection/components/Chart/Ribbons/GroupFlowRibbon.js.map +1 -0
  92. package/dist/selection/components/Chart/Ribbons/MultiGroupRibbon.d.ts +6 -0
  93. package/dist/selection/components/Chart/Ribbons/MultiGroupRibbon.d.ts.map +1 -0
  94. package/dist/selection/components/Chart/Ribbons/MultiGroupRibbon.js +22 -0
  95. package/dist/selection/components/Chart/Ribbons/MultiGroupRibbon.js.map +1 -0
  96. package/dist/selection/components/Chart/Ribbons/SimpleRibbon.d.ts +10 -0
  97. package/dist/selection/components/Chart/Ribbons/SimpleRibbon.d.ts.map +1 -0
  98. package/dist/selection/components/Chart/Ribbons/SimpleRibbon.js +33 -0
  99. package/dist/selection/components/Chart/Ribbons/SimpleRibbon.js.map +1 -0
  100. package/dist/selection/components/Chart/Ribbons/StackedGroupFlowRibbon.d.ts +10 -0
  101. package/dist/selection/components/Chart/Ribbons/StackedGroupFlowRibbon.d.ts.map +1 -0
  102. package/dist/selection/components/Chart/Ribbons/StackedGroupFlowRibbon.js +65 -0
  103. package/dist/selection/components/Chart/Ribbons/StackedGroupFlowRibbon.js.map +1 -0
  104. package/dist/selection/components/Chart/Ribbons/ribbonPath.d.ts +10 -0
  105. package/dist/selection/components/Chart/Ribbons/ribbonPath.d.ts.map +1 -0
  106. package/dist/selection/components/Chart/Ribbons/ribbonPath.js +13 -0
  107. package/dist/selection/components/Chart/Ribbons/ribbonPath.js.map +1 -0
  108. package/dist/selection/components/Chart/Ribbons.d.ts +9 -0
  109. package/dist/selection/components/Chart/Ribbons.d.ts.map +1 -0
  110. package/dist/selection/components/Chart/Ribbons.js +58 -0
  111. package/dist/selection/components/Chart/Ribbons.js.map +1 -0
  112. package/dist/selection/components/Chart/StageCounts.d.ts +7 -0
  113. package/dist/selection/components/Chart/StageCounts.d.ts.map +1 -0
  114. package/dist/selection/components/Chart/StageCounts.js +20 -0
  115. package/dist/selection/components/Chart/StageCounts.js.map +1 -0
  116. package/dist/selection/components/Chart/types.d.ts +132 -0
  117. package/dist/selection/components/Chart/types.d.ts.map +1 -0
  118. package/dist/selection/components/Chart.d.ts +22 -0
  119. package/dist/selection/components/Chart.d.ts.map +1 -0
  120. package/dist/selection/components/Chart.js +97 -0
  121. package/dist/selection/components/Chart.js.map +1 -0
  122. package/dist/selection/components/ChartsGroup.d.ts +18 -0
  123. package/dist/selection/components/ChartsGroup.d.ts.map +1 -0
  124. package/dist/selection/components/ChartsGroup.js +181 -0
  125. package/dist/selection/components/ChartsGroup.js.map +1 -0
  126. package/dist/selection/components/FacetCell.d.ts +22 -0
  127. package/dist/selection/components/FacetCell.d.ts.map +1 -0
  128. package/dist/selection/components/FacetCell.js +18 -0
  129. package/dist/selection/components/FacetCell.js.map +1 -0
  130. package/dist/selection/components/types.d.ts +58 -0
  131. package/dist/selection/components/types.d.ts.map +1 -0
  132. package/dist/selection/constants.d.ts +25 -0
  133. package/dist/selection/constants.d.ts.map +1 -0
  134. package/dist/selection/constants.js +4 -0
  135. package/dist/selection/constants.js.map +1 -0
  136. package/dist/selection/createSelectionData.d.ts +50 -0
  137. package/dist/selection/createSelectionData.d.ts.map +1 -0
  138. package/dist/selection/createSelectionData.js +92 -0
  139. package/dist/selection/createSelectionData.js.map +1 -0
  140. package/dist/selection/index.d.ts +26 -0
  141. package/dist/selection/index.d.ts.map +1 -0
  142. package/dist/selection/index.js +96 -0
  143. package/dist/selection/index.js.map +1 -0
  144. package/dist/selection/utils.d.ts +4 -0
  145. package/dist/selection/utils.d.ts.map +1 -0
  146. package/dist/selection/utils.js +13 -0
  147. package/dist/selection/utils.js.map +1 -0
  148. package/dist/types/bubble.d.ts +131 -0
  149. package/dist/types/bubble.d.ts.map +1 -1
  150. package/dist/types/bubble.js +3 -0
  151. package/dist/types/bubble.js.map +1 -1
  152. package/dist/types/common.d.ts +38 -0
  153. package/dist/types/common.d.ts.map +1 -1
  154. package/dist/types/common.js +1 -0
  155. package/dist/types/common.js.map +1 -1
  156. package/dist/types/dendro.d.ts +103 -0
  157. package/dist/types/dendro.d.ts.map +1 -1
  158. package/dist/types/discrete.d.ts +167 -0
  159. package/dist/types/discrete.d.ts.map +1 -1
  160. package/dist/types/heatmap.d.ts +248 -0
  161. package/dist/types/heatmap.d.ts.map +1 -1
  162. package/dist/types/heatmap.js +3 -0
  163. package/dist/types/heatmap.js.map +1 -1
  164. package/dist/types/histogram.d.ts +22 -0
  165. package/dist/types/histogram.d.ts.map +1 -1
  166. package/dist/types/index.d.ts +3 -1
  167. package/dist/types/index.d.ts.map +1 -1
  168. package/dist/types/index.js +1 -0
  169. package/dist/types/scatterplot-umap.d.ts +188 -0
  170. package/dist/types/scatterplot-umap.d.ts.map +1 -1
  171. package/dist/types/scatterplot.d.ts +270 -0
  172. package/dist/types/scatterplot.d.ts.map +1 -1
  173. package/dist/types/selection.d.ts +452 -0
  174. package/dist/types/selection.d.ts.map +1 -0
  175. package/dist/types/selection.js +53 -0
  176. package/dist/types/selection.js.map +1 -0
  177. package/dist/utils/intersect.d.ts +2 -0
  178. package/dist/utils/intersect.d.ts.map +1 -0
  179. package/dist/utils/intersect.js +8 -0
  180. package/dist/utils/intersect.js.map +1 -0
  181. package/package.json +2 -2
@@ -2,7 +2,7 @@ import { exhaustive as e } from "../utils/index.js";
2
2
  import { getFacetStringKey as t } from "../discrete/utils/getFacetStringKey.js";
3
3
  import { getFacetLabels as n } from "../discrete/utils/getFacetLabels.js";
4
4
  import { getFacetOrGroupKey as r } from "../utils/getFacetOrGroupKey.js";
5
- import i from "lodash";
5
+ import { intersect as i } from "../utils/intersect.js";
6
6
  import { deviation as a, extent as o, mean as s, quantileSorted as c, sum as l } from "d3-array";
7
7
  function u(e) {
8
8
  let t = a(e), n = s(e);
@@ -40,30 +40,49 @@ function m(e) {
40
40
  function h(e) {
41
41
  if (!e.length) return [];
42
42
  let t = [[]];
43
- return e.forEach((e) => {
44
- let n = [];
45
- e.forEach((e) => {
46
- n.push(...t.map((t) => [...t, e]));
47
- }), t = n;
48
- }), t;
43
+ for (let n of e) {
44
+ let e = [];
45
+ for (let r of n) e.push(...t.map((e) => [...e, r]));
46
+ t = e;
47
+ }
48
+ return t;
49
+ }
50
+ var g = (e, t, n = {}) => {
51
+ let r = t === "asc" ? 1 : -1;
52
+ return e.sort((e, t) => r * (n[e] ?? e).localeCompare(n[t] ?? t, "en", { numeric: !0 }));
53
+ };
54
+ function _(e) {
55
+ return !!(e == null || typeof e == "number" && Number.isNaN(e));
56
+ }
57
+ function v(e, t, n) {
58
+ let r = _(e), i = _(t);
59
+ if (r && i) return 0;
60
+ if (r) return 1;
61
+ if (i) return -1;
62
+ let a = n === "asc" ? 1 : -1;
63
+ return typeof e == "number" && typeof t == "number" ? a * (e < t ? -1 : e > t ? 1 : 0) : a * String(e).localeCompare(String(t), "en", { numeric: !0 });
49
64
  }
50
- var g = (e, t, n = {}) => e.sort((e, r) => t === "asc" ? (n[e] ?? e).localeCompare(n[r] ?? r, "en", { numeric: !0 }) : (n[r] ?? r).localeCompare(n[e] ?? e, "en", { numeric: !0 }));
51
- function _(e, t, n, r, i) {
65
+ const y = (e, t, n, r) => e.sort((e, i) => {
66
+ for (let a of n) {
67
+ let n = v(r[a.value]?.[e], r[a.value]?.[i], t);
68
+ if (n !== 0) return n;
69
+ }
70
+ return 0;
71
+ });
72
+ function b(e, t, n, r, i) {
52
73
  if (t.x || t.y) {
53
74
  let a = e.meta.valueSources.reduce((e, t) => (e[t] = [Infinity, -Infinity], e), {});
54
- e.meta.facetKeys.forEach((o) => {
75
+ for (let o of e.meta.facetKeys) {
55
76
  let { xKeys: s, yKeys: c, cells: l, xKeysByGroups: u, yKeysByGroups: d } = e.facets[o], f = t.x ? u : s.reduce((e, t) => (e[t] = [t], e), {}), h = t.y ? d : c.reduce((e, t) => (e[t] = [t], e), {}), g = Object.keys(f), _ = Object.keys(h);
56
77
  for (let n of g) for (let r of _) {
57
78
  let i = e.meta.valueSources.reduce((e, t) => (e[t] = [], e), {});
58
- f[n].forEach((t) => {
59
- h[r].forEach((n) => {
60
- for (let r of e.meta.valueSources) {
61
- let e = l[t]?.[n]?.value?.[r];
62
- e !== void 0 && i[r].push(e);
63
- }
64
- delete l[t]?.[n];
65
- });
66
- });
79
+ for (let t of f[n]) for (let n of h[r]) {
80
+ for (let r of e.meta.valueSources) {
81
+ let e = l[t]?.[n]?.value?.[r];
82
+ e !== void 0 && i[r].push(e);
83
+ }
84
+ delete l[t]?.[n];
85
+ }
67
86
  for (let s of e.meta.valueSources) {
68
87
  let c = i[s];
69
88
  if (c.length > 0) {
@@ -82,117 +101,125 @@ function _(e, t, n, r, i) {
82
101
  }
83
102
  }
84
103
  }
85
- t.x && g.forEach((r) => {
86
- n.forEach((n) => {
87
- let a = i.find((e) => e.valueColumn.value === n || e.valueColumn.valueLabels === n);
88
- if (!a) return;
89
- let o = [];
90
- f[r].forEach((t) => {
91
- o.push(e.meta.xDataByKeys[n][t]), delete e.meta.xDataByKeys[n][t];
92
- });
93
- let s = a.type === "continuous" ? p(t.method, o) : m(o);
94
- e.meta.xDataByKeys[n][r] = s;
95
- });
96
- }), t.y && (r.forEach((t) => {
97
- e.meta.yDataByKeys[t] = {};
98
- }), _.forEach((n) => {
99
- r.forEach((r) => {
100
- let a = i.find((e) => e.valueColumn.value === r || e.valueColumn.valueLabels === r);
101
- if (!a) return;
104
+ if (t.x) for (let r of g) for (let a of n) {
105
+ let n = i.find((e) => e.valueColumn.value === a || e.valueColumn.valueLabels === a);
106
+ if (!n) continue;
107
+ let o = [];
108
+ for (let t of f[r]) o.push(e.meta.xDataByKeys[a][t]), delete e.meta.xDataByKeys[a][t];
109
+ let s = n.type === "continuous" ? p(t.method, o) : m(o);
110
+ e.meta.xDataByKeys[a][r] = s;
111
+ }
112
+ if (t.y) {
113
+ for (let t of r) e.meta.yDataByKeys[t] = {};
114
+ for (let n of _) for (let a of r) {
115
+ let r = i.find((e) => e.valueColumn.value === a || e.valueColumn.valueLabels === a);
116
+ if (!r) continue;
102
117
  let o = [];
103
- h[n].forEach((t) => {
104
- o.push(e.meta.yDataByKeys[r][t]), delete e.meta.yDataByKeys[r][t];
105
- });
106
- let s = a.type === "continuous" ? p(t.method, o) : m(o);
107
- e.meta.yDataByKeys[r][n] = s;
108
- });
109
- })), t.x && (e.facets[o].xKeys = Object.keys(u), e.facets[o].xKeysByGroups = { null: e.facets[o].xKeys }, e.meta.xLabels = e.meta.xGroupLabels, e.meta.xGroupKeys = ["null"], e.meta.xGroupKeyValues = { null: ["null"] }), t.y && (e.facets[o].yKeys = Object.keys(d), e.facets[o].yKeysByGroups = { null: e.facets[o].yKeys }, e.meta.yLabels = e.meta.yGroupLabels, e.meta.yGroupKeys = ["null"], e.meta.yGroupKeyValues = { null: ["null"] });
110
- }), e.meta.valueExtent = a;
118
+ for (let t of h[n]) o.push(e.meta.yDataByKeys[a][t]), delete e.meta.yDataByKeys[a][t];
119
+ let s = r.type === "continuous" ? p(t.method, o) : m(o);
120
+ e.meta.yDataByKeys[a][n] = s;
121
+ }
122
+ }
123
+ t.x && (e.facets[o].xKeys = Object.keys(u), e.facets[o].xKeysByGroups = { null: e.facets[o].xKeys }, e.meta.xLabels = e.meta.xGroupLabels, e.meta.xGroupKeys = ["null"], e.meta.xGroupKeyValues = { null: ["null"] }), t.y && (e.facets[o].yKeys = Object.keys(d), e.facets[o].yKeysByGroups = { null: e.facets[o].yKeys }, e.meta.yLabels = e.meta.yGroupLabels, e.meta.yGroupKeys = ["null"], e.meta.yGroupKeyValues = { null: ["null"] });
124
+ }
125
+ e.meta.valueExtent = a;
111
126
  }
112
127
  }
113
- function v(e, t) {
128
+ function x(e, t) {
114
129
  for (let n of e.meta.valueSources) e.meta.valueExtent[n][0] = Math.min(t.normalizedValue?.[n], e.meta.valueExtent[n][0]), e.meta.valueExtent[n][1] = Math.max(t.normalizedValue?.[n], e.meta.valueExtent[n][1]);
115
130
  }
116
- function y(e, t) {
131
+ function S(e, t) {
117
132
  if (Object.values(t).length) {
118
133
  let n = e.meta.valueSources.reduce((e, n) => (t[n] && (e[n] = [Infinity, -Infinity]), e), {});
119
- e.meta.facetKeys.forEach((r) => {
134
+ for (let r of e.meta.facetKeys) {
120
135
  let { xKeys: i, yKeys: a, cells: o } = e.facets[r];
121
136
  for (let r of e.meta.valueSources) {
122
137
  let e = t[r];
123
138
  if (!e) continue;
124
139
  let s = e.direction === "row" ? i : a, c = e.direction === "row" ? a : i, l = e.direction === "row" ? (e, t) => o[e]?.[t] : (e, t) => o[t]?.[e];
125
- c.forEach((t) => {
140
+ for (let t of c) {
126
141
  let i = [];
127
- s.forEach((e) => {
142
+ for (let e of s) {
128
143
  let n = l(e, t)?.value?.[r];
129
144
  n !== void 0 && i.push(n);
130
- });
145
+ }
131
146
  let a = f(e.method, i);
132
- s.forEach((e) => {
147
+ for (let e of s) {
133
148
  let i = l(e, t);
134
149
  i !== void 0 && (i.normalizedValue[r] = a(i.value?.[r]), n[r][0] = Math.min(i.normalizedValue?.[r], n[r][0]), n[r][1] = Math.max(i.normalizedValue?.[r], n[r][1]));
135
- });
136
- });
150
+ }
151
+ }
137
152
  }
138
- }), e.meta.valueExtent = {
153
+ }
154
+ e.meta.valueExtent = {
139
155
  ...e.meta.valueExtent,
140
156
  valueExtent: n
141
157
  };
142
158
  }
143
159
  }
144
- function b(e, { data: a, xColumn: o, yColumn: s, valueColumns: c, facetBy: l, xGroupBy: u, yGroupBy: d, facetSettings: f, annotations: p, dendrogramX: m, dendrogramY: b, normalizationBySource: x, NAValueAs: S, keysOrder: C, xAxis: w, yAxis: T, aggregation: E, showEmptyRows: D = !1, showEmptyColumns: O = !1 }) {
145
- let k = l.length ? l.map((e) => C[e.value] ?? a.getColumnCategories(e.value)) : [["null"]], A = u.length ? u.map((e) => C[e.value] ?? a.getColumnCategories(e.value)) : [["null"]], j = d.length ? d.map((e) => C[e.value] ?? a.getColumnCategories(e.value)) : [["null"]], M = h(k), N = h(A), P = h(j);
146
- f?.order?.length && (M = M.filter((e) => f.order?.includes(t(e))));
147
- let F = M.map(r), I = new Set(F), L = N.map(r), R = P.map(r);
148
- e.meta.facetKeys = F, e.meta.xGroupKeys = L, e.meta.yGroupKeys = R;
149
- let z = n(a, l, F, M);
150
- e.meta.facetKeyValues = F.reduce((e, t) => (e[t] = z[t], e), {}), e.meta.xGroupKeyValues = L.reduce((e, t, n) => (e[t] = N[n], e), {}), e.meta.yGroupKeyValues = R.reduce((e, t, n) => (e[t] = P[n], e), {});
151
- let B = o.valueLabels ?? o.value, V = s.valueLabels ?? s.value, H = p.filter((e) => e.axis === "x").map((e) => e.valueColumn.valueLabels ?? e.valueColumn.value), U = p.filter((e) => e.axis === "y").map((e) => e.valueColumn.valueLabels ?? e.valueColumn.value), W = Object.values(m ?? {}).map((e) => e.value), G = Object.values(b ?? {}).map((e) => e.value), K = i.uniq([
152
- ...H,
160
+ function C(e, { data: a, xColumn: o, yColumn: s, valueColumns: c, facetBy: l, xGroupBy: u, yGroupBy: d, facetSettings: f, annotations: p, dendrogramX: m, dendrogramY: _, normalizationBySource: v, NAValueAs: C, transformBySource: w, keysOrder: T, xAxis: E, yAxis: D, xSortBy: O, ySortBy: k, aggregation: A, showEmptyRows: j = !1, showEmptyColumns: M = !1 }) {
161
+ let N = l.length ? l.map((e) => T[e.value] ?? a.getColumnCategories(e.value)) : [["null"]], ee = u.length ? u.map((e) => T[e.value] ?? a.getColumnCategories(e.value)) : [["null"]], te = d.length ? d.map((e) => T[e.value] ?? a.getColumnCategories(e.value)) : [["null"]], P = h(N), F = h(ee), I = h(te);
162
+ f?.order?.length && (P = P.filter((e) => f.order?.includes(t(e))));
163
+ let L = P.map(r), R = new Set(L), z = F.map(r), B = I.map(r);
164
+ e.meta.facetKeys = L, e.meta.xGroupKeys = z, e.meta.yGroupKeys = B;
165
+ let V = n(a, l, L, P);
166
+ e.meta.facetKeyValues = L.reduce((e, t) => (e[t] = V[t], e), {}), e.meta.xGroupKeyValues = z.reduce((e, t, n) => (e[t] = F[n], e), {}), e.meta.yGroupKeyValues = B.reduce((e, t, n) => (e[t] = I[n], e), {});
167
+ let H = o.valueLabels ?? o.value, U = s.valueLabels ?? s.value, W = p.filter((e) => e.axis === "x").map((e) => e.valueColumn.valueLabels ?? e.valueColumn.value), G = p.filter((e) => e.axis === "y").map((e) => e.valueColumn.valueLabels ?? e.valueColumn.value), K = Object.values(m ?? {}).map((e) => e.value), q = Object.values(_ ?? {}).map((e) => e.value), J = (O ?? []).map((e) => e.value), Y = (k ?? []).map((e) => e.value), X = [...new Set([
153
168
  ...W,
154
- B
155
- ]), q = i.uniq([
156
- ...U,
169
+ ...K,
170
+ ...J,
171
+ H
172
+ ])], Z = [...new Set([
157
173
  ...G,
158
- V
159
- ]);
174
+ ...q,
175
+ ...Y,
176
+ U
177
+ ])];
160
178
  for (let t = 0; t < a.rowsCount; t++) {
161
179
  let n = r(l.map((e) => a.getColumnValue(e.value, t)));
162
- if (!I.has(n)) continue;
180
+ if (!R.has(n)) continue;
163
181
  let i = r(u.map((e) => a.getColumnValue(e.value, t))), f = r(d.map((e) => a.getColumnValue(e.value, t))), p = u.map((e) => a.getColumnValue(e.valueLabels ?? e.value, t)).join(", "), m = d.map((e) => a.getColumnValue(e.valueLabels ?? e.value, t)).join(", ");
164
182
  e.meta.xGroupLabels[i] = p, e.meta.yGroupLabels[f] = m;
165
- let h = String(a.getColumnValue(o.value, t)), g = String(a.getColumnValue(s.value, t)), _ = e.meta.valueSources.reduce((e, n) => (e[n] = a.getColumnValue(c[n].value, t) ?? S, e), {});
183
+ let h = String(a.getColumnValue(o.value, t)), g = String(a.getColumnValue(s.value, t)), _ = e.meta.valueSources.reduce((e, n) => {
184
+ let r = a.getColumnValue(c[n].value, t) ?? C;
185
+ if (w?.[n] === "log" && typeof r == "number") {
186
+ let e = Math.log10(r);
187
+ r = Number.isFinite(e) ? e : null;
188
+ }
189
+ return e[n] = r, e;
190
+ }, {});
166
191
  if (h === "null" || g === "null") continue;
167
- let y = Object.values(_).every((e) => e === null);
168
- if (!(y && !D && !O)) {
192
+ let v = Object.values(_).every((e) => e === null);
193
+ if (!(v && !j && !M)) {
169
194
  if (e.facets[n] || (e.facets[n] = {
170
195
  xKeys: [],
171
196
  yKeys: [],
172
197
  xKeysByGroups: {},
173
198
  yKeysByGroups: {},
174
199
  cells: {}
175
- }), e.facets[n].xKeysByGroups[i] || (e.facets[n].xKeysByGroups[i] = []), e.facets[n].yKeysByGroups[f] || (e.facets[n].yKeysByGroups[f] = []), !y || O) {
200
+ }), e.facets[n].xKeysByGroups[i] || (e.facets[n].xKeysByGroups[i] = []), e.facets[n].yKeysByGroups[f] || (e.facets[n].yKeysByGroups[f] = []), !v || M) {
176
201
  e.facets[n].xKeys.push(h), e.facets[n].xKeysByGroups[i].push(h);
177
- let r = a.getColumnValue(B, t);
202
+ let r = a.getColumnValue(H, t);
178
203
  if (e.meta.xLabels[h] && String(r) !== e.meta.xLabels[h]) throw Error(`More than 1 x-label value for x=${h}`);
179
- e.meta.xLabels[h] = String(r), K.forEach((n) => {
204
+ e.meta.xLabels[h] = String(r);
205
+ for (let n of X) {
180
206
  let r = e.meta.xDataByKeys[n] !== void 0, i = r && e.meta.xDataByKeys[n][h] !== void 0;
181
207
  if (r || (e.meta.xDataByKeys[n] = {}), i && e.meta.xDataByKeys[n][h] !== a.getColumnValue(n, t)) throw Error(`More than 1 value for x = ${h} and column = ${n}`);
182
208
  i || (e.meta.xDataByKeys[n][h] = a.getColumnValue(n, t));
183
- });
209
+ }
184
210
  }
185
- if (!y || D) {
211
+ if (!v || j) {
186
212
  e.facets[n].yKeys.push(g), e.facets[n].yKeysByGroups[f].push(g);
187
- let r = a.getColumnValue(V, t);
213
+ let r = a.getColumnValue(U, t);
188
214
  if (e.meta.yLabels[g] && String(r) !== e.meta.yLabels[g]) throw Error(`More than 1 y-label value for y=${g}`);
189
- e.meta.yLabels[g] = String(r), q.forEach((n) => {
215
+ e.meta.yLabels[g] = String(r);
216
+ for (let n of Z) {
190
217
  let r = e.meta.yDataByKeys[n] !== void 0, i = r && e.meta.yDataByKeys[n][g] !== void 0;
191
218
  if (r || (e.meta.yDataByKeys[n] = {}), i && e.meta.yDataByKeys[n][g] !== a.getColumnValue(n, t)) throw Error(`More than 1 value for y = ${g} and column = ${n}`);
192
219
  i || (e.meta.yDataByKeys[n][g] = a.getColumnValue(n, t));
193
- });
220
+ }
194
221
  }
195
- if (!y) {
222
+ if (!v) {
196
223
  e.facets[n].cells[h] || (e.facets[n].cells[h] = {});
197
224
  for (let t of e.meta.valueSources) if (e.facets[n].cells[h][g] && e.facets[n].cells[h][g].value[t] !== _[t]) throw Error(`More than 1 value for x=${h}, y=${g}`);
198
225
  e.facets[n].cells[h][g] = {
@@ -203,27 +230,39 @@ function b(e, { data: a, xColumn: o, yColumn: s, valueColumns: c, facetBy: l, xG
203
230
  y: g,
204
231
  value: _,
205
232
  normalizedValue: _
206
- }, v(e, e.facets[n].cells[h][g]);
233
+ }, x(e, e.facets[n].cells[h][g]);
207
234
  }
208
235
  }
209
236
  }
210
- e.meta.facetKeys = e.meta.facetKeys.filter((t) => e.facets[t]), e.meta.facetKeys.forEach((t) => {
211
- let n = e.facets[t], r = i.uniq(n.xKeys), a = i.uniq(n.yKeys);
212
- n.xKeys = C[o.value] ? i.intersection(C[o.value], r) : r, n.yKeys = C[s.value] ? i.intersection(C[s.value], a) : a, L.forEach((r) => {
213
- e.facets[t].xKeysByGroups[r] = i.intersection(n.xKeys, e.facets[t].xKeysByGroups[r]);
214
- }), R.forEach((r) => {
215
- e.facets[t].yKeysByGroups[r] = i.intersection(n.yKeys, e.facets[t].yKeysByGroups[r]);
216
- });
217
- }), _(e, E, K, q, p), y(e, x), e.meta.xKeysByGroups = e.meta.xGroupKeys.reduce((t, n) => {
218
- let r = g(i.uniq(i.flatten(e.meta.facetKeys.map((t) => e.facets[t].xKeysByGroups[n]))), w.sorting, e.meta.xLabels);
219
- return t[n] = C[o.value] ? i.intersection(C[o.value], r) : r, t;
220
- }, {}), e.meta.xKeys = e.meta.xGroupKeys.reduce((t, n) => (t = t.concat(e.meta.xKeysByGroups[n]), t), []), e.meta.yKeysByGroups = e.meta.yGroupKeys.reduce((t, n) => {
221
- let r = g(i.uniq(i.flatten(e.meta.facetKeys.map((t) => e.facets[t].yKeysByGroups[n]))), T.sorting, e.meta.yLabels);
222
- return t[n] = C[s.value] ? i.intersection(C[s.value], r) : r, t;
237
+ e.meta.facetKeys = e.meta.facetKeys.filter((t) => e.facets[t]);
238
+ for (let t of e.meta.facetKeys) {
239
+ let n = e.facets[t], r = [...new Set(n.xKeys)], a = [...new Set(n.yKeys)];
240
+ n.xKeys = T[o.value] ? i(T[o.value], r) : r, n.yKeys = T[s.value] ? i(T[s.value], a) : a;
241
+ for (let r of z) e.facets[t].xKeysByGroups[r] = i(n.xKeys, e.facets[t].xKeysByGroups[r]);
242
+ for (let r of B) e.facets[t].yKeysByGroups[r] = i(n.yKeys, e.facets[t].yKeysByGroups[r]);
243
+ }
244
+ b(e, A, X, Z, p), S(e, v);
245
+ let ne = u.some((e) => T[e.value]?.length > 0), re = d.some((e) => T[e.value]?.length > 0);
246
+ ne || (e.meta.xGroupKeys = g([...e.meta.xGroupKeys], E.sorting, e.meta.xGroupLabels)), re || (e.meta.yGroupKeys = g([...e.meta.yGroupKeys], D.sorting, e.meta.yGroupLabels));
247
+ let Q = !m && !A.x && O?.length ? O : null;
248
+ e.meta.xKeysByGroups = e.meta.xGroupKeys.reduce((t, n) => {
249
+ let r = [...new Set(e.meta.facetKeys.flatMap((t) => e.facets[t].xKeysByGroups[n]))], a = Q ? y(r, E.sorting, Q, e.meta.xDataByKeys) : g(r, E.sorting, e.meta.xLabels);
250
+ return t[n] = T[o.value] ? i(T[o.value], a) : a, t;
251
+ }, {}), e.meta.xKeys = e.meta.xGroupKeys.reduce((t, n) => (t = t.concat(e.meta.xKeysByGroups[n]), t), []);
252
+ let $ = !_ && !A.y && k?.length ? k : null;
253
+ e.meta.yKeysByGroups = e.meta.yGroupKeys.reduce((t, n) => {
254
+ let r = [...new Set(e.meta.facetKeys.flatMap((t) => e.facets[t].yKeysByGroups[n]))], a = $ ? y(r, D.sorting, $, e.meta.yDataByKeys) : g(r, D.sorting, e.meta.yLabels);
255
+ return t[n] = T[s.value] ? i(T[s.value], a) : a, t;
223
256
  }, {}), e.meta.yKeys = e.meta.yGroupKeys.reduce((t, n) => (t = t.concat(e.meta.yKeysByGroups[n]), t), []);
257
+ for (let t of e.meta.facetKeys) {
258
+ for (let n of e.meta.xGroupKeys) e.facets[t].xKeysByGroups[n] = i(e.meta.xKeysByGroups[n], e.facets[t].xKeysByGroups[n] ?? []);
259
+ e.facets[t].xKeys = e.meta.xGroupKeys.flatMap((n) => e.facets[t].xKeysByGroups[n] ?? []);
260
+ for (let n of e.meta.yGroupKeys) e.facets[t].yKeysByGroups[n] = i(e.meta.yKeysByGroups[n], e.facets[t].yKeysByGroups[n] ?? []);
261
+ e.facets[t].yKeys = e.meta.yGroupKeys.flatMap((n) => e.facets[t].yKeysByGroups[n] ?? []);
262
+ }
224
263
  for (let t of e.meta.valueSources) e.meta.valueExtent[t][0] === Infinity && (e.meta.valueExtent[t][0] = 0), e.meta.valueExtent[t][1] === -Infinity && (e.meta.valueExtent[t][1] = 0);
225
264
  return e.meta.xLabels.null = o.nullValueLabel ?? "NA", e.meta.yLabels.null = s.nullValueLabel ?? "NA", e.meta.xGroupLabels.null = u.map((e) => e.nullValueLabel ?? "NA").join(", "), e.meta.yGroupLabels.null = d.map((e) => e.nullValueLabel ?? "NA").join(", "), e;
226
265
  }
227
- export { b as fillCellsData };
266
+ export { C as fillCellsData };
228
267
 
229
268
  //# sourceMappingURL=fillCellsData.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"fillCellsData.js","names":[],"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';\nimport { getFacetLabels } from '../discrete/utils/getFacetLabels';\nimport { getFacetStringKey } from '../discrete/utils/getFacetStringKey';\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 {\n data,\n xColumn,\n yColumn,\n valueColumns,\n facetBy,\n xGroupBy,\n yGroupBy,\n facetSettings,\n annotations,\n dendrogramX,\n dendrogramY,\n normalizationBySource, // separated for color and size for example\n NAValueAs,\n keysOrder,\n xAxis,\n yAxis,\n aggregation,\n showEmptyRows = false,\n showEmptyColumns = false,\n }: {\n data: DataFrame;\n xColumn: ColumnName;\n yColumn: ColumnName;\n valueColumns: Record<string, ColumnName>;\n facetBy: ColumnName[];\n xGroupBy: ColumnName[];\n yGroupBy: ColumnName[];\n facetSettings: HeatmapSettingsImpl['facetSettings'];\n annotations: HeatmapSettingsImpl['annotations'];\n dendrogramX: HeatmapSettingsImpl['dendrogramX'];\n dendrogramY: HeatmapSettingsImpl['dendrogramY'];\n normalizationBySource: Record<T, HeatmapSettingsImpl['normalization']>;\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 showEmptyRows?: boolean;\n showEmptyColumns?: boolean;\n }\n) {\n const facetKeysLists = facetBy.length\n ? facetBy.map(column => keysOrder[column.value] ?? data.getColumnCategories(column.value))\n : [['null']];\n\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 let facetKeysCombinations = getKeysCombinations(facetKeysLists);\n const xGroupKeysCombinations = getKeysCombinations(xGroupKeysLists);\n const yGroupKeysCombinations = getKeysCombinations(yGroupKeysLists);\n\n if (facetSettings?.order?.length) {\n facetKeysCombinations = facetKeysCombinations.filter(keys => facetSettings.order?.includes(getFacetStringKey(keys)));\n }\n const facetKeys = facetKeysCombinations.map(getFacetOrGroupKey);\n const facetKeysSet = new Set(facetKeys);\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\n const facetLabels = getFacetLabels(data, facetBy, facetKeys, facetKeysCombinations);\n result.meta.facetKeyValues = facetKeys.reduce((res: Record<string, string[]>, key) => {\n res[key] = facetLabels[key];\n return res;\n }, {});\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 if (!facetKeysSet.has(facetKey)) {\n continue;\n }\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') {\n continue;\n }\n\n const allValuesNull = Object.values(values).every(v => v === null);\n\n if (allValuesNull && !showEmptyRows && !showEmptyColumns) {\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\n if (!allValuesNull || showEmptyColumns) {\n result.facets[facetKey].xKeys.push(x);\n result.facets[facetKey].xKeysByGroups[xGroupKey].push(x);\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 result.meta.xLabels[x] = String(xLabelsSourceValue);\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 }\n\n if (!allValuesNull || showEmptyRows) {\n result.facets[facetKey].yKeys.push(y);\n result.facets[facetKey].yKeysByGroups[yGroupKey].push(y);\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.yLabels[y] = String(yLabelsSourceValue);\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 }\n\n if (allValuesNull) {\n continue;\n }\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 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 result.meta.xLabels['null'] = xColumn.nullValueLabel ?? 'NA';\n result.meta.yLabels['null'] = yColumn.nullValueLabel ?? 'NA';\n result.meta.xGroupLabels['null'] = xGroupBy.map(column => column.nullValueLabel ?? 'NA').join(', ');\n result.meta.yGroupLabels['null'] = yGroupBy.map(column => column.nullValueLabel ?? 'NA').join(', ');\n return result;\n}"],"mappings":"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"}
1
+ {"version":3,"file":"fillCellsData.js","names":[],"sources":["../../src/heatmap/fillCellsData.ts"],"sourcesContent":["import { deviation, extent, mean, quantileSorted, sum } from 'd3-array';\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 { intersect } from '../utils/intersect';\nimport type { BubbleSettingsImpl } from '../bubble/BubbleSettingsImpl';\nimport { getFacetLabels } from '../discrete/utils/getFacetLabels';\nimport { getFacetStringKey } from '../discrete/utils/getFacetStringKey';\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 for (const keys of keysLists) {\n const nextResult: string[][] = [];\n for (const key of keys) {\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 const sign = direction === 'asc' ? 1 : -1;\n return arr.sort((a, b) => sign * (labels[a] ?? a).localeCompare((labels[b] ?? b), 'en', { numeric: true }));\n};\n\nfunction isMissing(v: DataValue | undefined): boolean {\n if (v === null || v === undefined) return true;\n if (typeof v === 'number' && Number.isNaN(v)) return true;\n return false;\n}\n\nfunction compareValues(a: DataValue | undefined, b: DataValue | undefined, direction: 'asc' | 'desc'): number {\n const aMissing = isMissing(a);\n const bMissing = isMissing(b);\n if (aMissing && bMissing) return 0;\n if (aMissing) return 1; // NA pushed to end regardless of direction\n if (bMissing) return -1;\n const sign = direction === 'asc' ? 1 : -1;\n if (typeof a === 'number' && typeof b === 'number') {\n return sign * (a < b ? -1 : a > b ? 1 : 0);\n }\n return sign * String(a).localeCompare(String(b), 'en', { numeric: true });\n}\n\nexport const sortByColumns = (\n arr: string[],\n direction: 'asc' | 'desc',\n sortColumns: ColumnName[],\n dataByKeys: Record<string, Record<string, DataValue>>\n) => {\n return arr.sort((a, b) => {\n for (const col of sortColumns) {\n const cmp = compareValues(dataByKeys[col.value]?.[a], dataByKeys[col.value]?.[b], direction);\n if (cmp !== 0) return cmp;\n }\n return 0;\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 for (const facetKey of result.meta.facetKeys) {\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 for (const xKey of xGroups[xGroupKey]) {\n for (const yKey of yGroups[yGroupKey]) {\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 for (const xGroupKey of xNewKeys) {\n for (const columnKey of additionalDataColumnsX) {\n const annotation = annotations.find((v) => v.valueColumn.value === columnKey || v.valueColumn.valueLabels === columnKey);\n if (!annotation) {\n continue;\n }\n const values: DataValue[] = [];\n for (const xKey of xGroups[xGroupKey]) {\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 for (const columnKey of additionalDataColumnsY) {\n result.meta.yDataByKeys[columnKey] = {};\n }\n for (const yGroupKey of yNewKeys) {\n for (const columnKey of additionalDataColumnsY) {\n const annotation = annotations.find((v) => v.valueColumn.value === columnKey || v.valueColumn.valueLabels === columnKey);\n if (!annotation) {\n continue;\n }\n const values: DataValue[] = [];\n for (const yKey of yGroups[yGroupKey]) {\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 for (const facetKey of result.meta.facetKeys) {\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 for (const groupKey of groupKeys) {\n const values: number[] = [];\n for (const cellKey of cellKeys) {\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 for (const cellKey of cellKeys) {\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 {\n data,\n xColumn,\n yColumn,\n valueColumns,\n facetBy,\n xGroupBy,\n yGroupBy,\n facetSettings,\n annotations,\n dendrogramX,\n dendrogramY,\n normalizationBySource, // separated for color and size for example\n NAValueAs,\n transformBySource, // same per-source pattern as normalization\n keysOrder,\n xAxis,\n yAxis,\n xSortBy,\n ySortBy,\n aggregation,\n showEmptyRows = false,\n showEmptyColumns = false,\n }: {\n data: DataFrame;\n xColumn: ColumnName;\n yColumn: ColumnName;\n valueColumns: Record<string, ColumnName>;\n facetBy: ColumnName[];\n xGroupBy: ColumnName[];\n yGroupBy: ColumnName[];\n facetSettings: HeatmapSettingsImpl['facetSettings'];\n annotations: HeatmapSettingsImpl['annotations'];\n dendrogramX: HeatmapSettingsImpl['dendrogramX'];\n dendrogramY: HeatmapSettingsImpl['dendrogramY'];\n normalizationBySource: Record<T, HeatmapSettingsImpl['normalization']>;\n NAValueAs: HeatmapSettingsImpl['NAValueAs'];\n transformBySource?: Record<T, HeatmapSettingsImpl['transform']>;\n keysOrder: HeatmapSettingsImpl['keysOrder'];\n xAxis: HeatmapSettingsImpl['chartSettings']['xAxis'] | BubbleSettingsImpl['chartSettings']['xAxis'];\n yAxis: HeatmapSettingsImpl['chartSettings']['yAxis'] | BubbleSettingsImpl['chartSettings']['yAxis'];\n xSortBy?: HeatmapSettingsImpl['xSortBy'];\n ySortBy?: HeatmapSettingsImpl['ySortBy'];\n aggregation: HeatmapSettingsImpl['aggregation'];\n showEmptyRows?: boolean;\n showEmptyColumns?: boolean;\n }\n) {\n const facetKeysLists = facetBy.length\n ? facetBy.map(column => keysOrder[column.value] ?? data.getColumnCategories(column.value))\n : [['null']];\n\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 let facetKeysCombinations = getKeysCombinations(facetKeysLists);\n const xGroupKeysCombinations = getKeysCombinations(xGroupKeysLists);\n const yGroupKeysCombinations = getKeysCombinations(yGroupKeysLists);\n\n if (facetSettings?.order?.length) {\n facetKeysCombinations = facetKeysCombinations.filter(keys => facetSettings.order?.includes(getFacetStringKey(keys)));\n }\n const facetKeys = facetKeysCombinations.map(getFacetOrGroupKey);\n const facetKeysSet = new Set(facetKeys);\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\n const facetLabels = getFacetLabels(data, facetBy, facetKeys, facetKeysCombinations);\n result.meta.facetKeyValues = facetKeys.reduce((res: Record<string, string[]>, key) => {\n res[key] = facetLabels[key];\n return res;\n }, {});\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 xSortByColumns = (xSortBy ?? []).map(c => c.value);\n const ySortByColumns = (ySortBy ?? []).map(c => c.value);\n const additionalDataColumnsX = [...new Set([...annotationColumnsX, ...dendrogramXColumns, ...xSortByColumns, xLabelsSource])];\n const additionalDataColumnsY = [...new Set([...annotationColumnsY, ...dendrogramYColumns, ...ySortByColumns, yLabelsSource])];\n\n for (let i = 0; i < data.rowsCount; i++) {\n const facetKey = getFacetOrGroupKey(facetBy.map(column => data.getColumnValue(column.value, i)));\n if (!facetKeysSet.has(facetKey)) {\n continue;\n }\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 let v = (data.getColumnValue(valueColumns[key].value, i) ?? NAValueAs) as number | null;\n if (transformBySource?.[key] === 'log' && typeof v === 'number') {\n const transformed = Math.log10(v);\n v = Number.isFinite(transformed) ? transformed : null;\n }\n r[key] = v;\n return r;\n }, {} as Record<string, DataValue>);\n\n if (x === 'null' || y === 'null') {\n continue;\n }\n\n const allValuesNull = Object.values(values).every(v => v === null);\n\n if (allValuesNull && !showEmptyRows && !showEmptyColumns) {\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\n if (!allValuesNull || showEmptyColumns) {\n result.facets[facetKey].xKeys.push(x);\n result.facets[facetKey].xKeysByGroups[xGroupKey].push(x);\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 result.meta.xLabels[x] = String(xLabelsSourceValue);\n for (const columnKey of additionalDataColumnsX) {\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 }\n\n if (!allValuesNull || showEmptyRows) {\n result.facets[facetKey].yKeys.push(y);\n result.facets[facetKey].yKeysByGroups[yGroupKey].push(y);\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.yLabels[y] = String(yLabelsSourceValue);\n for (const columnKey of additionalDataColumnsY) {\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 }\n\n if (allValuesNull) {\n continue;\n }\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 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 for (const facetKey of result.meta.facetKeys) {\n const facet = result.facets[facetKey];\n const uniqueXKeys = [...new Set(facet.xKeys)];\n const uniqueYKeys = [...new Set(facet.yKeys)];\n facet.xKeys = keysOrder[xColumn.value] ? intersect(keysOrder[xColumn.value], uniqueXKeys) : uniqueXKeys;\n facet.yKeys = keysOrder[yColumn.value] ? intersect(keysOrder[yColumn.value], uniqueYKeys) : uniqueYKeys;\n for (const xGroupKey of xGroupKeys) {\n result.facets[facetKey].xKeysByGroups[xGroupKey] = intersect(\n facet.xKeys,\n result.facets[facetKey].xKeysByGroups[xGroupKey]\n );\n }\n for (const yGroupKey of yGroupKeys) {\n result.facets[facetKey].yKeysByGroups[yGroupKey] = intersect(\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 // All sorting is consolidated here. Dendrograms run later in getDendrograms and reorder\n // per-facet keys for axes where clustering is on — that's the only post-fillCellsData sort.\n\n // Sort group keys (by group labels). Skip when user supplied custom order via keysOrder.\n const xGroupCustomOrder = xGroupBy.some(c => keysOrder[c.value]?.length > 0);\n const yGroupCustomOrder = yGroupBy.some(c => keysOrder[c.value]?.length > 0);\n if (!xGroupCustomOrder) {\n result.meta.xGroupKeys = sortByLabels([...result.meta.xGroupKeys], xAxis.sorting, result.meta.xGroupLabels);\n }\n if (!yGroupCustomOrder) {\n result.meta.yGroupKeys = sortByLabels([...result.meta.yGroupKeys], yAxis.sorting, result.meta.yGroupLabels);\n }\n\n // every facet may contain not all of available keys, but for shared axes it is necessary to have all of them\n const effectiveXSortBy = (!dendrogramX && !aggregation.x && xSortBy?.length) ? xSortBy : null;\n result.meta.xKeysByGroups = result.meta.xGroupKeys.reduce((res: Record<string, string[]>, xGroupKey) => {\n const uniqueXKeys = [...new Set(\n result.meta.facetKeys.flatMap(facetKey => result.facets[facetKey].xKeysByGroups[xGroupKey])\n )];\n const existingXKeys = effectiveXSortBy\n ? sortByColumns(uniqueXKeys, xAxis.sorting, effectiveXSortBy, result.meta.xDataByKeys)\n : sortByLabels(uniqueXKeys, xAxis.sorting, result.meta.xLabels);\n res[xGroupKey] = keysOrder[xColumn.value] ? intersect(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 const effectiveYSortBy = (!dendrogramY && !aggregation.y && ySortBy?.length) ? ySortBy : null;\n result.meta.yKeysByGroups = result.meta.yGroupKeys.reduce((res: Record<string, string[]>, yGroupKey) => {\n const uniqueYKeys = [...new Set(\n result.meta.facetKeys.flatMap(facetKey => result.facets[facetKey].yKeysByGroups[yGroupKey])\n )];\n const existingYKeys = effectiveYSortBy\n ? sortByColumns(uniqueYKeys, yAxis.sorting, effectiveYSortBy, result.meta.yDataByKeys)\n : sortByLabels(uniqueYKeys, yAxis.sorting, result.meta.yLabels);\n res[yGroupKey] = keysOrder[yColumn.value] ? intersect(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 // Propagate the sorted meta order to per-facet keys. Used by the renderer when sharedX/Y is\n // false. Intersection preserves meta order while filtering down to keys present in each facet.\n // getDendrograms may re-order facet keys later for axes with clustering on.\n for (const facetKey of result.meta.facetKeys) {\n for (const xGroupKey of result.meta.xGroupKeys) {\n result.facets[facetKey].xKeysByGroups[xGroupKey] = intersect(\n result.meta.xKeysByGroups[xGroupKey],\n result.facets[facetKey].xKeysByGroups[xGroupKey] ?? []\n );\n }\n result.facets[facetKey].xKeys = result.meta.xGroupKeys.flatMap(\n g => result.facets[facetKey].xKeysByGroups[g] ?? []\n );\n for (const yGroupKey of result.meta.yGroupKeys) {\n result.facets[facetKey].yKeysByGroups[yGroupKey] = intersect(\n result.meta.yKeysByGroups[yGroupKey],\n result.facets[facetKey].yKeysByGroups[yGroupKey] ?? []\n );\n }\n result.facets[facetKey].yKeys = result.meta.yGroupKeys.flatMap(\n g => result.facets[facetKey].yKeysByGroups[g] ?? []\n );\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 result.meta.xLabels['null'] = xColumn.nullValueLabel ?? 'NA';\n result.meta.yLabels['null'] = yColumn.nullValueLabel ?? 'NA';\n result.meta.xGroupLabels['null'] = xGroupBy.map(column => column.nullValueLabel ?? 'NA').join(', ');\n result.meta.yGroupLabels['null'] = yGroupBy.map(column => column.nullValueLabel ?? 'NA').join(', ');\n return result;\n}"],"mappings":"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"}
@@ -5,7 +5,7 @@ import { Cell, GroupedCellsData } from './fillCellsData';
5
5
  export type CellHeatmap = Cell<'dataSource'>;
6
6
  export type GroupedCellsHeatmap = GroupedCellsData<'dataSource'>;
7
7
  export declare function createEmptyGroupedCells(): GroupedCellsHeatmap;
8
- export declare function getCells({ data, xColumn, yColumn, valueColumns, facetBy, xGroupBy, yGroupBy, facetSettings, annotations, dendrogramX, dendrogramY, normalization, NAValueAs, keysOrder, xAxis, yAxis, aggregation, showEmptyRows, showEmptyColumns, }: {
8
+ export declare function getCells({ data, xColumn, yColumn, valueColumns, facetBy, xGroupBy, yGroupBy, xSortBy, ySortBy, facetSettings, annotations, dendrogramX, dendrogramY, normalization, NAValueAs, transform, keysOrder, xAxis, yAxis, aggregation, showEmptyRows, showEmptyColumns, }: {
9
9
  data: DataFrame;
10
10
  xColumn: ColumnName;
11
11
  yColumn: ColumnName;
@@ -13,12 +13,15 @@ export declare function getCells({ data, xColumn, yColumn, valueColumns, facetBy
13
13
  facetBy: ColumnName[];
14
14
  xGroupBy: ColumnName[];
15
15
  yGroupBy: ColumnName[];
16
+ xSortBy: ColumnName[];
17
+ ySortBy: ColumnName[];
16
18
  facetSettings: HeatmapSettingsImpl['facetSettings'];
17
19
  annotations: HeatmapSettingsImpl['annotations'];
18
20
  dendrogramX: HeatmapSettingsImpl['dendrogramX'];
19
21
  dendrogramY: HeatmapSettingsImpl['dendrogramY'];
20
22
  normalization: HeatmapSettingsImpl['normalization'];
21
23
  NAValueAs: HeatmapSettingsImpl['NAValueAs'];
24
+ transform: HeatmapSettingsImpl['transform'];
22
25
  keysOrder: HeatmapSettingsImpl['keysOrder'];
23
26
  xAxis: HeatmapSettingsImpl['chartSettings']['xAxis'];
24
27
  yAxis: HeatmapSettingsImpl['chartSettings']['yAxis'];
@@ -1 +1 @@
1
- {"version":3,"file":"getCells.d.ts","sourceRoot":"","sources":["../../src/heatmap/getCells.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,cAAc,CAAC;AAC9C,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,UAAU,CAAC;AAC3C,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,uBAAuB,CAAC;AACjE,OAAO,KAAK,EAAE,IAAI,EAAE,gBAAgB,EAAE,MAAM,iBAAiB,CAAC;AAG9D,MAAM,MAAM,WAAW,GAAG,IAAI,CAAC,YAAY,CAAC,CAAA;AAC5C,MAAM,MAAM,mBAAmB,GAAG,gBAAgB,CAAC,YAAY,CAAC,CAAC;AAEjE,wBAAgB,uBAAuB,IAAI,mBAAmB,CAwB7D;AAED,wBAAgB,QAAQ,CAAC,EACrB,IAAI,EACJ,OAAO,EACP,OAAO,EACP,YAAY,EACZ,OAAO,EACP,QAAQ,EACR,QAAQ,EACR,aAAa,EACb,WAAW,EACX,WAAW,EACX,WAAW,EACX,aAAa,EACb,SAAS,EACT,SAAS,EACT,KAAK,EACL,KAAK,EACL,WAAW,EACX,aAAqB,EACrB,gBAAwB,GAC3B,EAAE;IACC,IAAI,EAAE,SAAS,CAAC;IAChB,OAAO,EAAE,UAAU,CAAC;IACpB,OAAO,EAAE,UAAU,CAAC;IACpB,YAAY,EAAE,MAAM,CAAC,MAAM,EAAE,UAAU,CAAC,CAAC;IACzC,OAAO,EAAE,UAAU,EAAE,CAAC;IACtB,QAAQ,EAAE,UAAU,EAAE,CAAC;IACvB,QAAQ,EAAE,UAAU,EAAE,CAAC;IACvB,aAAa,EAAE,mBAAmB,CAAC,eAAe,CAAC,CAAC;IACpD,WAAW,EAAE,mBAAmB,CAAC,aAAa,CAAC,CAAC;IAChD,WAAW,EAAE,mBAAmB,CAAC,aAAa,CAAC,CAAC;IAChD,WAAW,EAAE,mBAAmB,CAAC,aAAa,CAAC,CAAC;IAChD,aAAa,EAAE,mBAAmB,CAAC,eAAe,CAAC,CAAC;IACpD,SAAS,EAAE,mBAAmB,CAAC,WAAW,CAAC,CAAC;IAC5C,SAAS,EAAE,mBAAmB,CAAC,WAAW,CAAC,CAAC;IAC5C,KAAK,EAAE,mBAAmB,CAAC,eAAe,CAAC,CAAC,OAAO,CAAC,CAAC;IACrD,KAAK,EAAE,mBAAmB,CAAC,eAAe,CAAC,CAAC,OAAO,CAAC,CAAC;IACrD,WAAW,EAAE,mBAAmB,CAAC,aAAa,CAAC,CAAC;IAChD,aAAa,CAAC,EAAE,OAAO,CAAC;IACxB,gBAAgB,CAAC,EAAE,OAAO,CAAC;CAC9B,GAAG,mBAAmB,CAmBtB"}
1
+ {"version":3,"file":"getCells.d.ts","sourceRoot":"","sources":["../../src/heatmap/getCells.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,cAAc,CAAC;AAC9C,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,UAAU,CAAC;AAC3C,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,uBAAuB,CAAC;AACjE,OAAO,KAAK,EAAE,IAAI,EAAE,gBAAgB,EAAE,MAAM,iBAAiB,CAAC;AAG9D,MAAM,MAAM,WAAW,GAAG,IAAI,CAAC,YAAY,CAAC,CAAA;AAC5C,MAAM,MAAM,mBAAmB,GAAG,gBAAgB,CAAC,YAAY,CAAC,CAAC;AAEjE,wBAAgB,uBAAuB,IAAI,mBAAmB,CAwB7D;AAED,wBAAgB,QAAQ,CAAC,EACrB,IAAI,EACJ,OAAO,EACP,OAAO,EACP,YAAY,EACZ,OAAO,EACP,QAAQ,EACR,QAAQ,EACR,OAAO,EACP,OAAO,EACP,aAAa,EACb,WAAW,EACX,WAAW,EACX,WAAW,EACX,aAAa,EACb,SAAS,EACT,SAAS,EACT,SAAS,EACT,KAAK,EACL,KAAK,EACL,WAAW,EACX,aAAqB,EACrB,gBAAwB,GAC3B,EAAE;IACC,IAAI,EAAE,SAAS,CAAC;IAChB,OAAO,EAAE,UAAU,CAAC;IACpB,OAAO,EAAE,UAAU,CAAC;IACpB,YAAY,EAAE,MAAM,CAAC,MAAM,EAAE,UAAU,CAAC,CAAC;IACzC,OAAO,EAAE,UAAU,EAAE,CAAC;IACtB,QAAQ,EAAE,UAAU,EAAE,CAAC;IACvB,QAAQ,EAAE,UAAU,EAAE,CAAC;IACvB,OAAO,EAAE,UAAU,EAAE,CAAC;IACtB,OAAO,EAAE,UAAU,EAAE,CAAC;IACtB,aAAa,EAAE,mBAAmB,CAAC,eAAe,CAAC,CAAC;IACpD,WAAW,EAAE,mBAAmB,CAAC,aAAa,CAAC,CAAC;IAChD,WAAW,EAAE,mBAAmB,CAAC,aAAa,CAAC,CAAC;IAChD,WAAW,EAAE,mBAAmB,CAAC,aAAa,CAAC,CAAC;IAChD,aAAa,EAAE,mBAAmB,CAAC,eAAe,CAAC,CAAC;IACpD,SAAS,EAAE,mBAAmB,CAAC,WAAW,CAAC,CAAC;IAC5C,SAAS,EAAE,mBAAmB,CAAC,WAAW,CAAC,CAAC;IAC5C,SAAS,EAAE,mBAAmB,CAAC,WAAW,CAAC,CAAC;IAC5C,KAAK,EAAE,mBAAmB,CAAC,eAAe,CAAC,CAAC,OAAO,CAAC,CAAC;IACrD,KAAK,EAAE,mBAAmB,CAAC,eAAe,CAAC,CAAC,OAAO,CAAC,CAAC;IACrD,WAAW,EAAE,mBAAmB,CAAC,aAAa,CAAC,CAAC;IAChD,aAAa,CAAC,EAAE,OAAO,CAAC;IACxB,gBAAgB,CAAC,EAAE,OAAO,CAAC;CAC9B,GAAG,mBAAmB,CAqBtB"}