@milaboratories/graph-maker 1.1.144 → 1.1.146
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/node_modules/@milaboratories/miplots4/dist/heatmap/getCells.js +64 -64
- package/dist/node_modules/@milaboratories/miplots4/dist/heatmap/getCells.js.map +1 -1
- package/dist/node_modules/@milaboratories/miplots4/dist/heatmap/utils/calculateCaptionTails.js +31 -31
- package/dist/node_modules/@milaboratories/miplots4/dist/heatmap/utils/calculateCaptionTails.js.map +1 -1
- package/dist/node_modules/@milaboratories/miplots4/dist/scatterplot-umap/ChartRenderer.js +135 -135
- package/dist/node_modules/@milaboratories/miplots4/dist/scatterplot-umap/ChartRenderer.js.map +1 -1
- package/package.json +2 -2
|
@@ -3,36 +3,36 @@ import X from "../node_modules/d3-array/src/deviation.js";
|
|
|
3
3
|
import _ from "../node_modules/d3-array/src/mean.js";
|
|
4
4
|
import Y from "../node_modules/d3-array/src/extent.js";
|
|
5
5
|
const Z = 5e5;
|
|
6
|
-
function I(
|
|
7
|
-
const n = X(
|
|
8
|
-
return n === void 0 || y === void 0 || n === 0 ? (
|
|
6
|
+
function I(l) {
|
|
7
|
+
const n = X(l), y = _(l);
|
|
8
|
+
return n === void 0 || y === void 0 || n === 0 ? (f) => f : (f) => (f - y) / n;
|
|
9
9
|
}
|
|
10
|
-
function J(
|
|
11
|
-
const n = _(
|
|
12
|
-
return n === void 0 || y === void 0 ||
|
|
10
|
+
function J(l) {
|
|
11
|
+
const n = _(l), [y, f] = Y(l);
|
|
12
|
+
return n === void 0 || y === void 0 || f === void 0 || f === y ? (i) => i : (i) => (i - n) / (f - y);
|
|
13
13
|
}
|
|
14
|
-
function P(
|
|
15
|
-
return
|
|
14
|
+
function P(l, n) {
|
|
15
|
+
return l === "standardScaling" ? I(n) : l === "meanNormalization" ? J(n) : (y) => y;
|
|
16
16
|
}
|
|
17
|
-
function b(
|
|
18
|
-
if (!
|
|
17
|
+
function b(l) {
|
|
18
|
+
if (!l.length)
|
|
19
19
|
return [];
|
|
20
20
|
let n = [[]];
|
|
21
|
-
return
|
|
22
|
-
const
|
|
23
|
-
y.forEach((
|
|
24
|
-
|
|
25
|
-
}), n =
|
|
21
|
+
return l.forEach((y) => {
|
|
22
|
+
const f = [];
|
|
23
|
+
y.forEach((i) => {
|
|
24
|
+
f.push(...n.map((x) => [...x, i]));
|
|
25
|
+
}), n = f;
|
|
26
26
|
}), n;
|
|
27
27
|
}
|
|
28
|
-
function ue(
|
|
29
|
-
const D =
|
|
28
|
+
function ue(l, n, y, f, i, x, B, L, z, N, E, O) {
|
|
29
|
+
const D = l.columnNames.length ? l.getColumn(l.columnNames[0]).length : 0;
|
|
30
30
|
D > Z && console.error(`Too many cells for graph rendering (${D})`);
|
|
31
|
-
const T =
|
|
31
|
+
const T = i.length ? i.map((e) => l.getColumnCategories(e.value)) : [["null"]], k = x.length ? x.map((e) => l.getColumnCategories(e.value)) : [["null"]], A = B.length ? B.map((e) => l.getColumnCategories(e.value)) : [["null"]], $ = b(T), j = b(k), w = b(A), M = $.map((e) => e.join("_")), G = j.map((e) => e.join("_")), d = w.map((e) => e.join("_")), a = {
|
|
32
32
|
meta: {
|
|
33
33
|
facetKeys: M,
|
|
34
|
-
xGroupKeys:
|
|
35
|
-
yGroupKeys:
|
|
34
|
+
xGroupKeys: G,
|
|
35
|
+
yGroupKeys: d,
|
|
36
36
|
xKeysByGroups: {},
|
|
37
37
|
yKeysByGroups: {},
|
|
38
38
|
xLabels: {},
|
|
@@ -41,93 +41,93 @@ function ue(t, n, y, c, f, h, g, L, z, N, B, O) {
|
|
|
41
41
|
yGroupLabels: {},
|
|
42
42
|
xDataByKeys: {},
|
|
43
43
|
yDataByKeys: {},
|
|
44
|
-
facetKeyValues: M.reduce((e,
|
|
45
|
-
xGroupKeyValues:
|
|
46
|
-
yGroupKeyValues:
|
|
44
|
+
facetKeyValues: M.reduce((e, t, o) => (e[t] = $[o], e), {}),
|
|
45
|
+
xGroupKeyValues: G.reduce((e, t, o) => (e[t] = j[o], e), {}),
|
|
46
|
+
yGroupKeyValues: d.reduce((e, t, o) => (e[t] = w[o], e), {}),
|
|
47
47
|
valueExtent: [1 / 0, -1 / 0]
|
|
48
48
|
},
|
|
49
49
|
facets: {}
|
|
50
50
|
}, q = n.valueLabels ?? n.value, S = y.valueLabels ?? y.value, F = L.filter((e) => e.axis === "x").map((e) => e.valueColumn.value), H = L.filter((e) => e.axis === "y").map((e) => e.valueColumn.value), Q = Object.values(z ?? {}).map((e) => e.value), R = Object.values(N ?? {}).map((e) => e.value), U = v.uniq([...F, ...Q, q]), W = v.uniq([...H, ...R, S]);
|
|
51
|
-
for (let e = 0; e <
|
|
52
|
-
const
|
|
53
|
-
a.meta.xGroupLabels[o] = V, a.meta.yGroupLabels[
|
|
54
|
-
const s = String(
|
|
55
|
-
if (s === "null" || r === "null" ||
|
|
51
|
+
for (let e = 0; e < l.rowsCount; e++) {
|
|
52
|
+
const t = i.length ? i.map((u) => l.getColumnValue(u.value, e)).join("_") : "null", o = x.length ? x.map((u) => l.getColumnValue(u.value, e)).join("_") : "null", g = B.length ? B.map((u) => l.getColumnValue(u.value, e)).join("_") : "null", V = x.length ? x.map((u) => l.getColumnValue(u.valueLabels ?? u.value, e)).join(", ") : "", C = B.length ? B.map((u) => l.getColumnValue(u.valueLabels ?? u.value, e)).join(", ") : "";
|
|
53
|
+
a.meta.xGroupLabels[o] = V, a.meta.yGroupLabels[g] = C;
|
|
54
|
+
const s = String(l.getColumnValue(n.value, e)), r = String(l.getColumnValue(y.value, e)), m = l.getColumnValue(f.value, e) ?? O;
|
|
55
|
+
if (s === "null" || r === "null" || m === null)
|
|
56
56
|
continue;
|
|
57
|
-
if (a.facets[
|
|
57
|
+
if (a.facets[t] || (a.facets[t] = {
|
|
58
58
|
xKeys: [],
|
|
59
59
|
yKeys: [],
|
|
60
60
|
xKeysByGroups: {},
|
|
61
61
|
yKeysByGroups: {},
|
|
62
62
|
cells: {}
|
|
63
|
-
}), a.facets[
|
|
63
|
+
}), a.facets[t].xKeysByGroups[o] || (a.facets[t].xKeysByGroups[o] = []), a.facets[t].yKeysByGroups[g] || (a.facets[t].yKeysByGroups[g] = []), a.facets[t].xKeys.push(s), a.facets[t].yKeys.push(r), a.facets[t].xKeysByGroups[o].push(s), a.facets[t].yKeysByGroups[g].push(r), a.facets[t].cells[s] || (a.facets[t].cells[s] = {}), a.meta.valueExtent[0] = Math.min(m, a.meta.valueExtent[0]), a.meta.valueExtent[1] = Math.max(m, a.meta.valueExtent[1]), a.facets[t].cells[s][r] && a.facets[t].cells[s][r].value !== m)
|
|
64
64
|
throw Error(`More than 1 value for x=${s}, y=${r}`);
|
|
65
|
-
const
|
|
66
|
-
if (a.meta.xLabels[s] && String(
|
|
65
|
+
const K = l.getColumnValue(q, e);
|
|
66
|
+
if (a.meta.xLabels[s] && String(K) !== a.meta.xLabels[s])
|
|
67
67
|
throw Error(`More than 1 x-label value for x=${s}`);
|
|
68
|
-
const p =
|
|
68
|
+
const p = l.getColumnValue(S, e);
|
|
69
69
|
if (a.meta.yLabels[r] && String(p) !== a.meta.yLabels[r])
|
|
70
70
|
throw Error(`More than 1 y-label value for y=${r}`);
|
|
71
|
-
a.meta.xLabels[s] = String(
|
|
72
|
-
const
|
|
73
|
-
if (
|
|
71
|
+
a.meta.xLabels[s] = String(K), a.meta.yLabels[r] = String(p), U.forEach((u) => {
|
|
72
|
+
const c = typeof a.meta.xDataByKeys[u] < "u", h = c && typeof a.meta.xDataByKeys[u][s] < "u";
|
|
73
|
+
if (c || (a.meta.xDataByKeys[u] = {}), h && a.meta.xDataByKeys[u][s] !== l.getColumnValue(u, e))
|
|
74
74
|
throw Error(`More than 1 value for x = ${s} and column = ${u}`);
|
|
75
|
-
|
|
75
|
+
h || (a.meta.xDataByKeys[u][s] = l.getColumnValue(u, e));
|
|
76
76
|
}), W.forEach((u) => {
|
|
77
|
-
const
|
|
78
|
-
if (
|
|
77
|
+
const c = typeof a.meta.yDataByKeys[u] < "u", h = c && typeof a.meta.yDataByKeys[u][r] < "u";
|
|
78
|
+
if (c || (a.meta.yDataByKeys[u] = {}), h && a.meta.yDataByKeys[u][r] !== l.getColumnValue(u, e))
|
|
79
79
|
throw Error(`More than 1 value for y = ${r} and column = ${u}`);
|
|
80
|
-
|
|
81
|
-
}), a.facets[
|
|
80
|
+
h || (a.meta.yDataByKeys[u][r] = l.getColumnValue(u, e));
|
|
81
|
+
}), a.facets[t].cells[s][r] = {
|
|
82
82
|
isCell: !0,
|
|
83
83
|
idx: e,
|
|
84
84
|
id: `${s}_${r}`,
|
|
85
85
|
x: s,
|
|
86
86
|
y: r,
|
|
87
|
-
value:
|
|
88
|
-
normalizedValue:
|
|
87
|
+
value: m,
|
|
88
|
+
normalizedValue: m
|
|
89
89
|
};
|
|
90
90
|
}
|
|
91
91
|
if (a.meta.facetKeys = a.meta.facetKeys.filter((e) => a.facets[e]), a.meta.facetKeys.forEach((e) => {
|
|
92
|
-
const
|
|
93
|
-
|
|
92
|
+
const t = a.facets[e];
|
|
93
|
+
t.xKeys = v.uniq(t.xKeys), t.yKeys = v.uniq(t.yKeys), G.forEach((o) => {
|
|
94
94
|
a.facets[e].xKeysByGroups[o] = v.uniq(
|
|
95
95
|
a.facets[e].xKeysByGroups[o]
|
|
96
96
|
);
|
|
97
|
-
}),
|
|
97
|
+
}), d.forEach((o) => {
|
|
98
98
|
a.facets[e].yKeysByGroups[o] = v.uniq(
|
|
99
99
|
a.facets[e].yKeysByGroups[o]
|
|
100
100
|
);
|
|
101
101
|
});
|
|
102
|
-
}),
|
|
102
|
+
}), E) {
|
|
103
103
|
const e = [1 / 0, -1 / 0];
|
|
104
|
-
a.meta.facetKeys.forEach((
|
|
105
|
-
const { xKeys: o, yKeys:
|
|
104
|
+
a.meta.facetKeys.forEach((t) => {
|
|
105
|
+
const { xKeys: o, yKeys: g, cells: V } = a.facets[t], C = E.direction === "row" ? o : g, s = E.direction === "row" ? g : o, r = E.direction === "row" ? (m, K) => {
|
|
106
106
|
var p;
|
|
107
|
-
return (p = V[
|
|
108
|
-
} : (
|
|
107
|
+
return (p = V[m]) == null ? void 0 : p[K];
|
|
108
|
+
} : (m, K) => {
|
|
109
109
|
var p;
|
|
110
|
-
return (p = V[
|
|
110
|
+
return (p = V[K]) == null ? void 0 : p[m];
|
|
111
111
|
};
|
|
112
|
-
s.forEach((
|
|
113
|
-
const
|
|
112
|
+
s.forEach((m) => {
|
|
113
|
+
const K = [];
|
|
114
114
|
C.forEach((u) => {
|
|
115
|
-
var
|
|
116
|
-
const
|
|
117
|
-
|
|
115
|
+
var c;
|
|
116
|
+
const h = (c = r(u, m)) == null ? void 0 : c.value;
|
|
117
|
+
h !== void 0 && K.push(h);
|
|
118
118
|
});
|
|
119
|
-
const p = P(
|
|
119
|
+
const p = P(E.method, K);
|
|
120
120
|
C.forEach((u) => {
|
|
121
|
-
const
|
|
122
|
-
|
|
121
|
+
const c = r(u, m);
|
|
122
|
+
c !== void 0 && (c.normalizedValue = p(c.value), e[0] = Math.min(c.normalizedValue, e[0]), e[1] = Math.max(c.normalizedValue, e[1]));
|
|
123
123
|
});
|
|
124
124
|
});
|
|
125
125
|
}), a.meta.valueExtent = e;
|
|
126
126
|
}
|
|
127
|
-
return a.meta.xKeysByGroups =
|
|
128
|
-
v.flatten(a.meta.facetKeys.map((o) => a.facets[o].xKeysByGroups[
|
|
129
|
-
), e), {}), a.meta.yKeysByGroups =
|
|
130
|
-
v.flatten(a.meta.facetKeys.map((o) => a.facets[o].yKeysByGroups[
|
|
127
|
+
return a.meta.xKeysByGroups = G.reduce((e, t) => (e[t] = v.uniq(
|
|
128
|
+
v.flatten(a.meta.facetKeys.map((o) => a.facets[o].xKeysByGroups[t]))
|
|
129
|
+
), e), {}), a.meta.yKeysByGroups = d.reduce((e, t) => (e[t] = v.uniq(
|
|
130
|
+
v.flatten(a.meta.facetKeys.map((o) => a.facets[o].yKeysByGroups[t]))
|
|
131
131
|
), e), {}), a.meta.valueExtent[0] === 1 / 0 && (a.meta.valueExtent[0] = 0), a.meta.valueExtent[1] === -1 / 0 && (a.meta.valueExtent[1] = 0), a;
|
|
132
132
|
}
|
|
133
133
|
export {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"getCells.js","sources":["../../../../../../node_modules/@milaboratories/miplots4/src/heatmap/getCells.ts"],"sourcesContent":["import { deviation, extent, mean } from 'd3-array';\nimport lodash from 'lodash';\nimport type { DataFrame } from '../DataFrame';\nimport type { ColumnName, DataValue, NormalizationMethod } from '../types';\nimport type { HeatmapSettingsImpl } from './HeatmapSettingsImpl';\n\nconst MAX_RENDERED_CELLS_COUNT = 500000;\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\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}\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): GroupedCellsData {\n const dataSize = data.columnNames.length ? data.getColumn(data.columnNames[0]).length : 0;\n if (dataSize > MAX_RENDERED_CELLS_COUNT) {\n console.error(`Too many cells for graph rendering (${dataSize})`);\n }\n const facetKeysLists = facetBy.length\n ? facetBy.map(column => data.getColumnCategories(column.value))\n : [['null']];\n const xGroupKeysLists = xGroupBy.length\n ? xGroupBy.map(column => data.getColumnCategories(column.value))\n : [['null']];\n const yGroupKeysLists = yGroupBy.length\n ? yGroupBy.map(column => 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 const result: GroupedCellsData = {\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: facetKeys.reduce((res: Record<string, string[]>, key, index) => {\n res[key] = facetKeysCombinations[index];\n return res;\n }, {}),\n xGroupKeyValues: xGroupKeys.reduce((res: Record<string, string[]>, key, index) => {\n res[key] = xGroupKeysCombinations[index];\n return res;\n }, {}),\n yGroupKeyValues: yGroupKeys.reduce((res: Record<string, string[]>, key, index) => {\n res[key] = yGroupKeysCombinations[index];\n return res;\n }, {}),\n valueExtent: [Infinity, -Infinity],\n },\n facets: {},\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.value);\n const annotationColumnsY = annotations.filter(item => item.axis === 'y').map(item => 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[xGroupKey] = 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]) {\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 facet.xKeys = lodash.uniq(facet.xKeys);\n facet.yKeys = lodash.uniq(facet.yKeys);\n xGroupKeys.forEach(xGroupKey => {\n result.facets[facetKey].xKeysByGroups[xGroupKey] = lodash.uniq(\n result.facets[facetKey].xKeysByGroups[xGroupKey]\n );\n });\n yGroupKeys.forEach(yGroupKey => {\n result.facets[facetKey].yKeysByGroups[yGroupKey] = lodash.uniq(\n result.facets[facetKey].yKeysByGroups[yGroupKey]\n );\n });\n });\n\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 // 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 = xGroupKeys.reduce((res: Record<string, string[]>, xGroupKey) => {\n res[xGroupKey] = lodash.uniq(\n lodash.flatten(result.meta.facetKeys.map(facetKey => result.facets[facetKey].xKeysByGroups[xGroupKey]))\n );\n return res;\n }, {});\n result.meta.yKeysByGroups = yGroupKeys.reduce((res: Record<string, string[]>, yGroupKey) => {\n res[yGroupKey] = lodash.uniq(\n lodash.flatten(result.meta.facetKeys.map(facetKey => result.facets[facetKey].yKeysByGroups[yGroupKey]))\n );\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":["MAX_RENDERED_CELLS_COUNT","normalizeByStd","values","stdValue","deviation","meanValue","mean","v","normalizeByMinMax","min","max","extent","getNormalizationFn","method","getKeysCombinations","keysLists","result","keys","nextResult","key","resultItem","getCells","data","xColumn","yColumn","valueColumn","facetBy","xGroupBy","yGroupBy","annotations","dendrogramX","dendrogramY","normalization","NAValueAs","dataSize","facetKeysLists","column","xGroupKeysLists","yGroupKeysLists","facetKeysCombinations","xGroupKeysCombinations","yGroupKeysCombinations","facetKeys","xGroupKeys","yGroupKeys","res","index","xLabelsSource","yLabelsSource","annotationColumnsX","item","annotationColumnsY","dendrogramXColumns","dendrogramYColumns","additionalDataColumnsX","lodash","additionalDataColumnsY","i","facetKey","xGroupKey","yGroupKey","xGroupLabel","yGroupLabel","n","x","y","value","xLabelsSourceValue","yLabelsSourceValue","columnKey","isAddedColumn","isAddedValue","facet","valueExtent","xKeys","yKeys","cells","cellKeys","groupKeys","cellGetter","cellKey","groupKey","_a","normalize","cell"],"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 { deviation, extent, mean } from 'd3-array';\nimport lodash from 'lodash';\nimport type { DataFrame } from '../DataFrame';\nimport type { ColumnName, DataValue, NormalizationMethod } from '../types';\nimport type { HeatmapSettingsImpl } from './HeatmapSettingsImpl';\n\nconst MAX_RENDERED_CELLS_COUNT = 500000;\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\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}\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): GroupedCellsData {\n const dataSize = data.columnNames.length ? data.getColumn(data.columnNames[0]).length : 0;\n if (dataSize > MAX_RENDERED_CELLS_COUNT) {\n console.error(`Too many cells for graph rendering (${dataSize})`);\n }\n const facetKeysLists = facetBy.length\n ? facetBy.map(column => data.getColumnCategories(column.value))\n : [['null']];\n const xGroupKeysLists = xGroupBy.length\n ? xGroupBy.map(column => data.getColumnCategories(column.value))\n : [['null']];\n const yGroupKeysLists = yGroupBy.length\n ? yGroupBy.map(column => 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 const result: GroupedCellsData = {\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: facetKeys.reduce((res: Record<string, string[]>, key, index) => {\n res[key] = facetKeysCombinations[index];\n return res;\n }, {}),\n xGroupKeyValues: xGroupKeys.reduce((res: Record<string, string[]>, key, index) => {\n res[key] = xGroupKeysCombinations[index];\n return res;\n }, {}),\n yGroupKeyValues: yGroupKeys.reduce((res: Record<string, string[]>, key, index) => {\n res[key] = yGroupKeysCombinations[index];\n return res;\n }, {}),\n valueExtent: [Infinity, -Infinity],\n },\n facets: {},\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.value);\n const annotationColumnsY = annotations.filter(item => item.axis === 'y').map(item => 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 facet.xKeys = lodash.uniq(facet.xKeys);\n facet.yKeys = lodash.uniq(facet.yKeys);\n xGroupKeys.forEach(xGroupKey => {\n result.facets[facetKey].xKeysByGroups[xGroupKey] = lodash.uniq(\n result.facets[facetKey].xKeysByGroups[xGroupKey]\n );\n });\n yGroupKeys.forEach(yGroupKey => {\n result.facets[facetKey].yKeysByGroups[yGroupKey] = lodash.uniq(\n result.facets[facetKey].yKeysByGroups[yGroupKey]\n );\n });\n });\n\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 // 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 = xGroupKeys.reduce((res: Record<string, string[]>, xGroupKey) => {\n res[xGroupKey] = lodash.uniq(\n lodash.flatten(result.meta.facetKeys.map(facetKey => result.facets[facetKey].xKeysByGroups[xGroupKey]))\n );\n return res;\n }, {});\n result.meta.yKeysByGroups = yGroupKeys.reduce((res: Record<string, string[]>, yGroupKey) => {\n res[yGroupKey] = lodash.uniq(\n lodash.flatten(result.meta.facetKeys.map(facetKey => result.facets[facetKey].yKeysByGroups[yGroupKey]))\n );\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":["MAX_RENDERED_CELLS_COUNT","normalizeByStd","values","stdValue","deviation","meanValue","mean","v","normalizeByMinMax","min","max","extent","getNormalizationFn","method","getKeysCombinations","keysLists","result","keys","nextResult","key","resultItem","getCells","data","xColumn","yColumn","valueColumn","facetBy","xGroupBy","yGroupBy","annotations","dendrogramX","dendrogramY","normalization","NAValueAs","dataSize","facetKeysLists","column","xGroupKeysLists","yGroupKeysLists","facetKeysCombinations","xGroupKeysCombinations","yGroupKeysCombinations","facetKeys","xGroupKeys","yGroupKeys","res","index","xLabelsSource","yLabelsSource","annotationColumnsX","item","annotationColumnsY","dendrogramXColumns","dendrogramYColumns","additionalDataColumnsX","lodash","additionalDataColumnsY","i","facetKey","xGroupKey","yGroupKey","xGroupLabel","yGroupLabel","n","x","y","value","xLabelsSourceValue","yLabelsSourceValue","columnKey","isAddedColumn","isAddedValue","facet","valueExtent","xKeys","yKeys","cells","cellKeys","groupKeys","cellGetter","cellKey","groupKey","_a","normalize","cell"],"mappings":"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","x_google_ignoreList":[0]}
|
package/dist/node_modules/@milaboratories/miplots4/dist/heatmap/utils/calculateCaptionTails.js
CHANGED
|
@@ -1,38 +1,38 @@
|
|
|
1
1
|
import { MIN_STEP_FOR_VISIBLE_LABELS as I } from "../constants.js";
|
|
2
2
|
const d = Math.cos(Math.PI / 4);
|
|
3
|
-
function E(e,
|
|
4
|
-
const
|
|
3
|
+
function E(e, p, n, c, u, x, s, M, B, K) {
|
|
4
|
+
const f = x[e], T = f > I;
|
|
5
5
|
let l = 0;
|
|
6
|
-
return
|
|
7
|
-
const
|
|
8
|
-
if (
|
|
6
|
+
return p.forEach((i) => {
|
|
7
|
+
const y = u(e, i);
|
|
8
|
+
if (y.length === 0)
|
|
9
9
|
return 0;
|
|
10
|
-
const a =
|
|
11
|
-
const b =
|
|
12
|
-
return Math.max(L, K.getTextWidth(b) * d -
|
|
10
|
+
const a = y.length * f / 2, o = M ? K.getTextWidth(n[i] ?? i) * d - a - s(y[0]) : 0, G = B && T ? p.reduce((L, h) => {
|
|
11
|
+
const b = c[h];
|
|
12
|
+
return Math.max(L, K.getTextWidth(b) * d - f / 2 - s(h));
|
|
13
13
|
}, 0) : 0;
|
|
14
14
|
l = Math.max(l, o, G);
|
|
15
15
|
}), l;
|
|
16
16
|
}
|
|
17
|
-
function g(e,
|
|
18
|
-
const { facetKeys: s, xGroupKeys: M, yGroupKeys: B, xKeysByGroups: K, yKeysByGroups:
|
|
17
|
+
function g(e, p, n, c, u, x) {
|
|
18
|
+
const { facetKeys: s, xGroupKeys: M, yGroupKeys: B, xKeysByGroups: K, yKeysByGroups: f, xLabels: T, yLabels: l, xGroupLabels: i, yGroupLabels: y } = u.meta;
|
|
19
19
|
let a = 0, o = 0;
|
|
20
20
|
const G = e.xGroupLabels === 45, L = e.xAxisLabels === 45;
|
|
21
21
|
if (G || L)
|
|
22
|
-
if (!
|
|
22
|
+
if (!p.sharedX)
|
|
23
23
|
s.forEach((t) => {
|
|
24
24
|
a = Math.max(
|
|
25
25
|
E(
|
|
26
26
|
t,
|
|
27
27
|
M,
|
|
28
|
-
|
|
28
|
+
i,
|
|
29
29
|
T,
|
|
30
|
-
(m, r) =>
|
|
31
|
-
|
|
30
|
+
(m, r) => u.facets[m].xKeysByGroups[r],
|
|
31
|
+
c.x,
|
|
32
32
|
n.x[t],
|
|
33
33
|
G,
|
|
34
34
|
L,
|
|
35
|
-
|
|
35
|
+
x
|
|
36
36
|
),
|
|
37
37
|
a
|
|
38
38
|
);
|
|
@@ -43,34 +43,34 @@ function g(e, y, n, x, h, c) {
|
|
|
43
43
|
E(
|
|
44
44
|
t,
|
|
45
45
|
M,
|
|
46
|
-
|
|
46
|
+
i,
|
|
47
47
|
T,
|
|
48
48
|
(m, r) => K[r],
|
|
49
|
-
|
|
49
|
+
c.x,
|
|
50
50
|
n.x[t],
|
|
51
51
|
G,
|
|
52
52
|
L,
|
|
53
|
-
|
|
53
|
+
x
|
|
54
54
|
),
|
|
55
55
|
a
|
|
56
56
|
);
|
|
57
57
|
}
|
|
58
|
-
const
|
|
59
|
-
if (
|
|
60
|
-
if (!
|
|
58
|
+
const h = e.yGroupLabels === 45, b = e.yAxisLabels === 45;
|
|
59
|
+
if (h || b)
|
|
60
|
+
if (!p.sharedY)
|
|
61
61
|
s.forEach((t) => {
|
|
62
62
|
o = Math.max(
|
|
63
63
|
E(
|
|
64
64
|
t,
|
|
65
65
|
B,
|
|
66
|
-
|
|
66
|
+
y,
|
|
67
67
|
l,
|
|
68
|
-
(m, r) =>
|
|
69
|
-
|
|
68
|
+
(m, r) => u.facets[m].yKeysByGroups[r],
|
|
69
|
+
c.y,
|
|
70
70
|
n.y[t],
|
|
71
|
-
|
|
71
|
+
h,
|
|
72
72
|
b,
|
|
73
|
-
|
|
73
|
+
x
|
|
74
74
|
),
|
|
75
75
|
o
|
|
76
76
|
);
|
|
@@ -81,14 +81,14 @@ function g(e, y, n, x, h, c) {
|
|
|
81
81
|
E(
|
|
82
82
|
t,
|
|
83
83
|
B,
|
|
84
|
-
|
|
84
|
+
y,
|
|
85
85
|
l,
|
|
86
|
-
(m, r) =>
|
|
87
|
-
|
|
86
|
+
(m, r) => f[r],
|
|
87
|
+
c.y,
|
|
88
88
|
n.y[t],
|
|
89
|
-
|
|
89
|
+
h,
|
|
90
90
|
b,
|
|
91
|
-
|
|
91
|
+
x
|
|
92
92
|
),
|
|
93
93
|
o
|
|
94
94
|
);
|
package/dist/node_modules/@milaboratories/miplots4/dist/heatmap/utils/calculateCaptionTails.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"calculateCaptionTails.js","sources":["../../../../../../../node_modules/@milaboratories/miplots4/src/heatmap/utils/calculateCaptionTails.ts"],"sourcesContent":["import type { TextMeasurer } from '../../utils/TextMeasurer/TextMeasurer';\nimport type { ChartsScales, LabelAngles } from '../components/types';\nimport { MIN_STEP_FOR_VISIBLE_LABELS } from '../constants';\nimport type { GroupedCellsData } from '../getCells';\nimport type { HeatmapSettingsImpl } from '../HeatmapSettingsImpl';\n\nconst COS_PI_4 = Math.cos(Math.PI / 4);\nfunction getTailByFacetKey (\n facetKey: string,\n groupKeys: string[],\n groupLabels: Record<string, string>,\n valueLabels: Record<string, string>,\n getKeysInGroup: (facetKey:string, groupKey:string) => string[],\n steps: Record<string, number>,\n scale: (v:string) => number,\n groupTitleInclined: boolean,\n labelTitleInclined: boolean,\n textMeasurer: TextMeasurer\n): number {\n const step = steps[facetKey];\n const labelsVisible = step > MIN_STEP_FOR_VISIBLE_LABELS;\n\n let maxTail = 0;\n groupKeys.forEach((groupKey) => {\n const keysInGroup = getKeysInGroup(facetKey, groupKey);\n if (keysInGroup.length === 0) {\n return 0;\n }\n const groupHalfWidth = (keysInGroup.length * step) / 2;\n const groupTail = groupTitleInclined\n ? textMeasurer.getTextWidth(groupLabels[groupKey]) * COS_PI_4 - groupHalfWidth - scale(keysInGroup[0])\n : 0;\n const labelTail = labelTitleInclined && labelsVisible\n ? groupKeys.reduce((res, key) => {\n const label = valueLabels[key];\n return Math.max(res, textMeasurer.getTextWidth(label) * COS_PI_4 - step / 2 - scale(key));\n }, 0)\n : 0;\n maxTail = Math.max(maxTail, groupTail, labelTail);\n });\n return maxTail;\n}\n\nexport function calculateCaptionTails(\n labelAngles: LabelAngles,\n facetSettings: HeatmapSettingsImpl['facetSettings'],\n scales: ChartsScales,\n steps: {\n x: Record<string, number>;\n y: Record<string, number>;\n },\n groupedCells: GroupedCellsData,\n textMeasurer: TextMeasurer\n): {xCaptionTail: number; yCaptionTail: number} {\n const {facetKeys, xGroupKeys, yGroupKeys, xKeysByGroups, yKeysByGroups, xLabels, yLabels, xGroupLabels, yGroupLabels} = groupedCells.meta;\n let xCaptionTail = 0;\n let yCaptionTail = 0;\n // tails from 45deg inclined captions of groups titles/cells labels, that take place on adjacent padding\n const xGroupTitleInclined = labelAngles.xGroupLabels === 45;\n const xLabelsInclined = labelAngles.xAxisLabels === 45;\n if (xGroupTitleInclined || xLabelsInclined) {\n if (!facetSettings.sharedX) {\n facetKeys.forEach(facetKey => {\n xCaptionTail = Math.max(\n getTailByFacetKey(\n facetKey,\n xGroupKeys,\n xGroupLabels,\n xLabels,\n (facetKey:string, groupKey:string) => groupedCells.facets[facetKey].xKeysByGroups[groupKey],\n steps.x,\n scales.x[facetKey],\n xGroupTitleInclined,\n xLabelsInclined,\n textMeasurer\n ),\n xCaptionTail\n );\n });\n } else {\n const facetKey = facetKeys[0]; // there is no difference between facets in this case\n xCaptionTail = Math.max(\n getTailByFacetKey(\n facetKey,\n xGroupKeys,\n xGroupLabels,\n xLabels,\n (facetKey:string, groupKey:string) => xKeysByGroups[groupKey],\n steps.x,\n scales.x[facetKey],\n xGroupTitleInclined,\n xLabelsInclined,\n textMeasurer\n ),\n xCaptionTail\n );\n }\n }\n const yGroupTitleInclined = labelAngles.yGroupLabels === 45;\n const yLabelsInclined = labelAngles.yAxisLabels === 45;\n if (yGroupTitleInclined || yLabelsInclined) {\n if (!facetSettings.sharedY) {\n facetKeys.forEach(facetKey => {\n yCaptionTail = Math.max(\n getTailByFacetKey(\n facetKey,\n yGroupKeys,\n yGroupLabels,\n yLabels,\n (facetKey:string, groupKey:string) => groupedCells.facets[facetKey].yKeysByGroups[groupKey],\n steps.y,\n scales.y[facetKey],\n yGroupTitleInclined,\n yLabelsInclined,\n textMeasurer\n ),\n yCaptionTail\n );\n });\n } else {\n const facetKey = facetKeys[0]; // there is no difference between facets in this case\n yCaptionTail = Math.max(\n getTailByFacetKey(\n facetKey,\n yGroupKeys,\n yGroupLabels,\n yLabels,\n (facetKey:string, groupKey:string) => yKeysByGroups[groupKey],\n steps.y,\n scales.y[facetKey],\n yGroupTitleInclined,\n yLabelsInclined,\n textMeasurer\n ),\n yCaptionTail\n );\n }\n }\n return {xCaptionTail, yCaptionTail};\n}\n"],"names":["COS_PI_4","getTailByFacetKey","facetKey","groupKeys","groupLabels","valueLabels","getKeysInGroup","steps","scale","groupTitleInclined","labelTitleInclined","textMeasurer","step","labelsVisible","MIN_STEP_FOR_VISIBLE_LABELS","maxTail","groupKey","keysInGroup","groupHalfWidth","groupTail","labelTail","res","key","label","calculateCaptionTails","labelAngles","facetSettings","scales","groupedCells","facetKeys","xGroupKeys","yGroupKeys","xKeysByGroups","yKeysByGroups","xLabels","yLabels","xGroupLabels","yGroupLabels","xCaptionTail","yCaptionTail","xGroupTitleInclined","xLabelsInclined","yGroupTitleInclined","yLabelsInclined"],"mappings":";AAMA,MAAMA,IAAW,KAAK,IAAI,KAAK,KAAK,CAAC;AACrC,SAASC,EACLC,GACAC,GACAC,GACAC,GACAC,GACAC,GACAC,GACAC,GACAC,GACAC,GACM;AACN,QAAMC,IAAOL,EAAML,CAAQ,GACrBW,IAAgBD,IAAOE;AAE7B,MAAIC,IAAU;AACd,SAAAZ,EAAU,QAAQ,CAACa,MAAa;AAC5B,UAAMC,IAAcX,EAAeJ,GAAUc,CAAQ;AACrD,QAAIC,EAAY,WAAW;AACvB,aAAO;AAEX,UAAMC,IAAkBD,EAAY,SAASL,IAAQ,GAC/CO,IAAYV,IACZE,EAAa,aAAaP,EAAYY,CAAQ,
|
|
1
|
+
{"version":3,"file":"calculateCaptionTails.js","sources":["../../../../../../../node_modules/@milaboratories/miplots4/src/heatmap/utils/calculateCaptionTails.ts"],"sourcesContent":["import type { TextMeasurer } from '../../utils/TextMeasurer/TextMeasurer';\nimport type { ChartsScales, LabelAngles } from '../components/types';\nimport { MIN_STEP_FOR_VISIBLE_LABELS } from '../constants';\nimport type { GroupedCellsData } from '../getCells';\nimport type { HeatmapSettingsImpl } from '../HeatmapSettingsImpl';\n\nconst COS_PI_4 = Math.cos(Math.PI / 4);\nfunction getTailByFacetKey (\n facetKey: string,\n groupKeys: string[],\n groupLabels: Record<string, string>,\n valueLabels: Record<string, string>,\n getKeysInGroup: (facetKey:string, groupKey:string) => string[],\n steps: Record<string, number>,\n scale: (v:string) => number,\n groupTitleInclined: boolean,\n labelTitleInclined: boolean,\n textMeasurer: TextMeasurer\n): number {\n const step = steps[facetKey];\n const labelsVisible = step > MIN_STEP_FOR_VISIBLE_LABELS;\n\n let maxTail = 0;\n groupKeys.forEach((groupKey) => {\n const keysInGroup = getKeysInGroup(facetKey, groupKey);\n if (keysInGroup.length === 0) {\n return 0;\n }\n const groupHalfWidth = (keysInGroup.length * step) / 2;\n const groupTail = groupTitleInclined\n ? textMeasurer.getTextWidth(groupLabels[groupKey] ?? groupKey) * COS_PI_4 - groupHalfWidth - scale(keysInGroup[0])\n : 0;\n const labelTail = labelTitleInclined && labelsVisible\n ? groupKeys.reduce((res, key) => {\n const label = valueLabels[key];\n return Math.max(res, textMeasurer.getTextWidth(label) * COS_PI_4 - step / 2 - scale(key));\n }, 0)\n : 0;\n maxTail = Math.max(maxTail, groupTail, labelTail);\n });\n return maxTail;\n}\n\nexport function calculateCaptionTails(\n labelAngles: LabelAngles,\n facetSettings: HeatmapSettingsImpl['facetSettings'],\n scales: ChartsScales,\n steps: {\n x: Record<string, number>;\n y: Record<string, number>;\n },\n groupedCells: GroupedCellsData,\n textMeasurer: TextMeasurer\n): {xCaptionTail: number; yCaptionTail: number} {\n const {facetKeys, xGroupKeys, yGroupKeys, xKeysByGroups, yKeysByGroups, xLabels, yLabels, xGroupLabels, yGroupLabels} = groupedCells.meta;\n let xCaptionTail = 0;\n let yCaptionTail = 0;\n // tails from 45deg inclined captions of groups titles/cells labels, that take place on adjacent padding\n const xGroupTitleInclined = labelAngles.xGroupLabels === 45;\n const xLabelsInclined = labelAngles.xAxisLabels === 45;\n if (xGroupTitleInclined || xLabelsInclined) {\n if (!facetSettings.sharedX) {\n facetKeys.forEach(facetKey => {\n xCaptionTail = Math.max(\n getTailByFacetKey(\n facetKey,\n xGroupKeys,\n xGroupLabels,\n xLabels,\n (facetKey:string, groupKey:string) => groupedCells.facets[facetKey].xKeysByGroups[groupKey],\n steps.x,\n scales.x[facetKey],\n xGroupTitleInclined,\n xLabelsInclined,\n textMeasurer\n ),\n xCaptionTail\n );\n });\n } else {\n const facetKey = facetKeys[0]; // there is no difference between facets in this case\n xCaptionTail = Math.max(\n getTailByFacetKey(\n facetKey,\n xGroupKeys,\n xGroupLabels,\n xLabels,\n (facetKey:string, groupKey:string) => xKeysByGroups[groupKey],\n steps.x,\n scales.x[facetKey],\n xGroupTitleInclined,\n xLabelsInclined,\n textMeasurer\n ),\n xCaptionTail\n );\n }\n }\n const yGroupTitleInclined = labelAngles.yGroupLabels === 45;\n const yLabelsInclined = labelAngles.yAxisLabels === 45;\n if (yGroupTitleInclined || yLabelsInclined) {\n if (!facetSettings.sharedY) {\n facetKeys.forEach(facetKey => {\n yCaptionTail = Math.max(\n getTailByFacetKey(\n facetKey,\n yGroupKeys,\n yGroupLabels,\n yLabels,\n (facetKey:string, groupKey:string) => groupedCells.facets[facetKey].yKeysByGroups[groupKey],\n steps.y,\n scales.y[facetKey],\n yGroupTitleInclined,\n yLabelsInclined,\n textMeasurer\n ),\n yCaptionTail\n );\n });\n } else {\n const facetKey = facetKeys[0]; // there is no difference between facets in this case\n yCaptionTail = Math.max(\n getTailByFacetKey(\n facetKey,\n yGroupKeys,\n yGroupLabels,\n yLabels,\n (facetKey:string, groupKey:string) => yKeysByGroups[groupKey],\n steps.y,\n scales.y[facetKey],\n yGroupTitleInclined,\n yLabelsInclined,\n textMeasurer\n ),\n yCaptionTail\n );\n }\n }\n return {xCaptionTail, yCaptionTail};\n}\n"],"names":["COS_PI_4","getTailByFacetKey","facetKey","groupKeys","groupLabels","valueLabels","getKeysInGroup","steps","scale","groupTitleInclined","labelTitleInclined","textMeasurer","step","labelsVisible","MIN_STEP_FOR_VISIBLE_LABELS","maxTail","groupKey","keysInGroup","groupHalfWidth","groupTail","labelTail","res","key","label","calculateCaptionTails","labelAngles","facetSettings","scales","groupedCells","facetKeys","xGroupKeys","yGroupKeys","xKeysByGroups","yKeysByGroups","xLabels","yLabels","xGroupLabels","yGroupLabels","xCaptionTail","yCaptionTail","xGroupTitleInclined","xLabelsInclined","yGroupTitleInclined","yLabelsInclined"],"mappings":"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","x_google_ignoreList":[0]}
|
|
@@ -9,13 +9,13 @@ import q from "../node_modules/d3-zoom/src/zoom.js";
|
|
|
9
9
|
import "../node_modules/d3-zoom/src/transform.js";
|
|
10
10
|
import { createRoot as X } from "../node_modules/react-dom/client.js";
|
|
11
11
|
import { Error as Y } from "../common/Error.js";
|
|
12
|
-
import { DEFAULT_HEIGHT as w, DEFAULT_WIDTH as
|
|
12
|
+
import { DEFAULT_HEIGHT as w, DEFAULT_WIDTH as D, TITLE_LINE_HEIGHT as Q, BLACK as M, TITLE_MARGIN as J } from "../constants.js";
|
|
13
13
|
import { splitTextByWidth as Z } from "../utils/splitTextByWidth.js";
|
|
14
|
-
import { MIN_MARGIN as
|
|
15
|
-
import { createAesGetter as
|
|
14
|
+
import { MIN_MARGIN as L, DEFAULT_DOT_AES as H } from "../scatterplot/constants.js";
|
|
15
|
+
import { createAesGetter as F } from "../scatterplot/utils/createAesGetter.js";
|
|
16
16
|
import { getTicksAndFormat as tt } from "../scatterplot/utils/getTicksAndFormat.js";
|
|
17
17
|
import { createLabelPositioner as et } from "../scatterplot/utils/getVisibleLabels.js";
|
|
18
|
-
import { isContinuousAes as
|
|
18
|
+
import { isContinuousAes as $ } from "../types/common.js";
|
|
19
19
|
import "../types/discrete.js";
|
|
20
20
|
import "../types/scatterplot.js";
|
|
21
21
|
import "../types/heatmap.js";
|
|
@@ -26,66 +26,67 @@ import { getContinuousColorScale as st } from "../utils/getContinuousColorScale.
|
|
|
26
26
|
import { getContinuousLegendTicks as it } from "../utils/getContinuousLegendTicks.js";
|
|
27
27
|
import { TextMeasurer as G } from "../utils/TextMeasurer/TextMeasurer.js";
|
|
28
28
|
import { SVGLayer as at } from "./components/SVGLayer.js";
|
|
29
|
-
import { PADDINGS as
|
|
30
|
-
import
|
|
31
|
-
import
|
|
29
|
+
import { PADDINGS as E, TITLE_LINE as I, LEGEND_OFFSET as ot } from "./constants.js";
|
|
30
|
+
import rt from "../node_modules/@d3fc/d3fc-pointer/src/pointer.js";
|
|
31
|
+
import lt from "../node_modules/kdbush/index.js";
|
|
32
32
|
import { DataFrameProvider as nt } from "../common/useDataFrame.js";
|
|
33
|
-
import {
|
|
34
|
-
import {
|
|
33
|
+
import { DataFrame as ht } from "../DataFrame.js";
|
|
34
|
+
import { arrangeLegendParts as dt } from "../utils/arrangeLegendParts.js";
|
|
35
|
+
import { stringToNumberRgba as P, getColorWithFakeOpacity as W, GET_BLACK as O } from "./colors.js";
|
|
35
36
|
import T from "../node_modules/d3-scale/src/linear.js";
|
|
36
37
|
import _ from "../node_modules/d3-scale/src/log.js";
|
|
37
38
|
import N from "../node_modules/d3-selection/src/select.js";
|
|
38
|
-
import
|
|
39
|
-
import
|
|
40
|
-
import { sqrt as
|
|
41
|
-
import
|
|
42
|
-
var
|
|
39
|
+
import ct from "../node_modules/d3-scale/src/ordinal.js";
|
|
40
|
+
import mt from "../node_modules/d3-scale/src/symlog.js";
|
|
41
|
+
import { sqrt as pt } from "../node_modules/d3-scale/src/pow.js";
|
|
42
|
+
import ut from "../node_modules/d3-polygon/src/contains.js";
|
|
43
|
+
var gt = Object.defineProperty, yt = (S, t, e) => t in S ? gt(S, t, { enumerable: !0, configurable: !0, writable: !0, value: e }) : S[t] = e, h = (S, t, e) => yt(S, typeof t != "symbol" ? t + "" : t, e);
|
|
43
44
|
function R(S) {
|
|
44
45
|
return S / 2.35 * (S / 2.35) * 64;
|
|
45
46
|
}
|
|
46
47
|
function A(S, t, e) {
|
|
47
|
-
return e.length === 0 ? !0 : e.some((s) => s.closed && s.points.length > 2 &&
|
|
48
|
+
return e.length === 0 ? !0 : e.some((s) => s.closed && s.points.length > 2 && ut(s.points, [S, t]));
|
|
48
49
|
}
|
|
49
50
|
function k(S, t, e) {
|
|
50
|
-
const s = e.find((a) => a.type === "dots"),
|
|
51
|
+
const s = e.find((a) => a.type === "dots"), n = e.find((a) => a.type === "curve");
|
|
51
52
|
return {
|
|
52
|
-
dotFill:
|
|
53
|
-
dotSize:
|
|
54
|
-
lineType:
|
|
53
|
+
dotFill: F(S, t, (s == null ? void 0 : s.aes.dotFill) ?? H.color, "dotFill"),
|
|
54
|
+
dotSize: F(S, t, (s == null ? void 0 : s.aes.dotSize) ?? H.size, "dotSize"),
|
|
55
|
+
lineType: F(S, t, (n == null ? void 0 : n.aes.lineShape) ?? "solid", "lineShape")
|
|
55
56
|
};
|
|
56
57
|
}
|
|
57
|
-
class
|
|
58
|
+
class oe {
|
|
58
59
|
constructor() {
|
|
59
|
-
|
|
60
|
+
h(this, "reactRoot", null), h(this, "parentNode", null), h(this, "rootNode", null), h(this, "canvasNode", null), h(this, "svgLayerElement", null), h(this, "svgLayerComponent", /* @__PURE__ */ b.jsx(b.Fragment, {})), h(this, "aesGetters", {
|
|
60
61
|
dotSize: () => 2,
|
|
61
|
-
dotFill: () =>
|
|
62
|
+
dotFill: () => M,
|
|
62
63
|
lineType: () => "solid"
|
|
63
|
-
}),
|
|
64
|
-
top:
|
|
65
|
-
bottom:
|
|
66
|
-
left:
|
|
67
|
-
right:
|
|
68
|
-
}),
|
|
69
|
-
chartWidth:
|
|
64
|
+
}), h(this, "tools", null), h(this, "margins", {
|
|
65
|
+
top: L,
|
|
66
|
+
bottom: L,
|
|
67
|
+
left: L,
|
|
68
|
+
right: L
|
|
69
|
+
}), h(this, "chartSizes", {
|
|
70
|
+
chartWidth: D,
|
|
70
71
|
// width of single chart
|
|
71
72
|
chartHeight: w,
|
|
72
73
|
// height of single chart
|
|
73
|
-
totalWidth:
|
|
74
|
+
totalWidth: D,
|
|
74
75
|
// width of all charts in charts row, plus left axis, plus legend
|
|
75
76
|
totalHeight: w
|
|
76
77
|
// width of all charts in charts height, plus bottom axis, plus top title
|
|
77
|
-
}),
|
|
78
|
-
x: T().domain([0, 10]).range([0,
|
|
78
|
+
}), h(this, "scales", {
|
|
79
|
+
x: T().domain([0, 10]).range([0, D]),
|
|
79
80
|
y: T().domain([0, 10]).range([w, 0]),
|
|
80
|
-
xOriginal: T().domain([0, 10]).range([0,
|
|
81
|
+
xOriginal: T().domain([0, 10]).range([0, D]),
|
|
81
82
|
yOriginal: T().domain([0, 10]).range([w, 0])
|
|
82
|
-
}),
|
|
83
|
-
}),
|
|
84
|
-
}),
|
|
85
|
-
}),
|
|
83
|
+
}), h(this, "polygons", []), h(this, "onPolygonUpdateOutside", () => {
|
|
84
|
+
}), h(this, "onTooltipHintSwitch", () => {
|
|
85
|
+
}), h(this, "onLassoControlsStateUpdate", () => {
|
|
86
|
+
}), h(this, "zoomTransform", null), h(this, "zoomStateKey", ""), h(this, "selectedDot", null), h(this, "captionsSizes", {
|
|
86
87
|
xAxisCaptionsWidth: 30,
|
|
87
88
|
yAxisCaptionsWidth: 100
|
|
88
|
-
}),
|
|
89
|
+
}), h(this, "mainTitle", []), h(this, "legend", { width: 0, height: 0, items: [] }), h(this, "notCalculatedProps", {}), h(this, "allDots", []), h(this, "visibleLabels", []), h(this, "dataFrame", new ht("", {})), h(this, "onPolygonUpdate", (t) => {
|
|
89
90
|
this.polygons = t, this.updateByLasso();
|
|
90
91
|
const e = this.allDots.filter((s) => A(s.x, s.y, this.polygons)).map((s) => s.idx);
|
|
91
92
|
this.onPolygonUpdateOutside(e, t);
|
|
@@ -105,9 +106,9 @@ class ie {
|
|
|
105
106
|
(t.width !== this.chartSizes.chartWidth || t.height !== this.chartSizes.chartHeight) && (this.chartSizes.chartWidth = t.width, this.chartSizes.chartHeight = t.height, this.scales.x.range([0, this.chartSizes.chartWidth]), this.scales.y.range([this.chartSizes.chartHeight, 0]));
|
|
106
107
|
}
|
|
107
108
|
updateViewport(t, e, s) {
|
|
108
|
-
const
|
|
109
|
-
let { minX: a, minY:
|
|
110
|
-
if (t.lowerValue !== void 0 && (a = Math.max(a, t.lowerValue)), t.upperValue !== void 0 && (u = Math.min(u, t.upperValue)), e.lowerValue !== void 0 && (
|
|
109
|
+
const n = t.scale === "log" ? _() : T();
|
|
110
|
+
let { minX: a, minY: d, maxX: u, maxY: p } = s;
|
|
111
|
+
if (t.lowerValue !== void 0 && (a = Math.max(a, t.lowerValue)), t.upperValue !== void 0 && (u = Math.min(u, t.upperValue)), e.lowerValue !== void 0 && (d = Math.max(d, e.lowerValue)), e.upperValue !== void 0 && (p = Math.min(p, e.upperValue)), t.symmetricRange !== void 0) {
|
|
111
112
|
const o = t.symmetricRange;
|
|
112
113
|
if (o >= a && o <= u) {
|
|
113
114
|
const y = Math.max(o - a, u - o);
|
|
@@ -116,22 +117,22 @@ class ie {
|
|
|
116
117
|
}
|
|
117
118
|
if (typeof e.symmetricRange < "u") {
|
|
118
119
|
const o = e.symmetricRange;
|
|
119
|
-
if (o >=
|
|
120
|
-
const y = Math.max(o -
|
|
121
|
-
|
|
120
|
+
if (o >= d && o <= p) {
|
|
121
|
+
const y = Math.max(o - d, p - o);
|
|
122
|
+
d = o - y, p = o + y;
|
|
122
123
|
}
|
|
123
124
|
}
|
|
124
|
-
const f = [0, this.chartSizes.chartWidth],
|
|
125
|
-
|
|
126
|
-
const
|
|
127
|
-
|
|
125
|
+
const f = [0, this.chartSizes.chartWidth], v = n.copy().domain([a, u]).range([E.LEFT, this.chartSizes.chartWidth - E.RIGHT]);
|
|
126
|
+
n.domain([v.invert(0), v.invert(this.chartSizes.chartWidth)]).range(f).nice(), this.scales.x = n, this.scales.xOriginal = n.copy();
|
|
127
|
+
const c = e.scale === "log" ? _() : T(), r = [this.chartSizes.chartHeight, 0], g = c.copy().domain([d, p]).range([this.chartSizes.chartHeight - E.BOTTOM, E.TOP]);
|
|
128
|
+
c.domain([g.invert(this.chartSizes.chartHeight), g.invert(0)]).range(r).nice(), this.scales.y = c, this.scales.yOriginal = c.copy();
|
|
128
129
|
}
|
|
129
130
|
updateCaptionsSize() {
|
|
130
131
|
const t = new G("600 14px Arial");
|
|
131
|
-
function e(
|
|
132
|
-
return Math.max(...
|
|
132
|
+
function e(d) {
|
|
133
|
+
return Math.max(...d.map((u) => t.getTextWidth(u)));
|
|
133
134
|
}
|
|
134
|
-
const { ticks: s, format:
|
|
135
|
+
const { ticks: s, format: n } = tt(this.scales.y, !1), a = e(s.map(n));
|
|
135
136
|
this.captionsSizes = {
|
|
136
137
|
xAxisCaptionsWidth: 20,
|
|
137
138
|
yAxisCaptionsWidth: a
|
|
@@ -147,90 +148,90 @@ class ie {
|
|
|
147
148
|
updateMargins() {
|
|
148
149
|
const t = Q * this.mainTitle.length, e = t > 0 ? t + J * 2 : 0;
|
|
149
150
|
this.margins = {
|
|
150
|
-
top: Math.max(e,
|
|
151
|
-
bottom:
|
|
152
|
-
left:
|
|
153
|
-
right: this.legend.width +
|
|
151
|
+
top: Math.max(e, L),
|
|
152
|
+
bottom: L + this.captionsSizes.xAxisCaptionsWidth + I,
|
|
153
|
+
left: L + this.captionsSizes.yAxisCaptionsWidth + I,
|
|
154
|
+
right: this.legend.width + L
|
|
154
155
|
}, this.chartSizes.totalWidth = this.margins.left + this.chartSizes.chartWidth + this.margins.right, this.chartSizes.totalHeight = this.margins.top + Math.max(this.chartSizes.chartHeight, this.legend.height) + this.margins.bottom, N(this.canvasNode).style("width", this.chartSizes.chartWidth + "px").style("height", this.chartSizes.chartHeight + "px").style("top", this.margins.top + "px").style("left", this.margins.left + "px");
|
|
155
156
|
}
|
|
156
|
-
updateLegendSize(t, e, s,
|
|
157
|
+
updateLegendSize(t, e, s, n) {
|
|
157
158
|
if (!t.show) {
|
|
158
159
|
this.legend = { width: 0, height: 0, items: [] };
|
|
159
160
|
return;
|
|
160
161
|
}
|
|
161
|
-
const a = [],
|
|
162
|
-
if (s.forEach((
|
|
163
|
-
const
|
|
164
|
-
if (
|
|
162
|
+
const a = [], d = { width: 0, height: 0, left: 0, top: 0 };
|
|
163
|
+
if (s.forEach((c) => {
|
|
164
|
+
const r = e[c.value];
|
|
165
|
+
if (r.usedAes.length === 0 || !r.aesMap)
|
|
165
166
|
return;
|
|
166
167
|
const g = {};
|
|
167
|
-
|
|
168
|
-
g[m] || (g[m] = { ...
|
|
169
|
-
|
|
168
|
+
r.values.forEach((m) => {
|
|
169
|
+
g[m] || (g[m] = { ...H }), r.usedAes.forEach((i) => {
|
|
170
|
+
i === "dotFill" && (g[m].color = r.aesMap(m, i) ?? M), i === "dotSize" && (g[m].size = Number(r.aesMap(m, i) ?? 3));
|
|
170
171
|
});
|
|
171
172
|
});
|
|
172
|
-
const o =
|
|
173
|
-
a.push({ ...
|
|
174
|
-
}),
|
|
175
|
-
if (
|
|
176
|
-
const { domain:
|
|
177
|
-
a.push({ ...
|
|
173
|
+
const o = c.label ?? c.value, y = ct().domain(r.values).range(r.values.map((m) => g[m]));
|
|
174
|
+
a.push({ ...d, id: c.value, type: "dots", title: o, scale: y, values: r.values, labels: r.labels });
|
|
175
|
+
}), n.forEach((c) => {
|
|
176
|
+
if (c.type === "dots" && $(c.aes.dotFill)) {
|
|
177
|
+
const { domain: r, range: g, columnName: o, type: y = "linear" } = c.aes.dotFill, m = o.label ?? o.value, i = st(g, r, "linear"), l = (y === "log" ? mt() : T()).domain(r).range([this.chartSizes.chartHeight, 0]), x = it(l, r);
|
|
178
|
+
a.push({ ...d, id: "dotFill", type: "continuous", title: m, scale: i, tickPositionScale: l, values: x });
|
|
178
179
|
}
|
|
179
|
-
if (
|
|
180
|
-
const { columnName:
|
|
181
|
-
a.push({ ...
|
|
180
|
+
if (c.type === "dots" && $(c.aes.dotSize)) {
|
|
181
|
+
const { columnName: r, domain: g, range: o } = c.aes.dotSize, y = r.label ?? r.value, m = pt(g, o), i = m.ticks(3), l = m.tickFormat(3), x = i.reduce((z, C) => (z[String(C)] = l(C), z), {});
|
|
182
|
+
a.push({ ...d, id: r.value, type: "size", title: y, scale: m, values: i, labels: x });
|
|
182
183
|
}
|
|
183
184
|
}), !a.length) {
|
|
184
185
|
this.legend = { width: 0, height: 0, items: [] };
|
|
185
186
|
return;
|
|
186
187
|
}
|
|
187
|
-
const u =
|
|
188
|
+
const u = dt(a, this.chartSizes.chartHeight), p = u[u.length - 1], f = p.left + p.width + ot, v = this.chartSizes.chartHeight;
|
|
188
189
|
this.legend = {
|
|
189
190
|
width: f,
|
|
190
|
-
height:
|
|
191
|
+
height: v,
|
|
191
192
|
items: u
|
|
192
193
|
};
|
|
193
194
|
}
|
|
194
|
-
initSettings(t, e, s,
|
|
195
|
-
const { xAxis:
|
|
196
|
-
this.updateChartSizes(
|
|
197
|
-
const
|
|
198
|
-
const
|
|
199
|
-
return
|
|
200
|
-
}),
|
|
195
|
+
initSettings(t, e, s, n, a, d) {
|
|
196
|
+
const { xAxis: u, yAxis: p, size: f, title: v, legend: c } = e;
|
|
197
|
+
this.updateChartSizes(f), this.updateViewport(u, p, s), this.updateCaptionsSize(), this.updateLegendSize(c, n, d, a), this.createMainTitle(v), this.updateMargins(), this.aesGetters = k(this.dataFrame, n, a);
|
|
198
|
+
const r = U().data(t).value((i) => {
|
|
199
|
+
const l = P(this.aesGetters.dotFill(i.idx));
|
|
200
|
+
return l[3] = !i.dimmed && A(i.x, i.y, this.polygons) ? 1 : 0.4, W(l, l);
|
|
201
|
+
}), g = V().equals((i, l) => i === l).size((i) => R(this.aesGetters.dotSize(i.idx))).crossValue((i) => i.x).mainValue((i) => i.y).decorate((i) => r(i)), o = q().scaleExtent([0.1, 1e3]).filter((i) => i.type === "wheel" || i.metaKey || i.ctrlKey).on("start", () => {
|
|
201
202
|
this.selectedDot = null;
|
|
202
203
|
}).on("zoom", (i) => {
|
|
203
|
-
const
|
|
204
|
-
this.scales.x.domain(
|
|
204
|
+
const l = i.transform, x = l.rescaleX(this.scales.xOriginal), z = l.rescaleY(this.scales.yOriginal);
|
|
205
|
+
this.scales.x.domain(x.domain()), this.scales.y.domain(z.domain()), this.zoomTransform = l, this.zoomStateKey = `${l.x}_${l.y}_${l.k}`, this.updateLabelsPosition(this.visibleLabels), this.renderSvgLayer(), this.renderWebglLayer();
|
|
205
206
|
}).on("end", () => {
|
|
206
|
-
this.visibleLabels = this.computeLabels(this.allDots), this.renderSvgLayer(
|
|
207
|
-
}),
|
|
208
|
-
var
|
|
209
|
-
let
|
|
210
|
-
i && (
|
|
211
|
-
const
|
|
212
|
-
this.selectedDot =
|
|
213
|
-
}),
|
|
207
|
+
this.visibleLabels = this.computeLabels(this.allDots), this.renderSvgLayer();
|
|
208
|
+
}), y = rt().on("point", ([i]) => {
|
|
209
|
+
var l;
|
|
210
|
+
let x;
|
|
211
|
+
i && (x = this.getClosestDot(i.x, i.y));
|
|
212
|
+
const z = this.selectedDot && !x || !this.selectedDot && x || ((l = this.selectedDot) == null ? void 0 : l.idx) !== (x == null ? void 0 : x.idx);
|
|
213
|
+
this.selectedDot = x ?? null, z && this.renderSvgLayer();
|
|
214
|
+
}), m = B({
|
|
214
215
|
xScale: this.scales.x,
|
|
215
216
|
yScale: this.scales.y
|
|
216
217
|
}).xAxisHeight(() => "0").yAxisWidth(() => "0").svgPlotArea(K()).webglPlotArea(
|
|
217
218
|
// only render the point series on the WebGL layer
|
|
218
|
-
j().series([
|
|
219
|
+
j().series([g]).mapping((i) => i)
|
|
219
220
|
).decorate((i) => {
|
|
220
|
-
const
|
|
221
|
-
|
|
221
|
+
const l = i.enter();
|
|
222
|
+
l && !this.svgLayerElement && (l.style("grid-template-columns", "0 auto 1fr auto 0"), l.style("grid-template-rows", "0 auto 1fr auto 0"), this.svgLayerElement = l.select(".svg-plot-area.plot-area svg").node()), l.select(".svg-plot-area.plot-area").attr("class", "svg-plot-area plot-area miplots-scatterplot-plot-area").call(o).call(y);
|
|
222
223
|
});
|
|
223
224
|
this.tools = {
|
|
224
|
-
webglChart:
|
|
225
|
-
zoom:
|
|
226
|
-
fillColor:
|
|
227
|
-
pointSeries:
|
|
228
|
-
}, N(this.canvasNode).datum(
|
|
225
|
+
webglChart: m,
|
|
226
|
+
zoom: o,
|
|
227
|
+
fillColor: r,
|
|
228
|
+
pointSeries: g
|
|
229
|
+
}, N(this.canvasNode).datum(t).style("position", "absolute").style("width", this.chartSizes.chartWidth + "px").style("height", this.chartSizes.chartHeight + "px").style("top", this.margins.top + "px").style("left", this.margins.left + "px");
|
|
229
230
|
}
|
|
230
|
-
updateAes(t, e
|
|
231
|
-
this.tools !== null && (this.aesGetters = k(t, e
|
|
232
|
-
const
|
|
233
|
-
return
|
|
231
|
+
updateAes(t, e) {
|
|
232
|
+
this.tools !== null && (this.aesGetters = k(this.dataFrame, t, e), this.tools.fillColor.value((s) => {
|
|
233
|
+
const n = this.aesGetters.dotFill ?? O, a = P(n(s.idx));
|
|
234
|
+
return a[3] = !s.dimmed && A(s.x, s.y, this.polygons) ? 1 : 0.4, W(a, a);
|
|
234
235
|
}));
|
|
235
236
|
}
|
|
236
237
|
updatePointSize() {
|
|
@@ -239,62 +240,61 @@ class ie {
|
|
|
239
240
|
updateByLasso() {
|
|
240
241
|
var t;
|
|
241
242
|
this.tools !== null && ((t = this.tools) == null || t.fillColor.value((e) => {
|
|
242
|
-
const s = this.aesGetters.dotFill ?? O,
|
|
243
|
-
return
|
|
243
|
+
const s = this.aesGetters.dotFill ?? O, n = P(s(e.idx));
|
|
244
|
+
return n[3] = !e.dimmed && A(e.x, e.y, this.polygons) ? 1 : 0.4, W(n, n);
|
|
244
245
|
}), this.renderWebglLayer());
|
|
245
246
|
}
|
|
246
247
|
createQuadtree(t) {
|
|
247
|
-
const e = new
|
|
248
|
+
const e = new lt(t.length, 512);
|
|
248
249
|
for (let s = 0; s < t.length; s++)
|
|
249
250
|
e.add(t[s].x, t[s].y);
|
|
250
251
|
return e.finish();
|
|
251
252
|
}
|
|
252
253
|
getClosestDot(t, e) {
|
|
253
|
-
var s,
|
|
254
|
+
var s, n;
|
|
254
255
|
const a = (s = this.tools) == null ? void 0 : s.qt;
|
|
255
256
|
if (!a) return null;
|
|
256
|
-
const
|
|
257
|
-
const
|
|
258
|
-
return (m === null ||
|
|
257
|
+
const d = this.allDots, u = this.scales.x.invert(t), p = this.scales.y.invert(e), f = 1 / (((n = this.zoomTransform) == null ? void 0 : n.k) || 1), v = u - f, c = u + f, r = p - f, g = p + f, o = a.range(v, r, c, g), y = o.reduce((m, i) => {
|
|
258
|
+
const l = d[i], x = this.scales.x(l.x) - t, z = this.scales.y(l.y) - e, C = Math.hypot(x, z);
|
|
259
|
+
return (m === null || C < m.distance) && (m.index = i, m.distance = C), m;
|
|
259
260
|
}, {
|
|
260
261
|
index: -1,
|
|
261
262
|
distance: 1 / 0
|
|
262
263
|
});
|
|
263
|
-
return o.length === 0 || y.index === -1 ? null :
|
|
264
|
+
return o.length === 0 || y.index === -1 ? null : d[y.index];
|
|
264
265
|
}
|
|
265
266
|
updateDots(t) {
|
|
266
267
|
this.tools !== null && (N(this.canvasNode).datum(t), this.tools.fillColor.data(t), this.tools.qt = this.createQuadtree(t), this.allDots = t);
|
|
267
268
|
}
|
|
268
|
-
render(t, e, s,
|
|
269
|
-
if (this.tools === null)
|
|
269
|
+
render(t, e, s, n, a, d, u, p, f, v, c, r, g) {
|
|
270
|
+
if (this.dataFrame = t, this.tools === null)
|
|
270
271
|
this.initSettings(
|
|
271
|
-
t,
|
|
272
272
|
a,
|
|
273
273
|
s,
|
|
274
|
-
|
|
274
|
+
d,
|
|
275
275
|
f,
|
|
276
276
|
p,
|
|
277
|
-
|
|
277
|
+
v
|
|
278
278
|
);
|
|
279
279
|
else {
|
|
280
280
|
const { title: o, legend: y, size: m } = s;
|
|
281
|
-
this.updateChartSizes(m), this.updateLegendSize(y, f,
|
|
281
|
+
this.updateChartSizes(m), this.updateLegendSize(y, f, v, p), this.createMainTitle(o), this.updateMargins(), this.updateAes(f, p);
|
|
282
282
|
}
|
|
283
|
-
this.onPolygonUpdateOutside =
|
|
283
|
+
this.onPolygonUpdateOutside = c, this.onTooltipHintSwitch = r, this.onLassoControlsStateUpdate = g, this.allDots !== a && (this.updateDots(a), this.visibleLabels = this.computeLabels(a)), this.notCalculatedProps = {
|
|
284
284
|
settingsId: e,
|
|
285
285
|
chartSettings: s,
|
|
286
|
-
keyColumn:
|
|
286
|
+
keyColumn: n,
|
|
287
287
|
dotsByGrouping: u,
|
|
288
288
|
layers: p
|
|
289
|
-
}, this.renderWebglLayer(), this.renderSvgLayer(
|
|
289
|
+
}, this.renderWebglLayer(), this.renderSvgLayer();
|
|
290
290
|
}
|
|
291
291
|
renderWebglLayer() {
|
|
292
292
|
var t, e;
|
|
293
293
|
(t = this.tools) != null && t.webglChart && N(this.canvasNode).call((e = this.tools) == null ? void 0 : e.webglChart);
|
|
294
294
|
}
|
|
295
|
-
renderSvgLayer(
|
|
296
|
-
var
|
|
297
|
-
const
|
|
295
|
+
renderSvgLayer() {
|
|
296
|
+
var t;
|
|
297
|
+
const e = {
|
|
298
298
|
settingsId: this.notCalculatedProps.settingsId,
|
|
299
299
|
chartSettings: this.notCalculatedProps.chartSettings,
|
|
300
300
|
keyColumn: this.notCalculatedProps.keyColumn,
|
|
@@ -316,32 +316,32 @@ class ie {
|
|
|
316
316
|
onTooltipHintSwitch: this.onTooltipHintSwitch,
|
|
317
317
|
onLassoControlsStateUpdate: this.onLassoControlsStateUpdate
|
|
318
318
|
};
|
|
319
|
-
this.svgLayerComponent = /* @__PURE__ */ b.jsx(nt, { dataFrame:
|
|
319
|
+
this.svgLayerComponent = /* @__PURE__ */ b.jsx(nt, { dataFrame: this.dataFrame, children: /* @__PURE__ */ b.jsx(at, { ...e }) }), (t = this.reactRoot) == null || t.render(this.svgLayerComponent);
|
|
320
320
|
}
|
|
321
321
|
renderError(t) {
|
|
322
322
|
var e;
|
|
323
323
|
(e = this.reactRoot) == null || e.render(/* @__PURE__ */ b.jsx(Y, { message: t }));
|
|
324
324
|
}
|
|
325
325
|
computeLabels(t) {
|
|
326
|
-
const e = new G("16px Manrope"), s = et(this.chartSizes.chartWidth, this.chartSizes.chartHeight),
|
|
326
|
+
const e = new G("16px Manrope"), s = et(this.chartSizes.chartWidth, this.chartSizes.chartHeight), n = [];
|
|
327
327
|
for (let a = 0; a < t.length; a++) {
|
|
328
|
-
const
|
|
329
|
-
if (
|
|
328
|
+
const d = t[a];
|
|
329
|
+
if (d.label == null)
|
|
330
330
|
continue;
|
|
331
|
-
const u = String(
|
|
332
|
-
o &&
|
|
331
|
+
const u = String(d.label), p = e.getTextMetrics(u), f = this.scales.x(d.x), v = this.scales.y(d.y), c = p.width, r = p.actualBoundingBoxAscent + p.actualBoundingBoxDescent, g = 10, o = s(f, v, c, r, g);
|
|
332
|
+
o && n.push({
|
|
333
333
|
x: f,
|
|
334
|
-
y:
|
|
335
|
-
dot:
|
|
334
|
+
y: v,
|
|
335
|
+
dot: d,
|
|
336
336
|
name: u,
|
|
337
|
-
width:
|
|
338
|
-
height:
|
|
337
|
+
width: c,
|
|
338
|
+
height: r,
|
|
339
339
|
padding: g,
|
|
340
340
|
xPosition: o[0],
|
|
341
341
|
yPosition: o[1]
|
|
342
342
|
});
|
|
343
343
|
}
|
|
344
|
-
return
|
|
344
|
+
return n;
|
|
345
345
|
}
|
|
346
346
|
updateLabelsPosition(t) {
|
|
347
347
|
for (let e = 0; e < t.length; e++) {
|
|
@@ -351,6 +351,6 @@ class ie {
|
|
|
351
351
|
}
|
|
352
352
|
}
|
|
353
353
|
export {
|
|
354
|
-
|
|
354
|
+
oe as default
|
|
355
355
|
};
|
|
356
356
|
//# sourceMappingURL=ChartRenderer.js.map
|
package/dist/node_modules/@milaboratories/miplots4/dist/scatterplot-umap/ChartRenderer.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ChartRenderer.js","sources":["../../../../../../node_modules/@milaboratories/miplots4/src/scatterplot-umap/ChartRenderer.tsx"],"sourcesContent":["import { chartCartesian } from '@d3fc/d3fc-chart';\nimport type { CartesianChart } from '@d3fc/d3fc-chart/src/cartesian';\nimport type { ScaleLinear } from 'd3-scale';\nimport { scaleLinear, scaleLog, scaleOrdinal, scaleSqrt, scaleSymlog } from 'd3-scale';\nimport { select } from 'd3-selection';\nimport type { D3ZoomEvent, ZoomBehavior, ZoomTransform } from 'd3-zoom';\nimport { zoom } from 'd3-zoom';\nimport type { ReactElement } from 'react';\nimport type { Root } from 'react-dom/client';\nimport { createRoot } from 'react-dom/client';\nimport { Error } from '../common/Error';\nimport type { DotAesItem, LegendData, LegendItem } from '../common/types';\nimport {\n BLACK,\n DEFAULT_HEIGHT,\n DEFAULT_WIDTH,\n TITLE_LINE_HEIGHT,\n TITLE_MARGIN\n} from '../constants';\nimport { splitTextByWidth } from '../discrete/utils';\nimport { DEFAULT_DOT_AES, MIN_MARGIN } from '../scatterplot/constants';\nimport { createAesGetter } from '../scatterplot/utils/createAesGetter';\nimport { getTicksAndFormat } from '../scatterplot/utils/getTicksAndFormat';\nimport type { Label } from '../scatterplot/utils/getVisibleLabels';\nimport { createLabelPositioner } from '../scatterplot/utils/getVisibleLabels';\nimport type { ColumnName, ScatterplotEventHandlers } from '../types';\nimport { isContinuousAes } from '../types';\nimport type { ScatterplotUmapLegendInfo } from '../types/scatterplot-umap';\nimport { getContinuousColorScale } from '../utils/getContinuousColorScale';\nimport { getContinuousLegendTicks } from '../utils/getContinuousLegendTicks';\nimport { TextMeasurer } from '../utils/TextMeasurer/TextMeasurer';\nimport { SVGLayer } from './components/SVGLayer';\nimport { LEGEND_OFFSET, PADDINGS, TITLE_LINE } from './constants';\nimport type { CurveLayer, DotsLayer, ScatterplotUmapLayer, ScatterplotUmapSettingsImpl } from './SettingsImpl';\nimport type {\n AesGetters,\n CaptionsSizes,\n ChartScales, ChartSizes,\n Dot,\n DotsExtents,\n LassoControlsState,\n Margins,\n Polygon,\n SVGLayerProps,\n} from './types';\n// @ts-ignore\nimport { seriesSvgMulti, seriesWebglMulti, seriesWebglPoint } from '@d3fc/d3fc-series';\n// @ts-ignore\nimport { webglFillColor } from '@d3fc/d3fc-webgl';\n// @ts-ignore\nimport { pointer } from '@d3fc/d3fc-pointer';\nimport { polygonContains } from 'd3-polygon';\nimport KDBush from 'kdbush';\nimport { DataFrameProvider } from '../common/useDataFrame';\nimport type { DataFrame } from '../DataFrame';\nimport { arrangeLegendParts } from '../utils/arrangeLegendParts';\nimport { GET_BLACK, getColorWithFakeOpacity, stringToNumberRgba } from './colors';\n\nfunction convertDotRToSymbolSize(r:number) {\n return (r / 2.35) * (r / 2.35) * 64;\n}\n\nfunction isDotInsidePolygons(x:number, y:number, polygons: Polygon[]) {\n if (polygons.length === 0) {\n return true;\n }\n return polygons.some((p) => p.closed && p.points.length > 2 && polygonContains(p.points, [x, y]));\n}\n\nfunction getGettersFromLayers(\n dataFrame: DataFrame,\n legendInfo: ScatterplotUmapLegendInfo,\n layers: ScatterplotUmapSettingsImpl['layers'],\n): AesGetters {\n const dotLayer = layers.find(l => l.type === 'dots') as DotsLayer | undefined;\n const curveLayer = layers.find(l => l.type === 'curve') as CurveLayer | undefined;\n return {\n dotFill: createAesGetter(dataFrame, legendInfo, dotLayer?.aes.dotFill ?? DEFAULT_DOT_AES.color, 'dotFill'),\n dotSize: createAesGetter(dataFrame, legendInfo, dotLayer?.aes.dotSize ?? DEFAULT_DOT_AES.size, 'dotSize'),\n lineType: createAesGetter(dataFrame, legendInfo, curveLayer?.aes.lineShape ?? 'solid', 'lineShape')\n };\n}\n\nclass ChartRenderer {\n reactRoot: Root | null = null;\n parentNode: HTMLElement | null = null;\n rootNode: HTMLElement | null = null;\n canvasNode: HTMLElement | null = null;\n\n svgLayerElement: SVGElement | null = null;\n svgLayerComponent: ReactElement = (<></>);\n\n aesGetters: AesGetters = {\n dotSize: () => 2,\n dotFill: () => BLACK,\n lineType: () => 'solid'\n };\n\n tools: {\n webglChart: CartesianChart<any, any>;\n qt?: KDBush;\n fillColor: () => {\n value: (setter: (d: Dot) => [number, number, number, number]) => void;\n data: (setter: () => Dot[]) => void;\n };\n pointSeries: () => any;\n zoom: ZoomBehavior<any, any>;\n } | null = null;\n\n margins: Margins = {\n top: MIN_MARGIN,\n bottom: MIN_MARGIN,\n left: MIN_MARGIN,\n right: MIN_MARGIN,\n };\n chartSizes: ChartSizes = {\n chartWidth: DEFAULT_WIDTH, // width of single chart\n chartHeight: DEFAULT_HEIGHT, // height of single chart\n totalWidth: DEFAULT_WIDTH, // width of all charts in charts row, plus left axis, plus legend\n totalHeight: DEFAULT_HEIGHT, // width of all charts in charts height, plus bottom axis, plus top title\n };\n scales: ChartScales = {\n x: scaleLinear().domain([0, 10]).range([0, DEFAULT_WIDTH]),\n y: scaleLinear().domain([0, 10]).range([DEFAULT_HEIGHT, 0]),\n xOriginal: scaleLinear().domain([0, 10]).range([0, DEFAULT_WIDTH]),\n yOriginal: scaleLinear().domain([0, 10]).range([DEFAULT_HEIGHT, 0]),\n };\n\n polygons:Polygon[] = [];\n onPolygonUpdateOutside: ScatterplotEventHandlers['onPolygonUpdate'] = () => undefined;\n onTooltipHintSwitch: ScatterplotEventHandlers['onTooltipHintSwitch'] = () => undefined;\n onLassoControlsStateUpdate: ScatterplotEventHandlers['onLassoControlsStateUpdate'] = () => undefined;\n\n zoomTransform: ZoomTransform | null = null;\n zoomStateKey = '';\n selectedDot: Dot | null = null;\n captionsSizes: CaptionsSizes = {\n xAxisCaptionsWidth: 30,\n yAxisCaptionsWidth: 100,\n };\n mainTitle: string[] = []; // can be multiline\n legend: LegendData = {width: 0, height: 0, items: []};\n\n notCalculatedProps: Partial<SVGLayerProps> = {};\n\n allDots: Dot[] = [];\n visibleLabels: Label[] = [];\n clear() {\n if (this.parentNode && this.rootNode && this.canvasNode) {\n this.parentNode?.removeChild(this.rootNode);\n this.parentNode?.removeChild(this.canvasNode);\n this.parentNode = null;\n this.rootNode = null;\n this.canvasNode = null;\n this.svgLayerElement = null;\n this.tools = null;\n }\n // timeout to avoid trying to unmount during rendering\n setTimeout(() => {\n this.reactRoot?.unmount();\n this.reactRoot = null;\n });\n }\n\n init(node: HTMLElement) {\n if (this.parentNode === null) {\n this.parentNode = node;\n this.rootNode = document.createElement('div');\n this.canvasNode = document.createElement('div');\n this.parentNode.appendChild(this.rootNode);\n this.parentNode.appendChild(this.canvasNode);\n this.reactRoot = createRoot(this.rootNode);\n }\n }\n\n updateChartSizes(size: ScatterplotUmapSettingsImpl['chartSettings']['size']) {\n if (size.width !== this.chartSizes.chartWidth || size.height !== this.chartSizes.chartHeight) {\n // NB: now chart sizes always change with one multiplier for width/height so qt stays without changes\n this.chartSizes.chartWidth = size.width;\n this.chartSizes.chartHeight = size.height;\n this.scales.x.range([0, this.chartSizes.chartWidth]);\n this.scales.y.range([this.chartSizes.chartHeight, 0]);\n }\n \n }\n\n updateViewport(\n xAxis: ScatterplotUmapSettingsImpl['chartSettings']['xAxis'],\n yAxis: ScatterplotUmapSettingsImpl['chartSettings']['yAxis'],\n dotsExtents: DotsExtents\n ) {\n const scaleX = xAxis.scale === 'log' ? scaleLog() : scaleLinear();\n\n let {minX, minY, maxX, maxY} = dotsExtents;\n if (xAxis.lowerValue !== undefined) {\n minX = Math.max(minX, xAxis.lowerValue);\n }\n if (xAxis.upperValue !== undefined) {\n maxX = Math.min(maxX, xAxis.upperValue);\n }\n if (yAxis.lowerValue !== undefined) {\n minY = Math.max(minY, yAxis.lowerValue);\n }\n if (yAxis.upperValue !== undefined) {\n maxY = Math.min(maxY, yAxis.upperValue);\n }\n if (xAxis.symmetricRange !== undefined) {\n const middle = xAxis.symmetricRange;\n if (middle >= minX && middle <= maxX) {\n const halfRange = Math.max(middle - minX, maxX - middle);\n minX = middle - halfRange;\n maxX = middle + halfRange;\n }\n }\n if (typeof yAxis.symmetricRange !== 'undefined') {\n const middle = yAxis.symmetricRange;\n if (middle >= minY && middle <= maxY) {\n const halfRange = Math.max(middle - minY, maxY - middle);\n minY = middle - halfRange;\n maxY = middle + halfRange;\n }\n }\n\n const rangeH = [0, this.chartSizes.chartWidth];\n // supporting scale, it needs to add offsets of fixed size in pixels to general scale Y\n const tempX = scaleX\n .copy()\n .domain([minX, maxX])\n .range([PADDINGS.LEFT, this.chartSizes.chartWidth - PADDINGS.RIGHT]);\n scaleX\n .domain([tempX.invert(0), tempX.invert(this.chartSizes.chartWidth)])\n .range(rangeH)\n .nice();\n this.scales.x = scaleX;\n this.scales.xOriginal = scaleX.copy();\n\n const scaleY = yAxis.scale === 'log' ? scaleLog() : scaleLinear();\n const rangeV = [this.chartSizes.chartHeight, 0];\n // supporting scale, it needs to add offsets of fixed size in pixels to general scale Y\n const tempY = scaleY\n .copy()\n .domain([minY, maxY])\n .range([this.chartSizes.chartHeight - PADDINGS.BOTTOM, PADDINGS.TOP]);\n scaleY\n .domain([tempY.invert(this.chartSizes.chartHeight), tempY.invert(0)])\n .range(rangeV)\n .nice();\n this.scales.y = scaleY;\n this.scales.yOriginal = scaleY.copy();\n }\n\n updateCaptionsSize() {\n const textMeasurer = new TextMeasurer('600 14px Arial');\n\n function getMaxTickWidth(ticks: string[]) {\n return Math.max(...ticks.map(key => textMeasurer.getTextWidth(key)));\n }\n\n const {ticks, format} = getTicksAndFormat(this.scales.y, false);\n const maxYTick = getMaxTickWidth(ticks.map(format));\n\n this.captionsSizes = {\n xAxisCaptionsWidth: 20,\n yAxisCaptionsWidth: maxYTick,\n };\n }\n\n createMainTitle(title: ScatterplotUmapSettingsImpl['chartSettings']['title']) {\n this.mainTitle = splitTextByWidth(\n title.name,\n this.chartSizes.totalWidth - this.margins.left - this.margins.right,\n 20\n );\n }\n\n updateMargins() {\n const titleTextHeight = TITLE_LINE_HEIGHT * this.mainTitle.length;\n const titleHeight = titleTextHeight > 0 ? titleTextHeight + TITLE_MARGIN * 2 : 0;\n this.margins = {\n top: Math.max(titleHeight, MIN_MARGIN),\n bottom: MIN_MARGIN + this.captionsSizes.xAxisCaptionsWidth + TITLE_LINE,\n left: MIN_MARGIN + this.captionsSizes.yAxisCaptionsWidth + TITLE_LINE,\n right: this.legend.width + MIN_MARGIN,\n };\n this.chartSizes.totalWidth = this.margins.left + this.chartSizes.chartWidth + this.margins.right;\n this.chartSizes.totalHeight =\n this.margins.top + Math.max(this.chartSizes.chartHeight, this.legend.height) + this.margins.bottom;\n\n select(this.canvasNode)\n .style('width', this.chartSizes.chartWidth + 'px')\n .style('height', this.chartSizes.chartHeight + 'px')\n .style('top', this.margins.top + 'px')\n .style('left', this.margins.left + 'px');\n }\n\n updateLegendSize(\n legend: ScatterplotUmapSettingsImpl['chartSettings']['legend'],\n legendLabels: ScatterplotUmapLegendInfo,\n grouping: ColumnName[],\n layers: ScatterplotUmapLayer[]\n ) {\n if (!legend.show) {\n this.legend = {width: 0, height: 0, items: []};\n return;\n }\n\n const legendItems: LegendItem[] = [];\n const emptySizes = {width:0, height:0, left:0, top: 0};\n \n grouping.forEach(column => {\n const info = legendLabels[column.value];\n if (info.usedAes.length === 0 || !info.aesMap) {\n return;\n }\n const aesData: Record<string, DotAesItem> = {};\n info.values.forEach(category => {\n if (!aesData[category]) {\n aesData[category] = {...DEFAULT_DOT_AES} as DotAesItem;\n }\n info.usedAes.forEach(key => {\n if (key === 'dotFill') {\n aesData[category].color = (info.aesMap(category, key) ?? BLACK) as string;\n }\n if (key === 'dotSize') {\n aesData[category].size = Number(info.aesMap(category, key) ?? 3);\n }\n });\n });\n\n const title = column.label ?? column.value;\n const scale = scaleOrdinal<DotAesItem>()\n .domain(info.values)\n .range(info.values.map(value => aesData[value]));\n legendItems.push({...emptySizes, id: column.value, type: 'dots', title, scale, values:info.values, labels:info.labels});\n });\n\n layers.forEach(layer => {\n if (layer.type === 'dots' && isContinuousAes(layer.aes.dotFill)) {\n const {domain, range, columnName, type = 'linear'} = layer.aes.dotFill;\n const title = columnName.label ?? columnName.value;\n const colorScale = getContinuousColorScale(range, domain, 'linear') as ScaleLinear<string, string>; // always linear for legend - scale to render gradient, not for dots\n const tickPositionScale = (type === 'log' ? scaleSymlog<string, string>() : scaleLinear<string, string>())\n .domain(domain)\n // @ts-ignore\n .range([this.chartSizes.chartHeight, 0]);\n const values = getContinuousLegendTicks(tickPositionScale, domain as [number, number]);\n legendItems.push({...emptySizes, id: 'dotFill', type: 'continuous', title, scale: colorScale, tickPositionScale, values});\n }\n if (layer.type === 'dots' && isContinuousAes(layer.aes.dotSize)) {\n const {columnName, domain, range} = layer.aes.dotSize;\n const title = columnName.label ?? columnName.value;\n const scale = scaleSqrt(domain, range);\n const values = scale.ticks(3);\n const format = scale.tickFormat(3);\n const labels = values.reduce((res: Record<string, string>, v) => {\n res[String(v)] = format(v);\n return res;\n }, {});\n legendItems.push({...emptySizes, id: columnName.value, type: 'size', title, scale, values, labels});\n }\n });\n\n if (!legendItems.length) {\n this.legend = {width: 0, height: 0, items: []};\n return;\n }\n\n const items = arrangeLegendParts(legendItems, this.chartSizes.chartHeight);\n const lastItem = items[items.length - 1];\n const legendWidth = lastItem.left + lastItem.width + LEGEND_OFFSET;\n const legendHeight = this.chartSizes.chartHeight;\n\n this.legend = {\n width: legendWidth,\n height: legendHeight,\n items,\n };\n }\n\n initSettings(\n dataFrame: DataFrame,\n dots: Dot[],\n chartSettings: ScatterplotUmapSettingsImpl['chartSettings'],\n dotExtents: DotsExtents,\n legendInfo: ScatterplotUmapLegendInfo,\n layers: ScatterplotUmapSettingsImpl['layers'],\n grouping: ColumnName[]\n ) {\n const {xAxis, yAxis, size, title, legend} = chartSettings;\n this.updateChartSizes(size);\n this.updateViewport(xAxis, yAxis, dotExtents);\n this.updateCaptionsSize();\n this.updateLegendSize(legend, legendInfo, grouping, layers);\n this.createMainTitle(title);\n this.updateMargins();\n\n this.aesGetters = getGettersFromLayers(dataFrame, legendInfo, layers);\n\n const fillColor = webglFillColor()\n .data(dots)\n .value((d: Dot) => {\n const rgba = stringToNumberRgba(this.aesGetters.dotFill(d.idx));\n rgba[3] = !d.dimmed && isDotInsidePolygons(d.x, d.y, this.polygons) ? 1 : 0.4;\n return getColorWithFakeOpacity(rgba, rgba);\n });\n\n const pointSeries = seriesWebglPoint()\n .equals((a: Dot[], b: Dot[]) => a === b)\n .size((d: Dot) => convertDotRToSymbolSize(this.aesGetters.dotSize(d.idx)))\n .crossValue((d: Dot) => d.x)\n .mainValue((d: Dot) => d.y)\n .decorate((program: unknown) => fillColor(program));\n\n const z = zoom()\n .scaleExtent([0.1, 1000])\n .filter((e:MouseEvent) => {\n return e.type === 'wheel' || e.metaKey || e.ctrlKey;\n })\n .on('start', () => {\n this.selectedDot = null;\n })\n .on('zoom', (e: D3ZoomEvent<SVGElement, unknown>) => {\n const transform = e.transform;\n const x = transform.rescaleX(this.scales.xOriginal);\n const y = transform.rescaleY(this.scales.yOriginal);\n this.scales.x.domain(x.domain());\n this.scales.y.domain(y.domain());\n\n this.zoomTransform = transform;\n this.zoomStateKey = `${transform.x}_${transform.y}_${transform.k}`; // need it to update axes\n\n this.updateLabelsPosition(this.visibleLabels);\n this.renderSvgLayer(dataFrame);\n this.renderWebglLayer();\n }).on('end', () => {\n this.visibleLabels = this.computeLabels(this.allDots);\n this.renderSvgLayer(dataFrame);\n });\n\n // eslint-disable-next-line @typescript-eslint/ban-ts-comment\n // @ts-ignore\n const p = pointer().on('point', ([coord]) => {\n let closestDatum;\n if (coord) {\n closestDatum = this.getClosestDot(coord.x, coord.y);\n }\n \n const needRedraw =\n (this.selectedDot && !closestDatum) ||\n (!this.selectedDot && closestDatum) ||\n this.selectedDot?.idx !== closestDatum?.idx;\n\n this.selectedDot = closestDatum ?? null;\n\n if (needRedraw) {\n this.renderSvgLayer(dataFrame);\n }\n });\n\n const webglChart = chartCartesian({\n xScale: this.scales.x,\n yScale: this.scales.y,\n })\n .xAxisHeight(() => '0') // removing build-in axes from chartCartesian\n .yAxisWidth(() => '0') // removing build-in axes from chartCartesian\n .svgPlotArea(seriesSvgMulti())\n .webglPlotArea(\n // only render the point series on the WebGL layer\n seriesWebglMulti()\n .series([pointSeries])\n .mapping((d: unknown) => d)\n )\n .decorate(selection => {\n const s = selection.enter();\n if (s && !this.svgLayerElement) {\n s.style('grid-template-columns', '0 auto 1fr auto 0'); // removing build-in axes from chartCartesian\n s.style('grid-template-rows', '0 auto 1fr auto 0'); // removing build-in axes from chartCartesian\n this.svgLayerElement = s.select('.svg-plot-area.plot-area svg').node() as SVGElement;\n }\n s.select('.svg-plot-area.plot-area').attr('class', 'svg-plot-area plot-area miplots-scatterplot-plot-area')\n // eslint-disable-next-line @typescript-eslint/ban-ts-comment\n // @ts-ignore\n .call(z)\n .call(p);\n });\n\n this.tools = {\n webglChart,\n zoom: z,\n fillColor,\n pointSeries,\n };\n\n select(this.canvasNode)\n .datum(dots)\n .style('position', 'absolute')\n .style('width', this.chartSizes.chartWidth + 'px')\n .style('height', this.chartSizes.chartHeight + 'px')\n .style('top', this.margins.top + 'px')\n .style('left', this.margins.left + 'px');\n }\n\n updateAes(\n dataFrame: DataFrame,\n legendInfo: ScatterplotUmapLegendInfo,\n layers: ScatterplotUmapSettingsImpl['layers']\n ) {\n if (this.tools === null) {\n return;\n }\n this.aesGetters = getGettersFromLayers(dataFrame, legendInfo, layers);\n // eslint-disable-next-line @typescript-eslint/ban-ts-comment\n // @ts-ignore\n this.tools.fillColor.value((d: Dot) => {\n const colorGetter = this.aesGetters.dotFill ?? GET_BLACK;\n const rgba = stringToNumberRgba(colorGetter(d.idx));\n rgba[3] = !d.dimmed && isDotInsidePolygons(d.x, d.y, this.polygons) ? 1 : 0.4;\n return getColorWithFakeOpacity(rgba, rgba);\n });\n }\n\n updatePointSize() {\n if (this.tools === null) {\n return;\n }\n // TODO: try remove array copy\n select(this.canvasNode).datum([...this.allDots]);\n // eslint-disable-next-line @typescript-eslint/ban-ts-comment\n // @ts-ignore\n this.tools.pointSeries.size((d: Dot) => convertDotRToSymbolSize(this.aesGetters.dotSize(d.data)));\n }\n\n updateByLasso() {\n if (this.tools === null) {\n return;\n }\n // eslint-disable-next-line @typescript-eslint/ban-ts-comment\n // @ts-ignore\n this.tools?.fillColor.value((d: Dot) => {\n const colorGetter = this.aesGetters.dotFill ?? GET_BLACK;\n const rgba = stringToNumberRgba(colorGetter(d.idx));\n rgba[3] = !d.dimmed && isDotInsidePolygons(d.x, d.y, this.polygons) ? 1 : 0.4;\n return getColorWithFakeOpacity(rgba, rgba);\n });\n this.renderWebglLayer();\n }\n\n createQuadtree(dots: Dot[]): KDBush {\n const tree = new KDBush(dots.length, 512);\n\n for (let i = 0; i < dots.length; i++) {\n tree.add(dots[i].x, dots[i].y);\n } \n\n return tree.finish();\n }\n\n getClosestDot(_x: number, _y: number): Dot | null {\n const tree = this.tools?.qt;\n if (!tree) return null;\n const dots = this.allDots;\n const x = this.scales.x.invert(_x);\n const y = this.scales.y.invert(_y);\n const radius = 1 / (this.zoomTransform?.k || 1);\n const minX = x - radius;\n const maxX = x + radius;\n const minY = y - radius;\n const maxY = y + radius;\n\n const indexes = tree.range(minX, minY, maxX, maxY);\n const closest = indexes.reduce((closest, idx: number) => {\n const dot = dots[idx];\n const dX = this.scales.x(dot.x) - _x;\n const dY = this.scales.y(dot.y) - _y;\n const distance = Math.hypot(dX, dY);\n if (closest === null || distance < closest.distance) {\n closest.index = idx;\n closest.distance = distance;\n }\n return closest;\n }, {\n index: -1,\n distance: Infinity\n });\n return indexes.length === 0 || closest.index === -1 ? null : dots[closest.index];\n }\n\n updateDots(dots: Dot[]) {\n if (this.tools === null) {\n return;\n }\n select(this.canvasNode).datum(dots);\n // eslint-disable-next-line @typescript-eslint/ban-ts-comment\n // @ts-ignore\n this.tools.fillColor.data(dots);\n this.tools.qt = this.createQuadtree(dots);\n this.allDots = dots;\n }\n\n render(\n dataFrame: DataFrame,\n settingsId: string,\n chartSettings: ScatterplotUmapSettingsImpl['chartSettings'],\n keyColumn: ColumnName | null,\n dots: Dot[],\n dotExtents: DotsExtents,\n dotsByGrouping: Record<string, Dot[]>,\n layers: ScatterplotUmapSettingsImpl['layers'],\n legendInfo: ScatterplotUmapLegendInfo,\n grouping: ColumnName[],\n onPolygonUpdateOutside: ScatterplotEventHandlers['onPolygonUpdate'],\n onTooltipHintSwitch: (v:boolean) => void,\n onLassoControlsStateUpdate: (v:LassoControlsState) => void,\n ) { \n if (this.tools === null) {\n this.initSettings(\n dataFrame,\n dots,\n chartSettings,\n dotExtents,\n legendInfo,\n layers,\n grouping\n ); \n } else {\n const {title, legend, size} = chartSettings;\n this.updateChartSizes(size);\n this.updateLegendSize(legend, legendInfo, grouping, layers);\n this.createMainTitle(title);\n this.updateMargins();\n this.updateAes(dataFrame, legendInfo, layers);\n }\n\n this.onPolygonUpdateOutside = onPolygonUpdateOutside;\n this.onTooltipHintSwitch = onTooltipHintSwitch;\n this.onLassoControlsStateUpdate = onLassoControlsStateUpdate;\n\n if (this.allDots !== dots) {\n this.updateDots(dots);\n this.visibleLabels = this.computeLabels(dots);\n }\n\n this.notCalculatedProps = {\n settingsId,\n chartSettings,\n keyColumn,\n dotsByGrouping,\n layers\n };\n\n this.renderWebglLayer();\n this.renderSvgLayer(dataFrame);\n }\n\n renderWebglLayer() {\n if (this.tools?.webglChart) {\n select(this.canvasNode).call(this.tools?.webglChart);\n }\n }\n\n onPolygonUpdate = (p:Polygon[]) => {\n this.polygons = p;\n this.updateByLasso();\n const filteredDotsIndexes = this.allDots\n .filter(d => isDotInsidePolygons(d.x, d.y, this.polygons))\n .map(d => d.idx);\n this.onPolygonUpdateOutside(filteredDotsIndexes, p);\n };\n\n renderSvgLayer(dataFrame: DataFrame) {\n const props = {\n settingsId: this.notCalculatedProps.settingsId,\n chartSettings: this.notCalculatedProps.chartSettings,\n keyColumn: this.notCalculatedProps.keyColumn,\n dotsByGrouping: this.notCalculatedProps.dotsByGrouping,\n layers: this.notCalculatedProps.layers,\n chartSizes: this.chartSizes,\n scales: this.scales,\n margins: this.margins,\n mainTitle: this.mainTitle,\n captionsSizes: this.captionsSizes,\n container: this.svgLayerElement,\n zoomStateKey: this.zoomStateKey,\n selectedDot: this.selectedDot,\n aesGetters: this.aesGetters,\n legendData: this.legend,\n labels: this.visibleLabels,\n defaultPolygons: this.polygons,\n onPolygonUpdate: this.onPolygonUpdate,\n onTooltipHintSwitch: this.onTooltipHintSwitch,\n onLassoControlsStateUpdate: this.onLassoControlsStateUpdate,\n } as SVGLayerProps;\n this.svgLayerComponent = (\n <DataFrameProvider dataFrame={dataFrame}>\n <SVGLayer {...props} />\n </DataFrameProvider>\n );\n this.reactRoot?.render(this.svgLayerComponent);\n }\n\n renderError(message: string) {\n this.reactRoot?.render(<Error message={message} />);\n }\n\n private computeLabels(dots: Dot[]) {\n const textMeasurer = new TextMeasurer('16px Manrope');\n const getPosition = createLabelPositioner(this.chartSizes.chartWidth, this.chartSizes.chartHeight);\n const labels = [];\n\n for (let i = 0; i < dots.length; i++) {\n const dot = dots[i];\n if (dot.label == null) {\n continue;\n }\n const name = String(dot.label);\n const metrics = textMeasurer.getTextMetrics(name);\n const x = this.scales.x(dot.x);\n const y = this.scales.y(dot.y);\n const w = metrics.width;\n const h = (metrics.actualBoundingBoxAscent) + (metrics.actualBoundingBoxDescent);\n const p = 10;\n const position = getPosition(x, y, w, h, p);\n if (!position) {\n continue;\n }\n\n labels.push({\n x,\n y,\n dot,\n name,\n width: w,\n height: h,\n padding: p,\n xPosition: position[0],\n yPosition: position[1],\n } satisfies Label);\n }\n\n return labels;\n }\n\n private updateLabelsPosition(labels: Label[]) {\n for (let i = 0; i < labels.length; i++) {\n const label = labels[i];\n label.x = this.scales.x(label.dot.x as number);\n label.y = this.scales.y(label.dot.y as number);\n }\n }\n}\n\nexport default ChartRenderer;\n"],"names":["convertDotRToSymbolSize","r","isDotInsidePolygons","x","y","polygons","p","polygonContains","getGettersFromLayers","dataFrame","legendInfo","layers","dotLayer","l","curveLayer","createAesGetter","DEFAULT_DOT_AES","ChartRenderer","__publicField","jsx","Fragment","BLACK","MIN_MARGIN","DEFAULT_WIDTH","DEFAULT_HEIGHT","scaleLinear","filteredDotsIndexes","d","_a","_b","node","createRoot","size","xAxis","yAxis","dotsExtents","scaleX","scaleLog","minX","minY","maxX","maxY","middle","halfRange","rangeH","tempX","PADDINGS","scaleY","rangeV","tempY","textMeasurer","TextMeasurer","getMaxTickWidth","ticks","key","format","getTicksAndFormat","maxYTick","title","splitTextByWidth","titleTextHeight","TITLE_LINE_HEIGHT","titleHeight","TITLE_MARGIN","TITLE_LINE","select","legend","legendLabels","grouping","legendItems","emptySizes","column","info","aesData","category","scale","scaleOrdinal","value","layer","isContinuousAes","domain","range","columnName","type","colorScale","getContinuousColorScale","tickPositionScale","scaleSymlog","values","getContinuousLegendTicks","scaleSqrt","labels","res","v","items","arrangeLegendParts","lastItem","legendWidth","LEGEND_OFFSET","legendHeight","dots","chartSettings","dotExtents","fillColor","webglFillColor","rgba","stringToNumberRgba","getColorWithFakeOpacity","pointSeries","seriesWebglPoint","a","b","program","z","zoom","e","transform","pointer","coord","closestDatum","needRedraw","webglChart","chartCartesian","seriesSvgMulti","seriesWebglMulti","selection","s","colorGetter","GET_BLACK","tree","KDBush","i","_x","_y","radius","indexes","closest","idx","dot","dX","dY","distance","settingsId","keyColumn","dotsByGrouping","onPolygonUpdateOutside","onTooltipHintSwitch","onLassoControlsStateUpdate","props","DataFrameProvider","SVGLayer","message","Error","getPosition","createLabelPositioner","name","metrics","w","h","position","label"],"mappings":"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","x_google_ignoreList":[0]}
|
|
1
|
+
{"version":3,"file":"ChartRenderer.js","sources":["../../../../../../node_modules/@milaboratories/miplots4/src/scatterplot-umap/ChartRenderer.tsx"],"sourcesContent":["import { chartCartesian } from '@d3fc/d3fc-chart';\nimport type { CartesianChart } from '@d3fc/d3fc-chart/src/cartesian';\nimport type { ScaleLinear } from 'd3-scale';\nimport { scaleLinear, scaleLog, scaleOrdinal, scaleSqrt, scaleSymlog } from 'd3-scale';\nimport { select } from 'd3-selection';\nimport type { D3ZoomEvent, ZoomBehavior, ZoomTransform } from 'd3-zoom';\nimport { zoom } from 'd3-zoom';\nimport type { ReactElement } from 'react';\nimport type { Root } from 'react-dom/client';\nimport { createRoot } from 'react-dom/client';\nimport { Error } from '../common/Error';\nimport type { DotAesItem, LegendData, LegendItem } from '../common/types';\nimport {\n BLACK,\n DEFAULT_HEIGHT,\n DEFAULT_WIDTH,\n TITLE_LINE_HEIGHT,\n TITLE_MARGIN\n} from '../constants';\nimport { splitTextByWidth } from '../discrete/utils';\nimport { DEFAULT_DOT_AES, MIN_MARGIN } from '../scatterplot/constants';\nimport { createAesGetter } from '../scatterplot/utils/createAesGetter';\nimport { getTicksAndFormat } from '../scatterplot/utils/getTicksAndFormat';\nimport type { Label } from '../scatterplot/utils/getVisibleLabels';\nimport { createLabelPositioner } from '../scatterplot/utils/getVisibleLabels';\nimport type { ColumnName, ScatterplotEventHandlers } from '../types';\nimport { isContinuousAes } from '../types';\nimport type { ScatterplotUmapLegendInfo } from '../types/scatterplot-umap';\nimport { getContinuousColorScale } from '../utils/getContinuousColorScale';\nimport { getContinuousLegendTicks } from '../utils/getContinuousLegendTicks';\nimport { TextMeasurer } from '../utils/TextMeasurer/TextMeasurer';\nimport { SVGLayer } from './components/SVGLayer';\nimport { LEGEND_OFFSET, PADDINGS, TITLE_LINE } from './constants';\nimport type { CurveLayer, DotsLayer, ScatterplotUmapLayer, ScatterplotUmapSettingsImpl } from './SettingsImpl';\nimport type {\n AesGetters,\n CaptionsSizes,\n ChartScales, ChartSizes,\n Dot,\n DotsExtents,\n LassoControlsState,\n Margins,\n Polygon,\n SVGLayerProps,\n} from './types';\n// @ts-ignore\nimport { seriesSvgMulti, seriesWebglMulti, seriesWebglPoint } from '@d3fc/d3fc-series';\n// @ts-ignore\nimport { webglFillColor } from '@d3fc/d3fc-webgl';\n// @ts-ignore\nimport { pointer } from '@d3fc/d3fc-pointer';\nimport { polygonContains } from 'd3-polygon';\nimport KDBush from 'kdbush';\nimport { DataFrameProvider } from '../common/useDataFrame';\nimport { DataFrame } from '../DataFrame';\nimport { arrangeLegendParts } from '../utils/arrangeLegendParts';\nimport { GET_BLACK, getColorWithFakeOpacity, stringToNumberRgba } from './colors';\n\nfunction convertDotRToSymbolSize(r:number) {\n return (r / 2.35) * (r / 2.35) * 64;\n}\n\nfunction isDotInsidePolygons(x:number, y:number, polygons: Polygon[]) {\n if (polygons.length === 0) {\n return true;\n }\n return polygons.some((p) => p.closed && p.points.length > 2 && polygonContains(p.points, [x, y]));\n}\n\nfunction getGettersFromLayers(\n dataFrame: DataFrame,\n legendInfo: ScatterplotUmapLegendInfo,\n layers: ScatterplotUmapSettingsImpl['layers'],\n): AesGetters {\n const dotLayer = layers.find(l => l.type === 'dots') as DotsLayer | undefined;\n const curveLayer = layers.find(l => l.type === 'curve') as CurveLayer | undefined;\n return {\n dotFill: createAesGetter(dataFrame, legendInfo, dotLayer?.aes.dotFill ?? DEFAULT_DOT_AES.color, 'dotFill'),\n dotSize: createAesGetter(dataFrame, legendInfo, dotLayer?.aes.dotSize ?? DEFAULT_DOT_AES.size, 'dotSize'),\n lineType: createAesGetter(dataFrame, legendInfo, curveLayer?.aes.lineShape ?? 'solid', 'lineShape')\n };\n}\n\nclass ChartRenderer {\n reactRoot: Root | null = null;\n parentNode: HTMLElement | null = null;\n rootNode: HTMLElement | null = null;\n canvasNode: HTMLElement | null = null;\n\n svgLayerElement: SVGElement | null = null;\n svgLayerComponent: ReactElement = (<></>);\n\n aesGetters: AesGetters = {\n dotSize: () => 2,\n dotFill: () => BLACK,\n lineType: () => 'solid'\n };\n\n tools: {\n webglChart: CartesianChart<any, any>;\n qt?: KDBush;\n fillColor: () => {\n value: (setter: (d: Dot) => [number, number, number, number]) => void;\n data: (setter: () => Dot[]) => void;\n };\n pointSeries: () => any;\n zoom: ZoomBehavior<any, any>;\n } | null = null;\n\n margins: Margins = {\n top: MIN_MARGIN,\n bottom: MIN_MARGIN,\n left: MIN_MARGIN,\n right: MIN_MARGIN,\n };\n chartSizes: ChartSizes = {\n chartWidth: DEFAULT_WIDTH, // width of single chart\n chartHeight: DEFAULT_HEIGHT, // height of single chart\n totalWidth: DEFAULT_WIDTH, // width of all charts in charts row, plus left axis, plus legend\n totalHeight: DEFAULT_HEIGHT, // width of all charts in charts height, plus bottom axis, plus top title\n };\n scales: ChartScales = {\n x: scaleLinear().domain([0, 10]).range([0, DEFAULT_WIDTH]),\n y: scaleLinear().domain([0, 10]).range([DEFAULT_HEIGHT, 0]),\n xOriginal: scaleLinear().domain([0, 10]).range([0, DEFAULT_WIDTH]),\n yOriginal: scaleLinear().domain([0, 10]).range([DEFAULT_HEIGHT, 0]),\n };\n\n polygons:Polygon[] = [];\n onPolygonUpdateOutside: ScatterplotEventHandlers['onPolygonUpdate'] = () => undefined;\n onTooltipHintSwitch: ScatterplotEventHandlers['onTooltipHintSwitch'] = () => undefined;\n onLassoControlsStateUpdate: ScatterplotEventHandlers['onLassoControlsStateUpdate'] = () => undefined;\n\n zoomTransform: ZoomTransform | null = null;\n zoomStateKey = '';\n selectedDot: Dot | null = null;\n captionsSizes: CaptionsSizes = {\n xAxisCaptionsWidth: 30,\n yAxisCaptionsWidth: 100,\n };\n mainTitle: string[] = []; // can be multiline\n legend: LegendData = {width: 0, height: 0, items: []};\n\n notCalculatedProps: Partial<SVGLayerProps> = {};\n\n allDots: Dot[] = [];\n visibleLabels: Label[] = [];\n dataFrame: DataFrame = new DataFrame('', {});\n\n clear() {\n if (this.parentNode && this.rootNode && this.canvasNode) {\n this.parentNode?.removeChild(this.rootNode);\n this.parentNode?.removeChild(this.canvasNode);\n this.parentNode = null;\n this.rootNode = null;\n this.canvasNode = null;\n this.svgLayerElement = null;\n this.tools = null;\n }\n // timeout to avoid trying to unmount during rendering\n setTimeout(() => {\n this.reactRoot?.unmount();\n this.reactRoot = null;\n });\n }\n\n init(node: HTMLElement) {\n if (this.parentNode === null) {\n this.parentNode = node;\n this.rootNode = document.createElement('div');\n this.canvasNode = document.createElement('div');\n this.parentNode.appendChild(this.rootNode);\n this.parentNode.appendChild(this.canvasNode);\n this.reactRoot = createRoot(this.rootNode);\n }\n }\n\n updateChartSizes(size: ScatterplotUmapSettingsImpl['chartSettings']['size']) {\n if (size.width !== this.chartSizes.chartWidth || size.height !== this.chartSizes.chartHeight) {\n // NB: now chart sizes always change with one multiplier for width/height so qt stays without changes\n this.chartSizes.chartWidth = size.width;\n this.chartSizes.chartHeight = size.height;\n this.scales.x.range([0, this.chartSizes.chartWidth]);\n this.scales.y.range([this.chartSizes.chartHeight, 0]);\n }\n \n }\n\n updateViewport(\n xAxis: ScatterplotUmapSettingsImpl['chartSettings']['xAxis'],\n yAxis: ScatterplotUmapSettingsImpl['chartSettings']['yAxis'],\n dotsExtents: DotsExtents\n ) {\n const scaleX = xAxis.scale === 'log' ? scaleLog() : scaleLinear();\n\n let {minX, minY, maxX, maxY} = dotsExtents;\n if (xAxis.lowerValue !== undefined) {\n minX = Math.max(minX, xAxis.lowerValue);\n }\n if (xAxis.upperValue !== undefined) {\n maxX = Math.min(maxX, xAxis.upperValue);\n }\n if (yAxis.lowerValue !== undefined) {\n minY = Math.max(minY, yAxis.lowerValue);\n }\n if (yAxis.upperValue !== undefined) {\n maxY = Math.min(maxY, yAxis.upperValue);\n }\n if (xAxis.symmetricRange !== undefined) {\n const middle = xAxis.symmetricRange;\n if (middle >= minX && middle <= maxX) {\n const halfRange = Math.max(middle - minX, maxX - middle);\n minX = middle - halfRange;\n maxX = middle + halfRange;\n }\n }\n if (typeof yAxis.symmetricRange !== 'undefined') {\n const middle = yAxis.symmetricRange;\n if (middle >= minY && middle <= maxY) {\n const halfRange = Math.max(middle - minY, maxY - middle);\n minY = middle - halfRange;\n maxY = middle + halfRange;\n }\n }\n\n const rangeH = [0, this.chartSizes.chartWidth];\n // supporting scale, it needs to add offsets of fixed size in pixels to general scale Y\n const tempX = scaleX\n .copy()\n .domain([minX, maxX])\n .range([PADDINGS.LEFT, this.chartSizes.chartWidth - PADDINGS.RIGHT]);\n scaleX\n .domain([tempX.invert(0), tempX.invert(this.chartSizes.chartWidth)])\n .range(rangeH)\n .nice();\n this.scales.x = scaleX;\n this.scales.xOriginal = scaleX.copy();\n\n const scaleY = yAxis.scale === 'log' ? scaleLog() : scaleLinear();\n const rangeV = [this.chartSizes.chartHeight, 0];\n // supporting scale, it needs to add offsets of fixed size in pixels to general scale Y\n const tempY = scaleY\n .copy()\n .domain([minY, maxY])\n .range([this.chartSizes.chartHeight - PADDINGS.BOTTOM, PADDINGS.TOP]);\n scaleY\n .domain([tempY.invert(this.chartSizes.chartHeight), tempY.invert(0)])\n .range(rangeV)\n .nice();\n this.scales.y = scaleY;\n this.scales.yOriginal = scaleY.copy();\n }\n\n updateCaptionsSize() {\n const textMeasurer = new TextMeasurer('600 14px Arial');\n\n function getMaxTickWidth(ticks: string[]) {\n return Math.max(...ticks.map(key => textMeasurer.getTextWidth(key)));\n }\n\n const {ticks, format} = getTicksAndFormat(this.scales.y, false);\n const maxYTick = getMaxTickWidth(ticks.map(format));\n\n this.captionsSizes = {\n xAxisCaptionsWidth: 20,\n yAxisCaptionsWidth: maxYTick,\n };\n }\n\n createMainTitle(title: ScatterplotUmapSettingsImpl['chartSettings']['title']) {\n this.mainTitle = splitTextByWidth(\n title.name,\n this.chartSizes.totalWidth - this.margins.left - this.margins.right,\n 20\n );\n }\n\n updateMargins() {\n const titleTextHeight = TITLE_LINE_HEIGHT * this.mainTitle.length;\n const titleHeight = titleTextHeight > 0 ? titleTextHeight + TITLE_MARGIN * 2 : 0;\n this.margins = {\n top: Math.max(titleHeight, MIN_MARGIN),\n bottom: MIN_MARGIN + this.captionsSizes.xAxisCaptionsWidth + TITLE_LINE,\n left: MIN_MARGIN + this.captionsSizes.yAxisCaptionsWidth + TITLE_LINE,\n right: this.legend.width + MIN_MARGIN,\n };\n this.chartSizes.totalWidth = this.margins.left + this.chartSizes.chartWidth + this.margins.right;\n this.chartSizes.totalHeight =\n this.margins.top + Math.max(this.chartSizes.chartHeight, this.legend.height) + this.margins.bottom;\n\n select(this.canvasNode)\n .style('width', this.chartSizes.chartWidth + 'px')\n .style('height', this.chartSizes.chartHeight + 'px')\n .style('top', this.margins.top + 'px')\n .style('left', this.margins.left + 'px');\n }\n\n updateLegendSize(\n legend: ScatterplotUmapSettingsImpl['chartSettings']['legend'],\n legendLabels: ScatterplotUmapLegendInfo,\n grouping: ColumnName[],\n layers: ScatterplotUmapLayer[]\n ) {\n if (!legend.show) {\n this.legend = {width: 0, height: 0, items: []};\n return;\n }\n\n const legendItems: LegendItem[] = [];\n const emptySizes = {width:0, height:0, left:0, top: 0};\n \n grouping.forEach(column => {\n const info = legendLabels[column.value];\n if (info.usedAes.length === 0 || !info.aesMap) {\n return;\n }\n const aesData: Record<string, DotAesItem> = {};\n info.values.forEach(category => {\n if (!aesData[category]) {\n aesData[category] = {...DEFAULT_DOT_AES} as DotAesItem;\n }\n info.usedAes.forEach(key => {\n if (key === 'dotFill') {\n aesData[category].color = (info.aesMap(category, key) ?? BLACK) as string;\n }\n if (key === 'dotSize') {\n aesData[category].size = Number(info.aesMap(category, key) ?? 3);\n }\n });\n });\n\n const title = column.label ?? column.value;\n const scale = scaleOrdinal<DotAesItem>()\n .domain(info.values)\n .range(info.values.map(value => aesData[value]));\n legendItems.push({...emptySizes, id: column.value, type: 'dots', title, scale, values:info.values, labels:info.labels});\n });\n\n layers.forEach(layer => {\n if (layer.type === 'dots' && isContinuousAes(layer.aes.dotFill)) {\n const {domain, range, columnName, type = 'linear'} = layer.aes.dotFill;\n const title = columnName.label ?? columnName.value;\n const colorScale = getContinuousColorScale(range, domain, 'linear') as ScaleLinear<string, string>; // always linear for legend - scale to render gradient, not for dots\n const tickPositionScale = (type === 'log' ? scaleSymlog<string, string>() : scaleLinear<string, string>())\n .domain(domain)\n // @ts-ignore\n .range([this.chartSizes.chartHeight, 0]);\n const values = getContinuousLegendTicks(tickPositionScale, domain as [number, number]);\n legendItems.push({...emptySizes, id: 'dotFill', type: 'continuous', title, scale: colorScale, tickPositionScale, values});\n }\n if (layer.type === 'dots' && isContinuousAes(layer.aes.dotSize)) {\n const {columnName, domain, range} = layer.aes.dotSize;\n const title = columnName.label ?? columnName.value;\n const scale = scaleSqrt(domain, range);\n const values = scale.ticks(3);\n const format = scale.tickFormat(3);\n const labels = values.reduce((res: Record<string, string>, v) => {\n res[String(v)] = format(v);\n return res;\n }, {});\n legendItems.push({...emptySizes, id: columnName.value, type: 'size', title, scale, values, labels});\n }\n });\n\n if (!legendItems.length) {\n this.legend = {width: 0, height: 0, items: []};\n return;\n }\n\n const items = arrangeLegendParts(legendItems, this.chartSizes.chartHeight);\n const lastItem = items[items.length - 1];\n const legendWidth = lastItem.left + lastItem.width + LEGEND_OFFSET;\n const legendHeight = this.chartSizes.chartHeight;\n\n this.legend = {\n width: legendWidth,\n height: legendHeight,\n items,\n };\n }\n\n initSettings(\n dots: Dot[],\n chartSettings: ScatterplotUmapSettingsImpl['chartSettings'],\n dotExtents: DotsExtents,\n legendInfo: ScatterplotUmapLegendInfo,\n layers: ScatterplotUmapSettingsImpl['layers'],\n grouping: ColumnName[]\n ) {\n const {xAxis, yAxis, size, title, legend} = chartSettings;\n this.updateChartSizes(size);\n this.updateViewport(xAxis, yAxis, dotExtents);\n this.updateCaptionsSize();\n this.updateLegendSize(legend, legendInfo, grouping, layers);\n this.createMainTitle(title);\n this.updateMargins();\n\n this.aesGetters = getGettersFromLayers(this.dataFrame, legendInfo, layers);\n\n const fillColor = webglFillColor()\n .data(dots)\n .value((d: Dot) => {\n const rgba = stringToNumberRgba(this.aesGetters.dotFill(d.idx));\n rgba[3] = !d.dimmed && isDotInsidePolygons(d.x, d.y, this.polygons) ? 1 : 0.4;\n return getColorWithFakeOpacity(rgba, rgba);\n });\n\n const pointSeries = seriesWebglPoint()\n .equals((a: Dot[], b: Dot[]) => a === b)\n .size((d: Dot) => convertDotRToSymbolSize(this.aesGetters.dotSize(d.idx)))\n .crossValue((d: Dot) => d.x)\n .mainValue((d: Dot) => d.y)\n .decorate((program: unknown) => fillColor(program));\n\n const z = zoom()\n .scaleExtent([0.1, 1000])\n .filter((e:MouseEvent) => {\n return e.type === 'wheel' || e.metaKey || e.ctrlKey;\n })\n .on('start', () => {\n this.selectedDot = null;\n })\n .on('zoom', (e: D3ZoomEvent<SVGElement, unknown>) => {\n const transform = e.transform;\n const x = transform.rescaleX(this.scales.xOriginal);\n const y = transform.rescaleY(this.scales.yOriginal);\n this.scales.x.domain(x.domain());\n this.scales.y.domain(y.domain());\n\n this.zoomTransform = transform;\n this.zoomStateKey = `${transform.x}_${transform.y}_${transform.k}`; // need it to update axes\n\n this.updateLabelsPosition(this.visibleLabels);\n this.renderSvgLayer();\n this.renderWebglLayer();\n }).on('end', () => {\n this.visibleLabels = this.computeLabels(this.allDots);\n this.renderSvgLayer();\n });\n\n // eslint-disable-next-line @typescript-eslint/ban-ts-comment\n // @ts-ignore\n const p = pointer().on('point', ([coord]) => {\n let closestDatum;\n if (coord) {\n closestDatum = this.getClosestDot(coord.x, coord.y);\n }\n \n const needRedraw =\n (this.selectedDot && !closestDatum) ||\n (!this.selectedDot && closestDatum) ||\n this.selectedDot?.idx !== closestDatum?.idx;\n\n this.selectedDot = closestDatum ?? null;\n\n if (needRedraw) {\n this.renderSvgLayer();\n }\n });\n\n const webglChart = chartCartesian({\n xScale: this.scales.x,\n yScale: this.scales.y,\n })\n .xAxisHeight(() => '0') // removing build-in axes from chartCartesian\n .yAxisWidth(() => '0') // removing build-in axes from chartCartesian\n .svgPlotArea(seriesSvgMulti())\n .webglPlotArea(\n // only render the point series on the WebGL layer\n seriesWebglMulti()\n .series([pointSeries])\n .mapping((d: unknown) => d)\n )\n .decorate(selection => {\n const s = selection.enter();\n if (s && !this.svgLayerElement) {\n s.style('grid-template-columns', '0 auto 1fr auto 0'); // removing build-in axes from chartCartesian\n s.style('grid-template-rows', '0 auto 1fr auto 0'); // removing build-in axes from chartCartesian\n this.svgLayerElement = s.select('.svg-plot-area.plot-area svg').node() as SVGElement;\n }\n s.select('.svg-plot-area.plot-area').attr('class', 'svg-plot-area plot-area miplots-scatterplot-plot-area')\n // eslint-disable-next-line @typescript-eslint/ban-ts-comment\n // @ts-ignore\n .call(z)\n .call(p);\n });\n\n this.tools = {\n webglChart,\n zoom: z,\n fillColor,\n pointSeries,\n };\n\n select(this.canvasNode)\n .datum(dots)\n .style('position', 'absolute')\n .style('width', this.chartSizes.chartWidth + 'px')\n .style('height', this.chartSizes.chartHeight + 'px')\n .style('top', this.margins.top + 'px')\n .style('left', this.margins.left + 'px');\n }\n\n updateAes(\n legendInfo: ScatterplotUmapLegendInfo,\n layers: ScatterplotUmapSettingsImpl['layers']\n ) {\n if (this.tools === null) {\n return;\n }\n this.aesGetters = getGettersFromLayers(this.dataFrame, legendInfo, layers);\n // eslint-disable-next-line @typescript-eslint/ban-ts-comment\n // @ts-ignore\n this.tools.fillColor.value((d: Dot) => {\n const colorGetter = this.aesGetters.dotFill ?? GET_BLACK;\n const rgba = stringToNumberRgba(colorGetter(d.idx));\n rgba[3] = !d.dimmed && isDotInsidePolygons(d.x, d.y, this.polygons) ? 1 : 0.4;\n return getColorWithFakeOpacity(rgba, rgba);\n });\n }\n\n updatePointSize() {\n if (this.tools === null) {\n return;\n }\n // TODO: try remove array copy\n select(this.canvasNode).datum([...this.allDots]);\n // eslint-disable-next-line @typescript-eslint/ban-ts-comment\n // @ts-ignore\n this.tools.pointSeries.size((d: Dot) => convertDotRToSymbolSize(this.aesGetters.dotSize(d.data)));\n }\n\n updateByLasso() {\n if (this.tools === null) {\n return;\n }\n // eslint-disable-next-line @typescript-eslint/ban-ts-comment\n // @ts-ignore\n this.tools?.fillColor.value((d: Dot) => {\n const colorGetter = this.aesGetters.dotFill ?? GET_BLACK;\n const rgba = stringToNumberRgba(colorGetter(d.idx));\n rgba[3] = !d.dimmed && isDotInsidePolygons(d.x, d.y, this.polygons) ? 1 : 0.4;\n return getColorWithFakeOpacity(rgba, rgba);\n });\n this.renderWebglLayer();\n }\n\n createQuadtree(dots: Dot[]): KDBush {\n const tree = new KDBush(dots.length, 512);\n\n for (let i = 0; i < dots.length; i++) {\n tree.add(dots[i].x, dots[i].y);\n } \n\n return tree.finish();\n }\n\n getClosestDot(_x: number, _y: number): Dot | null {\n const tree = this.tools?.qt;\n if (!tree) return null;\n const dots = this.allDots;\n const x = this.scales.x.invert(_x);\n const y = this.scales.y.invert(_y);\n const radius = 1 / (this.zoomTransform?.k || 1);\n const minX = x - radius;\n const maxX = x + radius;\n const minY = y - radius;\n const maxY = y + radius;\n\n const indexes = tree.range(minX, minY, maxX, maxY);\n const closest = indexes.reduce((closest, idx: number) => {\n const dot = dots[idx];\n const dX = this.scales.x(dot.x) - _x;\n const dY = this.scales.y(dot.y) - _y;\n const distance = Math.hypot(dX, dY);\n if (closest === null || distance < closest.distance) {\n closest.index = idx;\n closest.distance = distance;\n }\n return closest;\n }, {\n index: -1,\n distance: Infinity\n });\n return indexes.length === 0 || closest.index === -1 ? null : dots[closest.index];\n }\n\n updateDots(dots: Dot[]) {\n if (this.tools === null) {\n return;\n }\n select(this.canvasNode).datum(dots);\n // eslint-disable-next-line @typescript-eslint/ban-ts-comment\n // @ts-ignore\n this.tools.fillColor.data(dots);\n this.tools.qt = this.createQuadtree(dots);\n this.allDots = dots;\n }\n\n render(\n dataFrame: DataFrame,\n settingsId: string,\n chartSettings: ScatterplotUmapSettingsImpl['chartSettings'],\n keyColumn: ColumnName | null,\n dots: Dot[],\n dotExtents: DotsExtents,\n dotsByGrouping: Record<string, Dot[]>,\n layers: ScatterplotUmapSettingsImpl['layers'],\n legendInfo: ScatterplotUmapLegendInfo,\n grouping: ColumnName[],\n onPolygonUpdateOutside: ScatterplotEventHandlers['onPolygonUpdate'],\n onTooltipHintSwitch: (v:boolean) => void,\n onLassoControlsStateUpdate: (v:LassoControlsState) => void,\n ) {\n this.dataFrame = dataFrame; \n if (this.tools === null) {\n this.initSettings(\n dots,\n chartSettings,\n dotExtents,\n legendInfo,\n layers,\n grouping\n ); \n } else {\n const {title, legend, size} = chartSettings;\n this.updateChartSizes(size);\n this.updateLegendSize(legend, legendInfo, grouping, layers);\n this.createMainTitle(title);\n this.updateMargins();\n this.updateAes(legendInfo, layers);\n }\n\n this.onPolygonUpdateOutside = onPolygonUpdateOutside;\n this.onTooltipHintSwitch = onTooltipHintSwitch;\n this.onLassoControlsStateUpdate = onLassoControlsStateUpdate;\n\n if (this.allDots !== dots) {\n this.updateDots(dots);\n this.visibleLabels = this.computeLabels(dots);\n }\n\n this.notCalculatedProps = {\n settingsId,\n chartSettings,\n keyColumn,\n dotsByGrouping,\n layers\n };\n\n this.renderWebglLayer();\n this.renderSvgLayer();\n }\n\n renderWebglLayer() {\n if (this.tools?.webglChart) {\n select(this.canvasNode).call(this.tools?.webglChart);\n }\n }\n\n onPolygonUpdate = (p:Polygon[]) => {\n this.polygons = p;\n this.updateByLasso();\n const filteredDotsIndexes = this.allDots\n .filter(d => isDotInsidePolygons(d.x, d.y, this.polygons))\n .map(d => d.idx);\n this.onPolygonUpdateOutside(filteredDotsIndexes, p);\n };\n\n renderSvgLayer() {\n const props = {\n settingsId: this.notCalculatedProps.settingsId,\n chartSettings: this.notCalculatedProps.chartSettings,\n keyColumn: this.notCalculatedProps.keyColumn,\n dotsByGrouping: this.notCalculatedProps.dotsByGrouping,\n layers: this.notCalculatedProps.layers,\n chartSizes: this.chartSizes,\n scales: this.scales,\n margins: this.margins,\n mainTitle: this.mainTitle,\n captionsSizes: this.captionsSizes,\n container: this.svgLayerElement,\n zoomStateKey: this.zoomStateKey,\n selectedDot: this.selectedDot,\n aesGetters: this.aesGetters,\n legendData: this.legend,\n labels: this.visibleLabels,\n defaultPolygons: this.polygons,\n onPolygonUpdate: this.onPolygonUpdate,\n onTooltipHintSwitch: this.onTooltipHintSwitch,\n onLassoControlsStateUpdate: this.onLassoControlsStateUpdate,\n } as SVGLayerProps;\n this.svgLayerComponent = (\n <DataFrameProvider dataFrame={this.dataFrame}>\n <SVGLayer {...props} />\n </DataFrameProvider>\n );\n this.reactRoot?.render(this.svgLayerComponent);\n }\n\n renderError(message: string) {\n this.reactRoot?.render(<Error message={message} />);\n }\n\n private computeLabels(dots: Dot[]) {\n const textMeasurer = new TextMeasurer('16px Manrope');\n const getPosition = createLabelPositioner(this.chartSizes.chartWidth, this.chartSizes.chartHeight);\n const labels = [];\n\n for (let i = 0; i < dots.length; i++) {\n const dot = dots[i];\n if (dot.label == null) {\n continue;\n }\n const name = String(dot.label);\n const metrics = textMeasurer.getTextMetrics(name);\n const x = this.scales.x(dot.x);\n const y = this.scales.y(dot.y);\n const w = metrics.width;\n const h = (metrics.actualBoundingBoxAscent) + (metrics.actualBoundingBoxDescent);\n const p = 10;\n const position = getPosition(x, y, w, h, p);\n if (!position) {\n continue;\n }\n\n labels.push({\n x,\n y,\n dot,\n name,\n width: w,\n height: h,\n padding: p,\n xPosition: position[0],\n yPosition: position[1],\n } satisfies Label);\n }\n\n return labels;\n }\n\n private updateLabelsPosition(labels: Label[]) {\n for (let i = 0; i < labels.length; i++) {\n const label = labels[i];\n label.x = this.scales.x(label.dot.x as number);\n label.y = this.scales.y(label.dot.y as number);\n }\n }\n}\n\nexport default ChartRenderer;\n"],"names":["convertDotRToSymbolSize","r","isDotInsidePolygons","x","y","polygons","p","polygonContains","getGettersFromLayers","dataFrame","legendInfo","layers","dotLayer","l","curveLayer","createAesGetter","DEFAULT_DOT_AES","ChartRenderer","__publicField","jsx","Fragment","BLACK","MIN_MARGIN","DEFAULT_WIDTH","DEFAULT_HEIGHT","scaleLinear","DataFrame","filteredDotsIndexes","d","_a","_b","node","createRoot","size","xAxis","yAxis","dotsExtents","scaleX","scaleLog","minX","minY","maxX","maxY","middle","halfRange","rangeH","tempX","PADDINGS","scaleY","rangeV","tempY","textMeasurer","TextMeasurer","getMaxTickWidth","ticks","key","format","getTicksAndFormat","maxYTick","title","splitTextByWidth","titleTextHeight","TITLE_LINE_HEIGHT","titleHeight","TITLE_MARGIN","TITLE_LINE","select","legend","legendLabels","grouping","legendItems","emptySizes","column","info","aesData","category","scale","scaleOrdinal","value","layer","isContinuousAes","domain","range","columnName","type","colorScale","getContinuousColorScale","tickPositionScale","scaleSymlog","values","getContinuousLegendTicks","scaleSqrt","labels","res","v","items","arrangeLegendParts","lastItem","legendWidth","LEGEND_OFFSET","legendHeight","dots","chartSettings","dotExtents","fillColor","webglFillColor","rgba","stringToNumberRgba","getColorWithFakeOpacity","pointSeries","seriesWebglPoint","a","b","program","z","zoom","e","transform","pointer","coord","closestDatum","needRedraw","webglChart","chartCartesian","seriesSvgMulti","seriesWebglMulti","selection","s","colorGetter","GET_BLACK","tree","KDBush","i","_x","_y","radius","indexes","closest","idx","dot","dX","dY","distance","settingsId","keyColumn","dotsByGrouping","onPolygonUpdateOutside","onTooltipHintSwitch","onLassoControlsStateUpdate","props","DataFrameProvider","SVGLayer","message","Error","getPosition","createLabelPositioner","name","metrics","w","h","position","label"],"mappings":"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","x_google_ignoreList":[0]}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@milaboratories/graph-maker",
|
|
3
|
-
"version": "1.1.
|
|
3
|
+
"version": "1.1.146",
|
|
4
4
|
"type": "module",
|
|
5
5
|
"main": "dist/lib.js",
|
|
6
6
|
"types": "dist/lib.d.ts",
|
|
@@ -37,7 +37,7 @@
|
|
|
37
37
|
"dependencies": {
|
|
38
38
|
"@ag-grid-community/core": "^32.3.3",
|
|
39
39
|
"@milaboratories/helpers": "^1.6.15",
|
|
40
|
-
"@milaboratories/miplots4": "^1.0.
|
|
40
|
+
"@milaboratories/miplots4": "^1.0.137",
|
|
41
41
|
"@milaboratories/pf-plots": "^1.1.30",
|
|
42
42
|
"@platforma-sdk/model": "^1.42.21",
|
|
43
43
|
"@platforma-sdk/ui-vue": "^1.39.16",
|