@milaboratories/graph-maker 1.1.168 → 1.1.170
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.
- package/dist/GraphMaker/constantsCommon.d.ts +3 -0
- package/dist/GraphMaker/constantsCommon.d.ts.map +1 -1
- package/dist/GraphMaker/constantsCommon.js +9 -6
- package/dist/GraphMaker/constantsCommon.js.map +1 -1
- package/dist/GraphMaker/forms/DataMappingForm/BubbleForm.vue.d.ts.map +1 -1
- package/dist/GraphMaker/forms/DataMappingForm/BubbleForm.vue.js +60 -56
- package/dist/GraphMaker/forms/DataMappingForm/BubbleForm.vue.js.map +1 -1
- package/dist/GraphMaker/forms/LayersForm/Layer/Bubble.vue.d.ts.map +1 -1
- package/dist/GraphMaker/forms/LayersForm/Layer/Bubble.vue.js +86 -58
- package/dist/GraphMaker/forms/LayersForm/Layer/Bubble.vue.js.map +1 -1
- package/dist/GraphMaker/forms/LayersForm/Layer/heatmap/Heatmap.vue.js +109 -112
- package/dist/GraphMaker/forms/LayersForm/Layer/heatmap/Heatmap.vue.js.map +1 -1
- package/dist/GraphMaker/utils/createChartSettingsForRender/composeBubbleSettings.d.ts +20 -0
- package/dist/GraphMaker/utils/createChartSettingsForRender/composeBubbleSettings.d.ts.map +1 -1
- package/dist/GraphMaker/utils/createChartSettingsForRender/composeBubbleSettings.js +19 -15
- package/dist/GraphMaker/utils/createChartSettingsForRender/composeBubbleSettings.js.map +1 -1
- package/dist/GraphMaker/utils/createChartSettingsForRender/composeDiscreteSettings.d.ts +3 -3
- package/dist/GraphMaker/utils/createChartSettingsForRender/composeHeatmapSettings.d.ts +8 -8
- package/dist/GraphMaker/utils/createChartSettingsForRender/composeHeatmapSettings.d.ts.map +1 -1
- package/dist/GraphMaker/utils/createChartSettingsForRender/composeHeatmapSettings.js +23 -23
- package/dist/GraphMaker/utils/createChartSettingsForRender/composeHeatmapSettings.js.map +1 -1
- package/dist/node_modules/@milaboratories/miplots4/dist/bubble/BubbleSettingsImpl.js +19 -14
- package/dist/node_modules/@milaboratories/miplots4/dist/bubble/BubbleSettingsImpl.js.map +1 -1
- package/dist/node_modules/@milaboratories/miplots4/dist/bubble/ChartRenderer.js +132 -132
- package/dist/node_modules/@milaboratories/miplots4/dist/bubble/ChartRenderer.js.map +1 -1
- package/dist/node_modules/@milaboratories/miplots4/dist/bubble/components/Chart.js +53 -53
- package/dist/node_modules/@milaboratories/miplots4/dist/bubble/components/Chart.js.map +1 -1
- package/dist/node_modules/@milaboratories/miplots4/dist/bubble/components/ChartsGroup.js.map +1 -1
- package/dist/node_modules/@milaboratories/miplots4/dist/bubble/getCellTooltip.js +7 -7
- package/dist/node_modules/@milaboratories/miplots4/dist/bubble/getCellTooltip.js.map +1 -1
- package/dist/node_modules/@milaboratories/miplots4/dist/bubble/getGroupedCellsData.js +49 -83
- package/dist/node_modules/@milaboratories/miplots4/dist/bubble/getGroupedCellsData.js.map +1 -1
- package/dist/node_modules/@milaboratories/miplots4/dist/bubble/index.js +51 -34
- package/dist/node_modules/@milaboratories/miplots4/dist/bubble/index.js.map +1 -1
- package/dist/node_modules/@milaboratories/miplots4/dist/bubble/utils/calculateCaptionTails.js.map +1 -1
- package/dist/node_modules/@milaboratories/miplots4/dist/heatmap/ChartRenderer.js +2 -2
- package/dist/node_modules/@milaboratories/miplots4/dist/heatmap/ChartRenderer.js.map +1 -1
- package/dist/node_modules/@milaboratories/miplots4/dist/heatmap/components/Annotations/Annotation.js.map +1 -1
- package/dist/node_modules/@milaboratories/miplots4/dist/heatmap/components/Annotations/AnnotationCellsCanvas.js.map +1 -1
- package/dist/node_modules/@milaboratories/miplots4/dist/heatmap/components/Annotations/AnnotationCellsSvg.js.map +1 -1
- package/dist/node_modules/@milaboratories/miplots4/dist/heatmap/components/Annotations/index.js.map +1 -1
- package/dist/node_modules/@milaboratories/miplots4/dist/heatmap/components/CanvasCells.js +31 -31
- package/dist/node_modules/@milaboratories/miplots4/dist/heatmap/components/CanvasCells.js.map +1 -1
- package/dist/node_modules/@milaboratories/miplots4/dist/heatmap/components/Chart.js +20 -20
- package/dist/node_modules/@milaboratories/miplots4/dist/heatmap/components/Chart.js.map +1 -1
- package/dist/node_modules/@milaboratories/miplots4/dist/heatmap/components/ChartsGroup.js +12 -12
- package/dist/node_modules/@milaboratories/miplots4/dist/heatmap/components/ChartsGroup.js.map +1 -1
- package/dist/node_modules/@milaboratories/miplots4/dist/heatmap/components/SvgCells.js +14 -14
- package/dist/node_modules/@milaboratories/miplots4/dist/heatmap/components/SvgCells.js.map +1 -1
- package/dist/node_modules/@milaboratories/miplots4/dist/heatmap/components/tooltipUtils.js +14 -14
- package/dist/node_modules/@milaboratories/miplots4/dist/heatmap/components/tooltipUtils.js.map +1 -1
- package/dist/node_modules/@milaboratories/miplots4/dist/heatmap/fillCellsData.js +244 -0
- package/dist/node_modules/@milaboratories/miplots4/dist/heatmap/fillCellsData.js.map +1 -0
- package/dist/node_modules/@milaboratories/miplots4/dist/heatmap/getCells.js +28 -214
- package/dist/node_modules/@milaboratories/miplots4/dist/heatmap/getCells.js.map +1 -1
- package/dist/node_modules/@milaboratories/miplots4/dist/heatmap/getDendrograms.js +26 -26
- package/dist/node_modules/@milaboratories/miplots4/dist/heatmap/getDendrograms.js.map +1 -1
- package/dist/node_modules/@milaboratories/miplots4/dist/heatmap/index.js +8 -8
- package/dist/node_modules/@milaboratories/miplots4/dist/heatmap/index.js.map +1 -1
- package/dist/node_modules/@milaboratories/miplots4/dist/heatmap/utils/calculateCaptionTails.js.map +1 -1
- package/dist/node_modules/@milaboratories/miplots4/dist/scatterplot-umap/components/Lasso.js +98 -103
- package/dist/node_modules/@milaboratories/miplots4/dist/scatterplot-umap/components/Lasso.js.map +1 -1
- package/dist/node_modules/@milaboratories/miplots4/dist/types/bubble.js +23 -12
- package/dist/node_modules/@milaboratories/miplots4/dist/types/bubble.js.map +1 -1
- package/dist/node_modules/@milaboratories/miplots4/dist/utils/getFacetOrGroupKey.js +7 -0
- package/dist/node_modules/@milaboratories/miplots4/dist/utils/getFacetOrGroupKey.js.map +1 -0
- package/dist/node_modules/@milaboratories/pf-plots/dist/controllers/controllersByChartType/bubble.js +165 -95
- package/dist/node_modules/@milaboratories/pf-plots/dist/controllers/controllersByChartType/bubble.js.map +1 -1
- package/package.json +3 -3
|
@@ -1,66 +1,11 @@
|
|
|
1
|
-
import
|
|
2
|
-
|
|
3
|
-
import N from "../node_modules/d3-array/src/mean.js";
|
|
4
|
-
import { quantileSorted as ae } from "../node_modules/d3-array/src/quantile.js";
|
|
5
|
-
import te from "../node_modules/d3-array/src/deviation.js";
|
|
6
|
-
import ue from "../node_modules/d3-array/src/extent.js";
|
|
7
|
-
function oe(a) {
|
|
8
|
-
const u = te(a), o = N(a);
|
|
9
|
-
return u === void 0 || o === void 0 || u === 0 ? (n) => n : (n) => (n - o) / u;
|
|
10
|
-
}
|
|
11
|
-
function le(a) {
|
|
12
|
-
const u = N(a), [o, n] = ue(a);
|
|
13
|
-
return u === void 0 || o === void 0 || n === void 0 || n === o ? (y) => y : (y) => (y - u) / (n - o);
|
|
14
|
-
}
|
|
15
|
-
function se(a, u) {
|
|
16
|
-
return a === "standardScaling" ? oe(u) : a === "meanNormalization" ? le(u) : (o) => o;
|
|
17
|
-
}
|
|
18
|
-
function k(a, u) {
|
|
19
|
-
switch (a) {
|
|
20
|
-
case "max": {
|
|
21
|
-
let o = u[0];
|
|
22
|
-
for (const n of u)
|
|
23
|
-
o = Math.max(o, n);
|
|
24
|
-
return o;
|
|
25
|
-
}
|
|
26
|
-
case "min": {
|
|
27
|
-
let o = u[0];
|
|
28
|
-
for (const n of u)
|
|
29
|
-
o = Math.min(o, n);
|
|
30
|
-
return o;
|
|
31
|
-
}
|
|
32
|
-
case "median": {
|
|
33
|
-
const o = u.sort((n, y) => n - y);
|
|
34
|
-
return ae(o, 0.5);
|
|
35
|
-
}
|
|
36
|
-
case "mean":
|
|
37
|
-
return N(u) ?? u[0];
|
|
38
|
-
default:
|
|
39
|
-
ee(a, `Unknown aggregation function ${a}`);
|
|
40
|
-
}
|
|
41
|
-
}
|
|
42
|
-
function Q(a) {
|
|
43
|
-
const u = [...new Set(a)].sort();
|
|
44
|
-
return u.length > 3 ? [...u.slice(0, 3), "..."].join(", ") : u.join(", ");
|
|
45
|
-
}
|
|
46
|
-
function I(a) {
|
|
47
|
-
if (!a.length)
|
|
48
|
-
return [];
|
|
49
|
-
let u = [[]];
|
|
50
|
-
return a.forEach((o) => {
|
|
51
|
-
const n = [];
|
|
52
|
-
o.forEach((y) => {
|
|
53
|
-
n.push(...u.map((v) => [...v, y]));
|
|
54
|
-
}), u = n;
|
|
55
|
-
}), u;
|
|
56
|
-
}
|
|
57
|
-
const R = (a, u, o = {}) => a.sort(
|
|
58
|
-
(n, y) => u === "asc" ? (o[n] ?? n).localeCompare(o[y] ?? y, "en", { numeric: !0 }) : (o[y] ?? y).localeCompare(o[n] ?? n, "en", { numeric: !0 })
|
|
59
|
-
);
|
|
60
|
-
function ne() {
|
|
1
|
+
import { fillCellsData as B } from "./fillCellsData.js";
|
|
2
|
+
function b() {
|
|
61
3
|
return {
|
|
62
4
|
meta: {
|
|
5
|
+
valueSources: ["dataSource"],
|
|
63
6
|
facetKeys: [],
|
|
7
|
+
xKeys: [],
|
|
8
|
+
yKeys: [],
|
|
64
9
|
xGroupKeys: [],
|
|
65
10
|
yGroupKeys: [],
|
|
66
11
|
xKeysByGroups: {},
|
|
@@ -74,165 +19,34 @@ function ne() {
|
|
|
74
19
|
facetKeyValues: {},
|
|
75
20
|
xGroupKeyValues: {},
|
|
76
21
|
yGroupKeyValues: {},
|
|
77
|
-
valueExtent: [1 / 0, -1 / 0]
|
|
22
|
+
valueExtent: { dataSource: [1 / 0, -1 / 0] }
|
|
78
23
|
},
|
|
79
24
|
facets: {}
|
|
80
25
|
};
|
|
81
26
|
}
|
|
82
|
-
function
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
y: r,
|
|
104
|
-
value: K,
|
|
105
|
-
normalizedValue: K
|
|
106
|
-
}, v[0] = Math.min(K, v[0]), v[1] = Math.max(K, v[1]);
|
|
107
|
-
}
|
|
108
|
-
}
|
|
109
|
-
u.x && d.forEach((e) => {
|
|
110
|
-
o.forEach((r) => {
|
|
111
|
-
const B = y.find((p) => p.valueColumn.value === r || p.valueColumn.valueLabels === r);
|
|
112
|
-
if (!B)
|
|
113
|
-
return;
|
|
114
|
-
const K = [];
|
|
115
|
-
c[e].forEach((p) => {
|
|
116
|
-
K.push(a.meta.xDataByKeys[r][p]), delete a.meta.xDataByKeys[r][p];
|
|
117
|
-
});
|
|
118
|
-
const C = B.type === "continuous" ? k(u.method, K) : Q(K);
|
|
119
|
-
a.meta.xDataByKeys[r][e] = C;
|
|
120
|
-
});
|
|
121
|
-
}), u.y && (n.forEach((e) => {
|
|
122
|
-
a.meta.yDataByKeys[e] = {};
|
|
123
|
-
}), D.forEach((e) => {
|
|
124
|
-
n.forEach((r) => {
|
|
125
|
-
const B = y.find((p) => p.valueColumn.value === r || p.valueColumn.valueLabels === r);
|
|
126
|
-
if (!B)
|
|
127
|
-
return;
|
|
128
|
-
const K = [];
|
|
129
|
-
b[e].forEach((p) => {
|
|
130
|
-
K.push(a.meta.yDataByKeys[r][p]), delete a.meta.yDataByKeys[r][p];
|
|
131
|
-
});
|
|
132
|
-
const C = B.type === "continuous" ? k(u.method, K) : Q(K);
|
|
133
|
-
a.meta.yDataByKeys[r][e] = C;
|
|
134
|
-
});
|
|
135
|
-
})), u.x && (a.facets[m].xKeys = Object.keys(g), a.facets[m].xKeysByGroups = { null: a.facets[m].xKeys }, a.meta.xLabels = a.meta.xGroupLabels, a.meta.xGroupKeys = ["null"], a.meta.xGroupKeyValues = { null: ["null"] }), u.y && (a.facets[m].yKeys = Object.keys(G), a.facets[m].yKeysByGroups = { null: a.facets[m].yKeys }, a.meta.yLabels = a.meta.yGroupLabels, a.meta.yGroupKeys = ["null"], a.meta.yGroupKeyValues = { null: ["null"] });
|
|
136
|
-
}), a.meta.valueExtent = v;
|
|
137
|
-
}
|
|
138
|
-
}
|
|
139
|
-
function ye(a, u) {
|
|
140
|
-
if (u) {
|
|
141
|
-
const o = [1 / 0, -1 / 0];
|
|
142
|
-
a.meta.facetKeys.forEach((n) => {
|
|
143
|
-
const { xKeys: y, yKeys: v, cells: m } = a.facets[n], L = u.direction === "row" ? y : v, M = u.direction === "row" ? v : y, V = u.direction === "row" ? (g, G) => {
|
|
144
|
-
var c;
|
|
145
|
-
return (c = m[g]) == null ? void 0 : c[G];
|
|
146
|
-
} : (g, G) => {
|
|
147
|
-
var c;
|
|
148
|
-
return (c = m[G]) == null ? void 0 : c[g];
|
|
149
|
-
};
|
|
150
|
-
M.forEach((g) => {
|
|
151
|
-
const G = [];
|
|
152
|
-
L.forEach((b) => {
|
|
153
|
-
var d;
|
|
154
|
-
const D = (d = V(b, g)) == null ? void 0 : d.value;
|
|
155
|
-
D !== void 0 && G.push(D);
|
|
156
|
-
});
|
|
157
|
-
const c = se(u.method, G);
|
|
158
|
-
L.forEach((b) => {
|
|
159
|
-
const d = V(b, g);
|
|
160
|
-
d !== void 0 && (d.normalizedValue = c(d.value), o[0] = Math.min(d.normalizedValue, o[0]), o[1] = Math.max(d.normalizedValue, o[1]));
|
|
161
|
-
});
|
|
162
|
-
});
|
|
163
|
-
}), a.meta.valueExtent = o;
|
|
164
|
-
}
|
|
165
|
-
}
|
|
166
|
-
function pe(a, u, o, n, y, v, m, L, M, V, g, G, c, b, d, D) {
|
|
167
|
-
const e = ne(), r = y.length ? y.map((t) => c[t.value] ?? a.getColumnCategories(t.value)) : [["null"]], B = v.length ? v.map((t) => c[t.value] ?? a.getColumnCategories(t.value)) : [["null"]], K = m.length ? m.map((t) => c[t.value] ?? a.getColumnCategories(t.value)) : [["null"]], C = I(r), p = I(B), S = I(K), _ = C.map((t) => t.join("_")), j = p.map((t) => t.join("_")), O = S.map((t) => t.join("_"));
|
|
168
|
-
e.meta.facetKeys = _, e.meta.xGroupKeys = j, e.meta.yGroupKeys = O, e.meta.facetKeyValues = _.reduce((t, l, f) => (t[l] = C[f], t), {}), e.meta.xGroupKeyValues = j.reduce((t, l, f) => (t[l] = p[f], t), {}), e.meta.yGroupKeyValues = O.reduce((t, l, f) => (t[l] = S[f], t), {});
|
|
169
|
-
const U = u.valueLabels ?? u.value, A = o.valueLabels ?? o.value, T = L.filter((t) => t.axis === "x").map((t) => t.valueColumn.valueLabels ?? t.valueColumn.value), W = L.filter((t) => t.axis === "y").map((t) => t.valueColumn.valueLabels ?? t.valueColumn.value), Y = Object.values(M ?? {}).map((t) => t.value), Z = Object.values(V ?? {}).map((t) => t.value), F = h.uniq([...T, ...Y, U]), H = h.uniq([...W, ...Z, A]);
|
|
170
|
-
for (let t = 0; t < a.rowsCount; t++) {
|
|
171
|
-
const l = y.length ? y.map((s) => a.getColumnValue(s.value, t)).join("_") : "null", f = v.length ? v.map((s) => a.getColumnValue(s.value, t)).join("_") : "null", E = m.length ? m.map((s) => a.getColumnValue(s.value, t)).join("_") : "null", $ = v.length ? v.map((s) => a.getColumnValue(s.valueLabels ?? s.value, t)).join(", ") : "", X = m.length ? m.map((s) => a.getColumnValue(s.valueLabels ?? s.value, t)).join(", ") : "";
|
|
172
|
-
e.meta.xGroupLabels[f] = $, e.meta.yGroupLabels[E] = X;
|
|
173
|
-
const i = String(a.getColumnValue(u.value, t)), x = String(a.getColumnValue(o.value, t)), w = a.getColumnValue(n.value, t) ?? G;
|
|
174
|
-
if (i === "null" || x === "null" || w === null)
|
|
175
|
-
continue;
|
|
176
|
-
if (e.facets[l] || (e.facets[l] = {
|
|
177
|
-
xKeys: [],
|
|
178
|
-
yKeys: [],
|
|
179
|
-
xKeysByGroups: {},
|
|
180
|
-
yKeysByGroups: {},
|
|
181
|
-
cells: {}
|
|
182
|
-
}), e.facets[l].xKeysByGroups[f] || (e.facets[l].xKeysByGroups[f] = []), e.facets[l].yKeysByGroups[E] || (e.facets[l].yKeysByGroups[E] = []), e.facets[l].xKeys.push(i), e.facets[l].yKeys.push(x), e.facets[l].xKeysByGroups[f].push(i), e.facets[l].yKeysByGroups[E].push(x), e.facets[l].cells[i] || (e.facets[l].cells[i] = {}), e.meta.valueExtent[0] = Math.min(w, e.meta.valueExtent[0]), e.meta.valueExtent[1] = Math.max(w, e.meta.valueExtent[1]), e.facets[l].cells[i][x] && e.facets[l].cells[i][x].value !== w)
|
|
183
|
-
throw Error(`More than 1 value for x=${i}, y=${x}`);
|
|
184
|
-
const J = a.getColumnValue(U, t);
|
|
185
|
-
if (e.meta.xLabels[i] && String(J) !== e.meta.xLabels[i])
|
|
186
|
-
throw Error(`More than 1 x-label value for x=${i}`);
|
|
187
|
-
const P = a.getColumnValue(A, t);
|
|
188
|
-
if (e.meta.yLabels[x] && String(P) !== e.meta.yLabels[x])
|
|
189
|
-
throw Error(`More than 1 y-label value for y=${x}`);
|
|
190
|
-
e.meta.xLabels[i] = String(J), e.meta.yLabels[x] = String(P), F.forEach((s) => {
|
|
191
|
-
const q = typeof e.meta.xDataByKeys[s] < "u", z = q && typeof e.meta.xDataByKeys[s][i] < "u";
|
|
192
|
-
if (q || (e.meta.xDataByKeys[s] = {}), z && e.meta.xDataByKeys[s][i] !== a.getColumnValue(s, t))
|
|
193
|
-
throw Error(`More than 1 value for x = ${i} and column = ${s}`);
|
|
194
|
-
z || (e.meta.xDataByKeys[s][i] = a.getColumnValue(s, t));
|
|
195
|
-
}), H.forEach((s) => {
|
|
196
|
-
const q = typeof e.meta.yDataByKeys[s] < "u", z = q && typeof e.meta.yDataByKeys[s][x] < "u";
|
|
197
|
-
if (q || (e.meta.yDataByKeys[s] = {}), z && e.meta.yDataByKeys[s][x] !== a.getColumnValue(s, t))
|
|
198
|
-
throw Error(`More than 1 value for y = ${x} and column = ${s}`);
|
|
199
|
-
z || (e.meta.yDataByKeys[s][x] = a.getColumnValue(s, t));
|
|
200
|
-
}), e.facets[l].cells[i][x] = {
|
|
201
|
-
isCell: !0,
|
|
202
|
-
idx: t,
|
|
203
|
-
id: `${i}_${x}`,
|
|
204
|
-
x: i,
|
|
205
|
-
y: x,
|
|
206
|
-
value: w,
|
|
207
|
-
normalizedValue: w
|
|
208
|
-
};
|
|
209
|
-
}
|
|
210
|
-
return e.meta.facetKeys = e.meta.facetKeys.filter((t) => e.facets[t]), e.meta.facetKeys.forEach((t) => {
|
|
211
|
-
const l = e.facets[t], f = h.uniq(l.xKeys), E = h.uniq(l.yKeys);
|
|
212
|
-
l.xKeys = c[u.value] ? h.intersection(c[u.value], f) : f, l.yKeys = c[o.value] ? h.intersection(c[o.value], E) : E, j.forEach(($) => {
|
|
213
|
-
e.facets[t].xKeysByGroups[$] = h.intersection(
|
|
214
|
-
l.xKeys,
|
|
215
|
-
e.facets[t].xKeysByGroups[$]
|
|
216
|
-
);
|
|
217
|
-
}), O.forEach(($) => {
|
|
218
|
-
e.facets[t].yKeysByGroups[$] = h.intersection(
|
|
219
|
-
l.yKeys,
|
|
220
|
-
e.facets[t].yKeysByGroups[$]
|
|
221
|
-
);
|
|
222
|
-
});
|
|
223
|
-
}), re(e, D, F, H, L), ye(e, g), e.meta.xKeysByGroups = e.meta.xGroupKeys.reduce((t, l) => {
|
|
224
|
-
const f = R(h.uniq(
|
|
225
|
-
h.flatten(e.meta.facetKeys.map((E) => e.facets[E].xKeysByGroups[l]))
|
|
226
|
-
), b.sorting, e.meta.xLabels);
|
|
227
|
-
return t[l] = c[u.value] ? h.intersection(c[u.value], f) : f, t;
|
|
228
|
-
}, {}), e.meta.yKeysByGroups = e.meta.yGroupKeys.reduce((t, l) => {
|
|
229
|
-
const f = R(h.uniq(
|
|
230
|
-
h.flatten(e.meta.facetKeys.map((E) => e.facets[E].yKeysByGroups[l]))
|
|
231
|
-
), d.sorting, e.meta.yLabels);
|
|
232
|
-
return t[l] = c[o.value] ? h.intersection(c[o.value], f) : f, t;
|
|
233
|
-
}, {}), e.meta.valueExtent[0] === 1 / 0 && (e.meta.valueExtent[0] = 0), e.meta.valueExtent[1] === -1 / 0 && (e.meta.valueExtent[1] = 0), e;
|
|
27
|
+
function L(a, s, y, u, t, r, o, l, K, c, p, x, n, G, f, d) {
|
|
28
|
+
const e = b();
|
|
29
|
+
return B(
|
|
30
|
+
e,
|
|
31
|
+
a,
|
|
32
|
+
s,
|
|
33
|
+
y,
|
|
34
|
+
u,
|
|
35
|
+
t,
|
|
36
|
+
r,
|
|
37
|
+
o,
|
|
38
|
+
l,
|
|
39
|
+
K,
|
|
40
|
+
c,
|
|
41
|
+
{ dataSource: p },
|
|
42
|
+
x,
|
|
43
|
+
n,
|
|
44
|
+
G,
|
|
45
|
+
f,
|
|
46
|
+
d
|
|
47
|
+
), e;
|
|
234
48
|
}
|
|
235
49
|
export {
|
|
236
|
-
|
|
50
|
+
L as getCells
|
|
237
51
|
};
|
|
238
52
|
//# sourceMappingURL=getCells.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"getCells.js","sources":["../../../../../../node_modules/@milaboratories/miplots4/src/heatmap/getCells.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';\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\nexport type Cell = {\n isCell: true;\n idx: number;\n id: string;\n value: DataValue;\n normalizedValue: DataValue;\n x: DataValue;\n y: DataValue;\n};\n\nexport type GroupedCellsData = {\n meta: {\n facetKeys: string[];\n xGroupKeys: string[];\n yGroupKeys: string[];\n xKeysByGroups: Record<string, string[]>;\n yKeysByGroups: Record<string, string[]>;\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 xLabels: Record<string, string>;\n yLabels: Record<string, string>;\n xGroupLabels: Record<string, string>;\n yGroupLabels: Record<string, string>;\n valueExtent: [number, number]; // for color 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>>;\n }\n >;\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};\n\nfunction createEmptyGroupedCells(): GroupedCellsData {\n return {\n meta: {\n facetKeys: [],\n xGroupKeys: [],\n yGroupKeys: [],\n xKeysByGroups: {},\n yKeysByGroups: {},\n xLabels: {},\n yLabels: {},\n xGroupLabels: {},\n yGroupLabels: {},\n xDataByKeys: {},\n yDataByKeys: {},\n facetKeyValues: {},\n xGroupKeyValues: {},\n yGroupKeyValues: {},\n valueExtent: [Infinity, -Infinity],\n },\n facets: {},\n };\n}\n\nfunction applyAggregation(\n result: GroupedCellsData,\n aggregation: HeatmapSettingsImpl['aggregation'],\n additionalDataColumnsX: string[],\n additionalDataColumnsY: string[],\n annotations: HeatmapSettingsImpl['annotations']\n) {\n if (aggregation.x || aggregation.y) {\n const valueExtent = [Infinity, -Infinity] as [number, number];\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 for (const xGroupKey of xNewKeys) {\n for (const yGroupKey of yNewKeys) {\n const values: number[] = [];\n xGroups[xGroupKey].forEach((xKey) => {\n yGroups[yGroupKey].forEach((yKey) => {\n const cellValue = cells[xKey]?.[yKey]?.value;\n if (cellValue !== undefined) {\n values.push(cellValue as number);\n delete cells[xKey]?.[yKey];\n }\n });\n });\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 result.facets[facetKey].cells[xGroupKey][yGroupKey] = {\n isCell: true,\n idx: 0,\n id: `${xGroupKey}_${yGroupKey}`,\n x: xGroupKey,\n y: yGroupKey,\n value,\n normalizedValue: value,\n };\n valueExtent[0] = Math.min(value, valueExtent[0]);\n valueExtent[1] = Math.max(value, valueExtent[1]);\n }\n }\n }\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 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 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}\nfunction applyNormalization(result: GroupedCellsData, normalization: HeatmapSettingsImpl['normalization']) {\n if (normalization) {\n const valueExtent = [Infinity, -Infinity] as [number, number];\n result.meta.facetKeys.forEach(facetKey => {\n const { xKeys, yKeys, cells } = result.facets[facetKey];\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;\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 = normalize(cell.value as number);\n valueExtent[0] = Math.min(cell.normalizedValue, valueExtent[0]);\n valueExtent[1] = Math.max(cell.normalizedValue, valueExtent[1]);\n }\n });\n });\n });\n result.meta.valueExtent = valueExtent;\n }\n}\n\nexport function getCells(\n data: DataFrame,\n xColumn: ColumnName,\n yColumn: ColumnName,\n valueColumn: ColumnName,\n facetBy: ColumnName[],\n xGroupBy: ColumnName[],\n yGroupBy: ColumnName[],\n annotations: HeatmapSettingsImpl['annotations'],\n dendrogramX: HeatmapSettingsImpl['dendrogramX'],\n dendrogramY: HeatmapSettingsImpl['dendrogramY'],\n normalization: HeatmapSettingsImpl['normalization'],\n NAValueAs: HeatmapSettingsImpl['NAValueAs'],\n keysOrder: HeatmapSettingsImpl['keysOrder'],\n xAxis: HeatmapSettingsImpl['chartSettings']['xAxis'],\n yAxis: HeatmapSettingsImpl['chartSettings']['yAxis'],\n aggregation: HeatmapSettingsImpl['aggregation'],\n): GroupedCellsData {\n const result: GroupedCellsData = createEmptyGroupedCells();\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(keys => keys.join('_'));\n const xGroupKeys = xGroupKeysCombinations.map(keys => keys.join('_'));\n const yGroupKeys = yGroupKeysCombinations.map(keys => keys.join('_'));\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 = facetBy.length ? facetBy.map(column => data.getColumnValue(column.value, i)).join('_') : 'null';\n const xGroupKey = xGroupBy.length ? xGroupBy.map(column => data.getColumnValue(column.value, i)).join('_') : 'null';\n const yGroupKey = yGroupBy.length ? yGroupBy.map(column => data.getColumnValue(column.value, i)).join('_') : 'null';\n const xGroupLabel = xGroupBy.length ? xGroupBy.map(column => data.getColumnValue(column.valueLabels ?? column.value, i)).join(', ') : '';\n const yGroupLabel = yGroupBy.length ? 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 const value = (data.getColumnValue(valueColumn.value, i) ?? NAValueAs) as number | null;\n\n if (x === 'null' || y === 'null' || value === 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 result.meta.valueExtent[0] = Math.min(value, result.meta.valueExtent[0]);\n result.meta.valueExtent[1] = Math.max(value, result.meta.valueExtent[1]);\n if (result.facets[facetKey].cells[x][y] && result.facets[facetKey].cells[x][y].value !== value) {\n throw Error(`More than 1 value for x=${x}, y=${y}`);\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,\n normalizedValue: value,\n };\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, normalization);\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.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\n // avoid render errors on empty data\n if (result.meta.valueExtent[0] === Infinity) {\n result.meta.valueExtent[0] = 0;\n }\n if (result.meta.valueExtent[1] === -Infinity) {\n result.meta.valueExtent[1] = 0;\n }\n\n return result;\n}\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","createEmptyGroupedCells","applyAggregation","aggregation","additionalDataColumnsX","additionalDataColumnsY","annotations","valueExtent","facetKey","xKeys","yKeys","cells","xKeysByGroups","yKeysByGroups","xGroups","xKey","yGroups","yKey","xNewKeys","yNewKeys","xGroupKey","yGroupKey","cellValue","_b","_a","_c","value","columnKey","annotation","applyNormalization","normalization","cellKeys","groupKeys","cellGetter","cellKey","groupKey","normalize","cell","getCells","data","xColumn","yColumn","valueColumn","facetBy","xGroupBy","yGroupBy","dendrogramX","dendrogramY","NAValueAs","keysOrder","xAxis","yAxis","facetKeysLists","column","xGroupKeysLists","yGroupKeysLists","facetKeysCombinations","xGroupKeysCombinations","yGroupKeysCombinations","facetKeys","xGroupKeys","yGroupKeys","index","xLabelsSource","yLabelsSource","annotationColumnsX","item","annotationColumnsY","dendrogramXColumns","dendrogramYColumns","lodash","i","xGroupLabel","yGroupLabel","l","x","y","xLabelsSourceValue","yLabelsSourceValue","isAddedColumn","isAddedValue","facet","uniqueXKeys","uniqueYKeys","existingXKeys","existingYKeys"],"mappings":"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","x_google_ignoreList":[0]}
|
|
1
|
+
{"version":3,"file":"getCells.js","sources":["../../../../../../node_modules/@milaboratories/miplots4/src/heatmap/getCells.ts"],"sourcesContent":["import type { DataFrame } from '../DataFrame';\nimport type { ColumnName } from '../types';\nimport type { HeatmapSettingsImpl } from './HeatmapSettingsImpl';\nimport type { Cell, GroupedCellsData } from './fillCellsData';\nimport { fillCellsData } from './fillCellsData';\n\nexport type CellHeatmap = Cell<'dataSource'>\nexport type GroupedCellsHeatmap = GroupedCellsData<'dataSource'>;\n\nfunction createEmptyGroupedCells(): GroupedCellsHeatmap {\n return {\n meta: {\n valueSources: ['dataSource'],\n facetKeys: [],\n xKeys: [],\n yKeys: [],\n xGroupKeys: [],\n yGroupKeys: [],\n xKeysByGroups: {},\n yKeysByGroups: {},\n xLabels: {},\n yLabels: {},\n xGroupLabels: {},\n yGroupLabels: {},\n xDataByKeys: {},\n yDataByKeys: {},\n facetKeyValues: {},\n xGroupKeyValues: {},\n yGroupKeyValues: {},\n valueExtent: { dataSource: [Infinity, -Infinity] },\n },\n facets: {},\n };\n}\n\nexport function getCells(\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 normalization: HeatmapSettingsImpl['normalization'],\n NAValueAs: HeatmapSettingsImpl['NAValueAs'],\n keysOrder: HeatmapSettingsImpl['keysOrder'],\n xAxis: HeatmapSettingsImpl['chartSettings']['xAxis'],\n yAxis: HeatmapSettingsImpl['chartSettings']['yAxis'],\n aggregation: HeatmapSettingsImpl['aggregation'],\n): GroupedCellsHeatmap {\n const result: GroupedCellsHeatmap = createEmptyGroupedCells();\n fillCellsData(\n result,\n data,\n xColumn, yColumn, valueColumns,\n facetBy, xGroupBy, yGroupBy,\n annotations,\n dendrogramX, dendrogramY,\n {dataSource: normalization},\n NAValueAs,\n keysOrder,\n xAxis,\n yAxis,\n aggregation\n );\n return result;\n}\n"],"names":["createEmptyGroupedCells","getCells","data","xColumn","yColumn","valueColumns","facetBy","xGroupBy","yGroupBy","annotations","dendrogramX","dendrogramY","normalization","NAValueAs","keysOrder","xAxis","yAxis","aggregation","result","fillCellsData"],"mappings":";AASA,SAASA,IAA+C;AACpD,SAAO;AAAA,IACH,MAAM;AAAA,MACF,cAAc,CAAC,YAAY;AAAA,MAC3B,WAAW,CAAA;AAAA,MACX,OAAO,CAAA;AAAA,MACP,OAAO,CAAA;AAAA,MACP,YAAY,CAAA;AAAA,MACZ,YAAY,CAAA;AAAA,MACZ,eAAe,CAAA;AAAA,MACf,eAAe,CAAA;AAAA,MACf,SAAS,CAAA;AAAA,MACT,SAAS,CAAA;AAAA,MACT,cAAc,CAAA;AAAA,MACd,cAAc,CAAA;AAAA,MACd,aAAa,CAAA;AAAA,MACb,aAAa,CAAA;AAAA,MACb,gBAAgB,CAAA;AAAA,MAChB,iBAAiB,CAAA;AAAA,MACjB,iBAAiB,CAAA;AAAA,MACjB,aAAa,EAAE,YAAY,CAAC,OAAU,MAAS,EAAA;AAAA,IAAA;AAAA,IAEnD,QAAQ,CAAA;AAAA,EAAA;AAEhB;AAEO,SAASC,EACZC,GACAC,GACAC,GACAC,GACAC,GACAC,GACAC,GACAC,GACAC,GACAC,GACAC,GACAC,GACAC,GACAC,GACAC,GACAC,GACmB;AACnB,QAAMC,IAA8BlB,EAAAA;AACpC,SAAAmB;AAAAA,IACID;AAAAA,IACAhB;AAAAA,IACAC;AAAAA,IAASC;AAAAA,IAASC;AAAAA,IAClBC;AAAAA,IAASC;AAAAA,IAAUC;AAAAA,IACnBC;AAAAA,IACAC;AAAAA,IAAaC;AAAAA,IACb,EAAC,YAAYC,EAAAA;AAAAA,IACbC;AAAAA,IACAC;AAAAA,IACAC;AAAAA,IACAC;AAAAA,IACAC;AAAAA,EAAA,GAEGC;AACX;","x_google_ignoreList":[0]}
|
|
@@ -1,41 +1,41 @@
|
|
|
1
1
|
import { getClustersApproximate as d } from "./getClusters.js";
|
|
2
2
|
import x from "../node_modules/d3-hierarchy/src/hierarchy/index.js";
|
|
3
|
-
function X(
|
|
4
|
-
const { facetKeys: K, xGroupKeys: B, yGroupKeys: g } =
|
|
5
|
-
if (
|
|
3
|
+
function X(r, y, l, G) {
|
|
4
|
+
const { facetKeys: K, xGroupKeys: B, yGroupKeys: g } = r.meta, m = {};
|
|
5
|
+
if (y && G.sharedX)
|
|
6
6
|
throw Error("Dendrogram on X axis is not available with shared by facets X axis");
|
|
7
7
|
return K.forEach((s) => {
|
|
8
8
|
const f = {
|
|
9
9
|
hierarchyByGroupX: {},
|
|
10
10
|
hierarchyByGroupY: {}
|
|
11
|
-
}, o =
|
|
12
|
-
if (
|
|
13
|
-
const
|
|
11
|
+
}, o = r.facets[s];
|
|
12
|
+
if (y) {
|
|
13
|
+
const i = [];
|
|
14
14
|
B.forEach((e) => {
|
|
15
|
-
const
|
|
16
|
-
|
|
17
|
-
var
|
|
18
|
-
return ((
|
|
15
|
+
const n = o.xKeysByGroups[e], p = o.yKeys, t = d(
|
|
16
|
+
n.map((a) => p.map((h) => {
|
|
17
|
+
var c;
|
|
18
|
+
return ((c = o.cells[a][h]) == null ? void 0 : c.normalizedValue.dataSource) ?? y.fillNA;
|
|
19
19
|
})),
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
), u =
|
|
23
|
-
|
|
24
|
-
}),
|
|
20
|
+
y.distance,
|
|
21
|
+
y.linkage
|
|
22
|
+
), u = t.indexes.map((a) => n[a]);
|
|
23
|
+
r.facets[s].xKeysByGroups[e] = u, i.push(...u), f.hierarchyByGroupX[e] = x(t);
|
|
24
|
+
}), r.facets[s].xKeys = i;
|
|
25
25
|
}
|
|
26
|
-
if (
|
|
27
|
-
const
|
|
26
|
+
if (l) {
|
|
27
|
+
const i = [];
|
|
28
28
|
g.forEach((e) => {
|
|
29
|
-
const
|
|
30
|
-
|
|
31
|
-
var
|
|
32
|
-
return ((
|
|
29
|
+
const n = o.yKeysByGroups[e], p = o.xKeys, t = d(
|
|
30
|
+
n.map((a) => p.map((h) => {
|
|
31
|
+
var c;
|
|
32
|
+
return ((c = o.cells[h][a]) == null ? void 0 : c.normalizedValue.dataSource) ?? l.fillNA;
|
|
33
33
|
})),
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
), u =
|
|
37
|
-
|
|
38
|
-
}),
|
|
34
|
+
l.distance,
|
|
35
|
+
l.linkage
|
|
36
|
+
), u = t.indexes.map((a) => n[a]);
|
|
37
|
+
r.facets[s].yKeysByGroups[e] = u, i.push(...u), f.hierarchyByGroupY[e] = x(t);
|
|
38
|
+
}), r.facets[s].yKeys = i;
|
|
39
39
|
}
|
|
40
40
|
m[s] = f;
|
|
41
41
|
}), m;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"getDendrograms.js","sources":["../../../../../../node_modules/@milaboratories/miplots4/src/heatmap/getDendrograms.ts"],"sourcesContent":["import type { Cluster } from './components/types';\nimport type {
|
|
1
|
+
{"version":3,"file":"getDendrograms.js","sources":["../../../../../../node_modules/@milaboratories/miplots4/src/heatmap/getDendrograms.ts"],"sourcesContent":["import type { Cluster } from './components/types';\nimport type { GroupedCellsHeatmap } from './getCells';\nimport type { HeatmapSettingsImpl } from './HeatmapSettingsImpl';\nimport { getClustersApproximate } from './getClusters';\nimport type { HierarchyNode } from 'd3-hierarchy';\nimport { hierarchy } from 'd3-hierarchy';\n\nexport type DendrogramsData = Record<string, {\n hierarchyByGroupX: Record<string, HierarchyNode<Cluster>>;\n hierarchyByGroupY: Record<string, HierarchyNode<Cluster>>;\n}>\n\nconst DEBUG = false;\n\nexport function getDendrograms(\n groupedCellsData: GroupedCellsHeatmap,\n dendrogramX: HeatmapSettingsImpl['dendrogramX'],\n dendrogramY: HeatmapSettingsImpl['dendrogramY'],\n facetSettings: HeatmapSettingsImpl['facetSettings']\n): DendrogramsData {\n const { facetKeys, xGroupKeys, yGroupKeys } = groupedCellsData.meta;\n const result: DendrogramsData = {};\n\n if (dendrogramX && facetSettings.sharedX) {\n throw Error('Dendrogram on X axis is not available with shared by facets X axis');\n }\n\n facetKeys.forEach(facetKey => {\n const facetResult: DendrogramsData[string] = {\n hierarchyByGroupX: {},\n hierarchyByGroupY: {},\n };\n const cellsGroup = groupedCellsData.facets[facetKey];\n if (DEBUG) {\n // eslint-disable-next-line no-console\n console.time('start x');\n }\n if (dendrogramX) {\n const updatedXKeys: string[] = [];\n xGroupKeys.forEach(xGroupKey => {\n const xKeys = cellsGroup.xKeysByGroups[xGroupKey];\n const yKeys = cellsGroup.yKeys;\n if(DEBUG) {\n // eslint-disable-next-line no-console\n console.log('xKeys source', xKeys.length);\n }\n const rootCluster = getClustersApproximate(\n xKeys.map(x => yKeys.map(y => (cellsGroup.cells[x][y]?.normalizedValue.dataSource ?? dendrogramX.fillNA) as number)),\n dendrogramX.distance,\n dendrogramX.linkage\n );\n if (DEBUG) {\n // eslint-disable-next-line no-console\n console.log('rootCluster', rootCluster);\n }\n //set sorted group keys\n const newXKeys = rootCluster.indexes.map(i => xKeys[i]);\n groupedCellsData.facets[facetKey].xKeysByGroups[xGroupKey] = newXKeys;\n updatedXKeys.push(...newXKeys);\n facetResult.hierarchyByGroupX[xGroupKey] = hierarchy(rootCluster);\n });\n // set sorted group keys of all groups\n groupedCellsData.facets[facetKey].xKeys = updatedXKeys;\n }\n if (DEBUG) {\n // eslint-disable-next-line no-console\n console.timeEnd('start x');\n }\n if (dendrogramY) {\n const updatedYKeys: string[] = [];\n yGroupKeys.forEach(yGroupKey => {\n const yKeys = cellsGroup.yKeysByGroups[yGroupKey];\n const xKeys = cellsGroup.xKeys;\n const rootCluster = getClustersApproximate(\n yKeys.map(y => xKeys.map(x => (cellsGroup.cells[x][y]?.normalizedValue.dataSource ?? dendrogramY.fillNA) as number)),\n dendrogramY.distance,\n dendrogramY.linkage\n );\n const newYKeys = rootCluster.indexes.map(i => yKeys[i]);\n //set sorted group keys\n groupedCellsData.facets[facetKey].yKeysByGroups[yGroupKey] = newYKeys;\n updatedYKeys.push(...newYKeys);\n facetResult.hierarchyByGroupY[yGroupKey] = hierarchy(rootCluster);\n });\n // set sorted group keys of all groups\n groupedCellsData.facets[facetKey].yKeys = updatedYKeys;\n }\n result[facetKey] = facetResult;\n });\n\n return result;\n}\n"],"names":["getDendrograms","groupedCellsData","dendrogramX","dendrogramY","facetSettings","facetKeys","xGroupKeys","yGroupKeys","result","facetKey","facetResult","cellsGroup","updatedXKeys","xGroupKey","xKeys","yKeys","rootCluster","getClustersApproximate","x","l","_a","y","newXKeys","i","hierarchy","updatedYKeys","yGroupKey","newYKeys"],"mappings":";;AAcO,SAASA,EACZC,GACAC,GACAC,GACAC,GACe;AACf,QAAM,EAAE,WAAAC,GAAW,YAAAC,GAAY,YAAAC,MAAeN,EAAiB,MACzDO,IAA0B,CAAA;AAEhC,MAAIN,KAAeE,EAAc;AAC7B,UAAM,MAAM,oEAAoE;AAGpF,SAAAC,EAAU,QAAQ,CAAAI,MAAY;AAC1B,UAAMC,IAAuC;AAAA,MACzC,mBAAmB,CAAA;AAAA,MACnB,mBAAmB,CAAA;AAAA,IAAA,GAEjBC,IAAaV,EAAiB,OAAOQ,CAAQ;AAKnD,QAAIP,GAAa;AACb,YAAMU,IAAyB,CAAA;AAC/BN,MAAAA,EAAW,QAAQ,CAAAO,MAAa;AAC5B,cAAMC,IAAQH,EAAW,cAAcE,CAAS,GAC1CE,IAAQJ,EAAW,OAKnBK,IAAcC;AAAAA,UAChBH,EAAM,IAAI,CAAAI,MAAKH,EAAM,IAAI,CAAAI,MAAA;;AAAM,qBAAAC,IAAAT,EAAW,MAAMO,CAAC,EAAEG,CAAC,MAArB,OAAA,SAAAD,EAAwB,gBAAgB,eAAclB,EAAY;AAAA,UAAA,CAAiB,CAAC;AAAA,UACnHA,EAAY;AAAA,UACZA,EAAY;AAAA,QAAA,GAOVoB,IAAWN,EAAY,QAAQ,IAAI,CAAAO,MAAKT,EAAMS,CAAC,CAAC;AACtDtB,QAAAA,EAAiB,OAAOQ,CAAQ,EAAE,cAAcI,CAAS,IAAIS,GAC7DV,EAAa,KAAK,GAAGU,CAAQ,GAC7BZ,EAAY,kBAAkBG,CAAS,IAAIW,EAAUR,CAAW;AAAA,MACpE,CAAC,GAEDf,EAAiB,OAAOQ,CAAQ,EAAE,QAAQG;AAAAA,IAC9C;AAKA,QAAIT,GAAa;AACb,YAAMsB,IAAyB,CAAA;AAC/BlB,MAAAA,EAAW,QAAQ,CAAAmB,MAAa;AAC5B,cAAMX,IAAQJ,EAAW,cAAce,CAAS,GAC1CZ,IAAQH,EAAW,OACnBK,IAAcC;AAAAA,UAChBF,EAAM,IAAI,CAAAM,MAAKP,EAAM,IAAI,CAAAK,MAAA;;AAAM,qBAAAC,IAAAT,EAAW,MAAMO,CAAC,EAAEG,CAAC,MAArB,OAAA,SAAAD,EAAwB,gBAAgB,eAAcjB,EAAY;AAAA,UAAA,CAAiB,CAAC;AAAA,UACnHA,EAAY;AAAA,UACZA,EAAY;AAAA,QAAA,GAEVwB,IAAWX,EAAY,QAAQ,IAAI,CAAAO,MAAKR,EAAMQ,CAAC,CAAC;AAEtDtB,QAAAA,EAAiB,OAAOQ,CAAQ,EAAE,cAAciB,CAAS,IAAIC,GAC7DF,EAAa,KAAK,GAAGE,CAAQ,GAC7BjB,EAAY,kBAAkBgB,CAAS,IAAIF,EAAUR,CAAW;AAAA,MACpE,CAAC,GAEDf,EAAiB,OAAOQ,CAAQ,EAAE,QAAQgB;AAAAA,IAC9C;AACAjB,IAAAA,EAAOC,CAAQ,IAAIC;AAAAA,EACvB,CAAC,GAEMF;AACX;","x_google_ignoreList":[0]}
|
|
@@ -1,15 +1,15 @@
|
|
|
1
|
-
import { renderToString as
|
|
2
|
-
import { AbstractChart as
|
|
1
|
+
import { renderToString as q } from "../node_modules/react-dom/server.browser.js";
|
|
2
|
+
import { AbstractChart as F } from "../AbstractChart.js";
|
|
3
3
|
import { isColumnName as A } from "../utils/index.js";
|
|
4
|
-
import
|
|
4
|
+
import L from "./ChartRenderer.js";
|
|
5
5
|
import { getCells as J } from "./getCells.js";
|
|
6
6
|
import { getDendrograms as K } from "./getDendrograms.js";
|
|
7
7
|
import { HeatmapSettingsImpl as k } from "./HeatmapSettingsImpl.js";
|
|
8
8
|
import { MAX_SVG_RENDERED_CELLS_COUNT as M } from "./constants.js";
|
|
9
9
|
var P = Object.defineProperty, W = (g, t, e) => t in g ? P(g, t, { enumerable: !0, configurable: !0, writable: !0, value: e }) : g[t] = e, X = (g, t, e) => W(g, typeof t != "symbol" ? t + "" : t, e);
|
|
10
|
-
class lt extends
|
|
10
|
+
class lt extends F {
|
|
11
11
|
constructor(t, e, a) {
|
|
12
|
-
super(t, e), X(this, "settings"), X(this, "chartRenderer", new
|
|
12
|
+
super(t, e), X(this, "settings"), X(this, "chartRenderer", new L()), X(this, "onTooltipHintSwitch", () => {
|
|
13
13
|
}), X(this, "calculatedData", null), this.settings = new k(e), a && (this.onTooltipHintSwitch = a[0]);
|
|
14
14
|
}
|
|
15
15
|
mount(t) {
|
|
@@ -34,7 +34,7 @@ class lt extends L {
|
|
|
34
34
|
console.warn("no chart state for heatmap");
|
|
35
35
|
}
|
|
36
36
|
export() {
|
|
37
|
-
return this._updateChart(),
|
|
37
|
+
return this._updateChart(), q(this.chartRenderer.component);
|
|
38
38
|
}
|
|
39
39
|
_needUpdateCalculatedDataBySettings(t, e) {
|
|
40
40
|
var a, r, n, o, i, m, c, d, s, v, l, p, y, u, C;
|
|
@@ -59,7 +59,7 @@ class lt extends L {
|
|
|
59
59
|
A
|
|
60
60
|
), z = Object.values((O == null ? void 0 : O.aes) || {}).filter(A);
|
|
61
61
|
function f(x, R) {
|
|
62
|
-
return x.length !== R.length || x.some((I,
|
|
62
|
+
return x.length !== R.length || x.some((I, $) => I.value !== R[$].value);
|
|
63
63
|
}
|
|
64
64
|
return t.xColumn.value !== S.value || t.yColumn.value !== b.value || t.valueColumn.value !== G.value || f(t.xGroupBy, _) || f(t.yGroupBy, h) || f(t.facetBy, w) || f(
|
|
65
65
|
t.annotations.map((x) => x.valueColumn),
|
|
@@ -94,7 +94,7 @@ class lt extends L {
|
|
|
94
94
|
this.data,
|
|
95
95
|
t,
|
|
96
96
|
e,
|
|
97
|
-
a,
|
|
97
|
+
{ dataSource: a },
|
|
98
98
|
o,
|
|
99
99
|
r,
|
|
100
100
|
n,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sources":["../../../../../../node_modules/@milaboratories/miplots4/src/heatmap/index.ts"],"sourcesContent":["import { renderToString } from 'react-dom/server';\nimport { AbstractChart } from '../AbstractChart';\nimport type { DataFrame } from '../DataFrame';\nimport type { ColumnName, DataValue, HeatmapEventHandlers, HeatmapSettings } from '../types';\nimport { isColumnName } from '../utils';\nimport ChartRenderer from './ChartRenderer';\nimport type { GroupedCellsData } from './getCells';\nimport { getCells } from './getCells';\nimport type { DendrogramsData } from './getDendrograms';\nimport { getDendrograms } from './getDendrograms';\nimport { HeatmapSettingsImpl } from './HeatmapSettingsImpl';\nimport { MAX_SVG_RENDERED_CELLS_COUNT } from './constants';\n\nexport class ChartHeatmap extends AbstractChart {\n settings: HeatmapSettingsImpl;\n chartRenderer = new ChartRenderer();\n\n onTooltipHintSwitch: (v:boolean) => void = () => undefined;\n calculatedData: {\n groupedCellsData: GroupedCellsData;\n dendrogramsData: DendrogramsData;\n cellUniqValues: DataValue[];\n } | null = null;\n\n constructor(data: DataFrame, settings: HeatmapSettings, eventHandlers?:HeatmapEventHandlers) {\n super(data, settings);\n\n this.settings = new HeatmapSettingsImpl(settings);\n if (eventHandlers) {\n this.onTooltipHintSwitch = eventHandlers[0];\n }\n }\n\n mount(node: HTMLElement) {\n try {\n this.chartRenderer.init(node);\n this._updateData();\n this._updateChart();\n this.hasError = false;\n } catch (err) {\n this.hasError = true;\n if (err instanceof Error) {\n this.chartRenderer.renderError(err.message as string);\n console.error(err);\n }\n }\n }\n\n unmount() {\n this.chartRenderer.clear();\n }\n\n updateSettingsAndData(data: DataFrame, settings: HeatmapSettings) {\n try {\n const previousSettings = this.settings;\n const previousData = this.data;\n this.settings = new HeatmapSettingsImpl(settings);\n this.data = data;\n if (\n this._needUpdateCalculatedDataBySettings(previousSettings, this.settings) ||\n this._needUpdateCalculatedDataByData(previousData, this.data)\n ) {\n this._updateData();\n } else {\n this._updateAesInData();\n }\n this._updateChart();\n } catch (err) {\n if (err instanceof Error) {\n this.chartRenderer.renderError(err.message as string);\n console.error(err);\n }\n }\n }\n\n updateChartState(_field: string, _value: unknown) {\n console.warn('no chart state for heatmap');\n }\n\n export(): string {\n this._updateChart();\n return renderToString(this.chartRenderer.component);\n }\n\n _needUpdateCalculatedDataBySettings(prevSettings: HeatmapSettingsImpl, settings: HeatmapSettingsImpl) {\n const {\n xColumn,\n yColumn,\n valueColumn,\n xGroupBy,\n yGroupBy,\n facetBy,\n annotations,\n chartSettings,\n facetSettings,\n dendrogramX,\n dendrogramY,\n normalization,\n aggregation,\n NAValueAs,\n } = settings;\n\n const prevDendrogramXColumns: ColumnName[] = Object.values(prevSettings.dendrogramX?.aes || {}).filter(\n isColumnName\n );\n const currentDendrogramXColumns: ColumnName[] = Object.values(dendrogramX?.aes || {}).filter(isColumnName);\n const prevDendrogramYColumns: ColumnName[] = Object.values(prevSettings.dendrogramY?.aes || {}).filter(\n isColumnName\n );\n const currentDendrogramYColumns: ColumnName[] = Object.values(dendrogramY?.aes || {}).filter(isColumnName);\n\n function compareColumnGroups(columns1: ColumnName[], columns2: ColumnName[]) {\n return (\n columns1.length !== columns2.length ||\n columns1.some((column, idx) => column.value !== columns2[idx].value)\n );\n }\n\n return (\n prevSettings.xColumn.value !== xColumn.value ||\n prevSettings.yColumn.value !== yColumn.value ||\n prevSettings.valueColumn.value !== valueColumn.value ||\n compareColumnGroups(prevSettings.xGroupBy, xGroupBy) ||\n compareColumnGroups(prevSettings.yGroupBy, yGroupBy) ||\n compareColumnGroups(prevSettings.facetBy, facetBy) ||\n compareColumnGroups(\n prevSettings.annotations.map(a => a.valueColumn),\n annotations.map(a => a.valueColumn)\n ) ||\n compareColumnGroups(prevDendrogramXColumns, currentDendrogramXColumns) ||\n compareColumnGroups(prevDendrogramYColumns, currentDendrogramYColumns) ||\n ((settings.dendrogramX || prevSettings.dendrogramX) &&\n (prevSettings.dendrogramX?.distance !== settings.dendrogramX?.distance ||\n prevSettings.dendrogramX?.linkage !== settings.dendrogramX?.linkage)) ||\n ((settings.dendrogramY || prevSettings.dendrogramY) &&\n (prevSettings.dendrogramY?.distance !== settings.dendrogramY?.distance ||\n prevSettings.dendrogramY?.linkage !== settings.dendrogramY?.linkage)) ||\n prevSettings.chartSettings.valueType !== chartSettings.valueType ||\n prevSettings.facetSettings.sharedX !== facetSettings.sharedX ||\n prevSettings.facetSettings.sharedY !== facetSettings.sharedY ||\n prevSettings.normalization?.method !== normalization?.method ||\n prevSettings.normalization?.direction !== normalization?.direction ||\n prevSettings.NAValueAs !== NAValueAs ||\n prevSettings.aggregation?.method !== aggregation?.method ||\n prevSettings.aggregation?.x !== aggregation?.x ||\n prevSettings.aggregation?.y !== aggregation?.y\n );\n }\n\n _needUpdateCalculatedDataByData(prevData: DataFrame, data: DataFrame) {\n const prevKeys = Object.keys(prevData.data);\n const keys = Object.keys(data.data);\n return (\n prevData.id !== data.id ||\n prevKeys.length !== keys.length ||\n prevKeys.some(key => prevData.data[key].length !== data.data[key]?.length)\n );\n }\n\n _updateData() {\n const {\n xColumn,\n yColumn,\n valueColumn,\n xGroupBy,\n yGroupBy,\n facetBy,\n chartSettings,\n facetSettings,\n annotations,\n dendrogramX,\n dendrogramY,\n normalization,\n NAValueAs,\n keysOrder,\n aggregation\n } = this.settings;\n\n const groupedCellsData = getCells(\n this.data,\n xColumn,\n yColumn,\n valueColumn,\n facetBy,\n xGroupBy,\n yGroupBy,\n annotations,\n dendrogramX,\n dendrogramY,\n normalization,\n NAValueAs,\n keysOrder,\n chartSettings.xAxis,\n chartSettings.yAxis,\n aggregation\n );\n const dendrogramsData = getDendrograms(groupedCellsData, dendrogramX, dendrogramY, facetSettings);\n const cellUniqValues =\n chartSettings.valueType === 'discrete' ? this.data.getColumnCategories(valueColumn.value) : [];\n\n this.calculatedData = {\n groupedCellsData,\n dendrogramsData,\n cellUniqValues,\n };\n }\n\n _updateAesInData() {\n return;\n }\n\n _updateChart() {\n if (!this.calculatedData) {\n return;\n }\n const {\n id,\n valueColumn,\n chartSettings,\n facetSettings,\n aes,\n annotations,\n dendrogramX,\n dendrogramY,\n inheritedDendrogramAes,\n normalization,\n keysOrder,\n xColumn,\n yColumn,\n xGroupBy,\n yGroupBy,\n } = this.settings;\n const customOrder = {\n x: keysOrder[xColumn.value]?.length > 0,\n y: keysOrder[yColumn.value]?.length > 0,\n xGroup: xGroupBy.some((v) => keysOrder[v.value]?.length > 0),\n yGroup: yGroupBy.some((v) => keysOrder[v.value]?.length > 0),\n };\n const dataSize = this.data.columnNames.length ? this.data.getColumn(this.data.columnNames[0]).length : 0;\n const cellsRenderingMode = this.settings.cellsRenderingMode ?? (dataSize > MAX_SVG_RENDERED_CELLS_COUNT ? 'canvas' : 'svg');\n \n this.chartRenderer.render(\n this.data,\n id,\n chartSettings,\n facetSettings,\n aes,\n this.calculatedData.groupedCellsData,\n annotations,\n valueColumn,\n dendrogramX,\n dendrogramY,\n this.calculatedData.dendrogramsData,\n inheritedDendrogramAes,\n this.calculatedData.cellUniqValues,\n normalization,\n this.onTooltipHintSwitch,\n customOrder,\n cellsRenderingMode\n );\n }\n}\n"],"names":["ChartHeatmap","AbstractChart","data","settings","eventHandlers","__publicField","ChartRenderer","HeatmapSettingsImpl","node","err","previousSettings","previousData","_field","_value","renderToString","prevSettings","xColumn","yColumn","valueColumn","xGroupBy","yGroupBy","facetBy","annotations","chartSettings","facetSettings","dendrogramX","dendrogramY","normalization","aggregation","NAValueAs","prevDendrogramXColumns","_a","isColumnName","currentDendrogramXColumns","prevDendrogramYColumns","_b","currentDendrogramYColumns","compareColumnGroups","columns1","columns2","column","idx","a","_c","_d","_e","_f","_g","_h","_i","_j","_k","_l","_m","_n","_o","prevData","prevKeys","keys","u","key","keysOrder","groupedCellsData","getCells","dendrogramsData","getDendrograms","cellUniqValues","id","aes","inheritedDendrogramAes","customOrder","v","dataSize","cellsRenderingMode","MAX_SVG_RENDERED_CELLS_COUNT"],"mappings":"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","x_google_ignoreList":[0]}
|
|
1
|
+
{"version":3,"file":"index.js","sources":["../../../../../../node_modules/@milaboratories/miplots4/src/heatmap/index.ts"],"sourcesContent":["import { renderToString } from 'react-dom/server';\nimport { AbstractChart } from '../AbstractChart';\nimport type { DataFrame } from '../DataFrame';\nimport type { ColumnName, DataValue, HeatmapEventHandlers, HeatmapSettings } from '../types';\nimport { isColumnName } from '../utils';\nimport ChartRenderer from './ChartRenderer';\nimport type { GroupedCellsHeatmap } from './getCells';\nimport { getCells } from './getCells';\nimport type { DendrogramsData } from './getDendrograms';\nimport { getDendrograms } from './getDendrograms';\nimport { HeatmapSettingsImpl } from './HeatmapSettingsImpl';\nimport { MAX_SVG_RENDERED_CELLS_COUNT } from './constants';\n\nexport class ChartHeatmap extends AbstractChart {\n settings: HeatmapSettingsImpl;\n chartRenderer = new ChartRenderer();\n\n onTooltipHintSwitch: (v:boolean) => void = () => undefined;\n calculatedData: {\n groupedCellsData: GroupedCellsHeatmap;\n dendrogramsData: DendrogramsData;\n cellUniqValues: DataValue[];\n } | null = null;\n\n constructor(data: DataFrame, settings: HeatmapSettings, eventHandlers?:HeatmapEventHandlers) {\n super(data, settings);\n\n this.settings = new HeatmapSettingsImpl(settings);\n if (eventHandlers) {\n this.onTooltipHintSwitch = eventHandlers[0];\n }\n }\n\n mount(node: HTMLElement) {\n try {\n this.chartRenderer.init(node);\n this._updateData();\n this._updateChart();\n this.hasError = false;\n } catch (err) {\n this.hasError = true;\n if (err instanceof Error) {\n this.chartRenderer.renderError(err.message as string);\n console.error(err);\n }\n }\n }\n\n unmount() {\n this.chartRenderer.clear();\n }\n\n updateSettingsAndData(data: DataFrame, settings: HeatmapSettings) {\n try {\n const previousSettings = this.settings;\n const previousData = this.data;\n this.settings = new HeatmapSettingsImpl(settings);\n this.data = data;\n if (\n this._needUpdateCalculatedDataBySettings(previousSettings, this.settings) ||\n this._needUpdateCalculatedDataByData(previousData, this.data)\n ) {\n this._updateData();\n } else {\n this._updateAesInData();\n }\n this._updateChart();\n } catch (err) {\n if (err instanceof Error) {\n this.chartRenderer.renderError(err.message as string);\n console.error(err);\n }\n }\n }\n\n updateChartState(_field: string, _value: unknown) {\n console.warn('no chart state for heatmap');\n }\n\n export(): string {\n this._updateChart();\n return renderToString(this.chartRenderer.component);\n }\n\n _needUpdateCalculatedDataBySettings(prevSettings: HeatmapSettingsImpl, settings: HeatmapSettingsImpl) {\n const {\n xColumn,\n yColumn,\n valueColumn,\n xGroupBy,\n yGroupBy,\n facetBy,\n annotations,\n chartSettings,\n facetSettings,\n dendrogramX,\n dendrogramY,\n normalization,\n aggregation,\n NAValueAs,\n } = settings;\n\n const prevDendrogramXColumns: ColumnName[] = Object.values(prevSettings.dendrogramX?.aes || {}).filter(\n isColumnName\n );\n const currentDendrogramXColumns: ColumnName[] = Object.values(dendrogramX?.aes || {}).filter(isColumnName);\n const prevDendrogramYColumns: ColumnName[] = Object.values(prevSettings.dendrogramY?.aes || {}).filter(\n isColumnName\n );\n const currentDendrogramYColumns: ColumnName[] = Object.values(dendrogramY?.aes || {}).filter(isColumnName);\n\n function compareColumnGroups(columns1: ColumnName[], columns2: ColumnName[]) {\n return (\n columns1.length !== columns2.length ||\n columns1.some((column, idx) => column.value !== columns2[idx].value)\n );\n }\n\n return (\n prevSettings.xColumn.value !== xColumn.value ||\n prevSettings.yColumn.value !== yColumn.value ||\n prevSettings.valueColumn.value !== valueColumn.value ||\n compareColumnGroups(prevSettings.xGroupBy, xGroupBy) ||\n compareColumnGroups(prevSettings.yGroupBy, yGroupBy) ||\n compareColumnGroups(prevSettings.facetBy, facetBy) ||\n compareColumnGroups(\n prevSettings.annotations.map(a => a.valueColumn),\n annotations.map(a => a.valueColumn)\n ) ||\n compareColumnGroups(prevDendrogramXColumns, currentDendrogramXColumns) ||\n compareColumnGroups(prevDendrogramYColumns, currentDendrogramYColumns) ||\n ((settings.dendrogramX || prevSettings.dendrogramX) &&\n (prevSettings.dendrogramX?.distance !== settings.dendrogramX?.distance ||\n prevSettings.dendrogramX?.linkage !== settings.dendrogramX?.linkage)) ||\n ((settings.dendrogramY || prevSettings.dendrogramY) &&\n (prevSettings.dendrogramY?.distance !== settings.dendrogramY?.distance ||\n prevSettings.dendrogramY?.linkage !== settings.dendrogramY?.linkage)) ||\n prevSettings.chartSettings.valueType !== chartSettings.valueType ||\n prevSettings.facetSettings.sharedX !== facetSettings.sharedX ||\n prevSettings.facetSettings.sharedY !== facetSettings.sharedY ||\n prevSettings.normalization?.method !== normalization?.method ||\n prevSettings.normalization?.direction !== normalization?.direction ||\n prevSettings.NAValueAs !== NAValueAs ||\n prevSettings.aggregation?.method !== aggregation?.method ||\n prevSettings.aggregation?.x !== aggregation?.x ||\n prevSettings.aggregation?.y !== aggregation?.y\n );\n }\n\n _needUpdateCalculatedDataByData(prevData: DataFrame, data: DataFrame) {\n const prevKeys = Object.keys(prevData.data);\n const keys = Object.keys(data.data);\n return (\n prevData.id !== data.id ||\n prevKeys.length !== keys.length ||\n prevKeys.some(key => prevData.data[key].length !== data.data[key]?.length)\n );\n }\n\n _updateData() {\n const {\n xColumn,\n yColumn,\n valueColumn,\n xGroupBy,\n yGroupBy,\n facetBy,\n chartSettings,\n facetSettings,\n annotations,\n dendrogramX,\n dendrogramY,\n normalization,\n NAValueAs,\n keysOrder,\n aggregation\n } = this.settings;\n\n const groupedCellsData = getCells(\n this.data,\n xColumn,\n yColumn,\n {dataSource: valueColumn},\n facetBy,\n xGroupBy,\n yGroupBy,\n annotations,\n dendrogramX,\n dendrogramY,\n normalization,\n NAValueAs,\n keysOrder,\n chartSettings.xAxis,\n chartSettings.yAxis,\n aggregation\n );\n const dendrogramsData = getDendrograms(groupedCellsData, dendrogramX, dendrogramY, facetSettings);\n const cellUniqValues =\n chartSettings.valueType === 'discrete' ? this.data.getColumnCategories(valueColumn.value) : [];\n\n this.calculatedData = {\n groupedCellsData,\n dendrogramsData,\n cellUniqValues,\n };\n }\n\n _updateAesInData() {\n return;\n }\n\n _updateChart() {\n if (!this.calculatedData) {\n return;\n }\n const {\n id,\n valueColumn,\n chartSettings,\n facetSettings,\n aes,\n annotations,\n dendrogramX,\n dendrogramY,\n inheritedDendrogramAes,\n normalization,\n keysOrder,\n xColumn,\n yColumn,\n xGroupBy,\n yGroupBy,\n } = this.settings;\n const customOrder = {\n x: keysOrder[xColumn.value]?.length > 0,\n y: keysOrder[yColumn.value]?.length > 0,\n xGroup: xGroupBy.some((v) => keysOrder[v.value]?.length > 0),\n yGroup: yGroupBy.some((v) => keysOrder[v.value]?.length > 0),\n };\n const dataSize = this.data.columnNames.length ? this.data.getColumn(this.data.columnNames[0]).length : 0;\n const cellsRenderingMode = this.settings.cellsRenderingMode ?? (dataSize > MAX_SVG_RENDERED_CELLS_COUNT ? 'canvas' : 'svg');\n \n this.chartRenderer.render(\n this.data,\n id,\n chartSettings,\n facetSettings,\n aes,\n this.calculatedData.groupedCellsData,\n annotations,\n valueColumn,\n dendrogramX,\n dendrogramY,\n this.calculatedData.dendrogramsData,\n inheritedDendrogramAes,\n this.calculatedData.cellUniqValues,\n normalization,\n this.onTooltipHintSwitch,\n customOrder,\n cellsRenderingMode\n );\n }\n}\n"],"names":["ChartHeatmap","AbstractChart","data","settings","eventHandlers","__publicField","ChartRenderer","HeatmapSettingsImpl","node","err","previousSettings","previousData","_field","_value","renderToString","prevSettings","xColumn","yColumn","valueColumn","xGroupBy","yGroupBy","facetBy","annotations","chartSettings","facetSettings","dendrogramX","dendrogramY","normalization","aggregation","NAValueAs","prevDendrogramXColumns","_a","isColumnName","currentDendrogramXColumns","prevDendrogramYColumns","_b","currentDendrogramYColumns","compareColumnGroups","columns1","columns2","column","idx","a","_c","_d","_e","_f","_g","_h","_i","_j","_k","_l","_m","_n","_o","prevData","prevKeys","keys","u","key","keysOrder","groupedCellsData","getCells","dendrogramsData","getDendrograms","cellUniqValues","id","aes","inheritedDendrogramAes","customOrder","v","dataSize","cellsRenderingMode","MAX_SVG_RENDERED_CELLS_COUNT"],"mappings":"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","x_google_ignoreList":[0]}
|