@milaboratories/miplots4 1.0.179 → 1.2.0
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/MiPlots.d.ts.map +1 -1
- package/dist/MiPlots.js +16 -14
- package/dist/MiPlots.js.map +1 -1
- package/dist/common/ContinuousAxis.d.ts +3 -1
- package/dist/common/ContinuousAxis.d.ts.map +1 -1
- package/dist/common/ContinuousAxis.js +8 -8
- package/dist/common/ContinuousAxis.js.map +1 -1
- package/dist/common/Legend.d.ts +12 -1
- package/dist/common/Legend.d.ts.map +1 -1
- package/dist/common/Legend.js +14 -6
- package/dist/common/Legend.js.map +1 -1
- package/dist/index.d.ts +2 -2
- package/dist/index.d.ts.map +1 -1
- package/dist/scatterplot/ChartRenderer.d.ts +2 -2
- package/dist/scatterplot/ChartRenderer.d.ts.map +1 -1
- package/dist/scatterplot/ChartRenderer.js +155 -115
- package/dist/scatterplot/ChartRenderer.js.map +1 -1
- package/dist/scatterplot/ScatterplotSettingsImpl.d.ts +11 -1
- package/dist/scatterplot/ScatterplotSettingsImpl.d.ts.map +1 -1
- package/dist/scatterplot/ScatterplotSettingsImpl.js +20 -0
- package/dist/scatterplot/ScatterplotSettingsImpl.js.map +1 -1
- package/dist/scatterplot/components/ChartLayersData.d.ts +5 -0
- package/dist/scatterplot/components/ChartLayersData.d.ts.map +1 -1
- package/dist/scatterplot/components/ChartLayersData.js +115 -35
- package/dist/scatterplot/components/ChartLayersData.js.map +1 -1
- package/dist/scatterplot/components/types.d.ts +2 -0
- package/dist/scatterplot/components/types.d.ts.map +1 -1
- package/dist/scatterplot/getLayersData.d.ts +11 -2
- package/dist/scatterplot/getLayersData.d.ts.map +1 -1
- package/dist/scatterplot/getLayersData.js +36 -19
- package/dist/scatterplot/getLayersData.js.map +1 -1
- package/dist/scatterplot/index.d.ts.map +1 -1
- package/dist/scatterplot/index.js +51 -33
- package/dist/scatterplot/index.js.map +1 -1
- package/dist/scatterplot/linearRegression.js +1 -1
- package/dist/scatterplot/utils/createAesGetter.d.ts.map +1 -1
- package/dist/scatterplot/utils/createAesGetter.js +5 -3
- package/dist/scatterplot/utils/createAesGetter.js.map +1 -1
- package/dist/scatterplot/utils/createLegendInfo.d.ts +11 -2
- package/dist/scatterplot/utils/createLegendInfo.d.ts.map +1 -1
- package/dist/scatterplot/utils/createLegendInfo.js +21 -16
- package/dist/scatterplot/utils/createLegendInfo.js.map +1 -1
- package/dist/scatterplot-umap/ChartRenderer.d.ts +6 -6
- package/dist/scatterplot-umap/ChartRenderer.d.ts.map +1 -1
- package/dist/scatterplot-umap/ChartRenderer.js +99 -57
- package/dist/scatterplot-umap/ChartRenderer.js.map +1 -1
- package/dist/scatterplot-umap/SettingsImpl.d.ts +11 -1
- package/dist/scatterplot-umap/SettingsImpl.d.ts.map +1 -1
- package/dist/scatterplot-umap/SettingsImpl.js +21 -1
- package/dist/scatterplot-umap/SettingsImpl.js.map +1 -1
- package/dist/scatterplot-umap/components/LowerSVG.d.ts +3 -2
- package/dist/scatterplot-umap/components/LowerSVG.d.ts.map +1 -1
- package/dist/scatterplot-umap/components/LowerSVG.js +159 -108
- package/dist/scatterplot-umap/components/LowerSVG.js.map +1 -1
- package/dist/scatterplot-umap/components/SVGLayer.d.ts +1 -1
- package/dist/scatterplot-umap/components/SVGLayer.d.ts.map +1 -1
- package/dist/scatterplot-umap/components/SVGLayer.js +9 -8
- package/dist/scatterplot-umap/components/SVGLayer.js.map +1 -1
- package/dist/scatterplot-umap/index.d.ts +6 -1
- package/dist/scatterplot-umap/index.d.ts.map +1 -1
- package/dist/scatterplot-umap/index.js +65 -31
- package/dist/scatterplot-umap/index.js.map +1 -1
- package/dist/scatterplot-umap/types.d.ts +7 -0
- package/dist/scatterplot-umap/types.d.ts.map +1 -1
- package/dist/selection/ChartRenderer.d.ts +90 -0
- package/dist/selection/ChartRenderer.d.ts.map +1 -0
- package/dist/selection/ChartRenderer.js +254 -0
- package/dist/selection/ChartRenderer.js.map +1 -0
- package/dist/selection/SelectionSettingsImpl.d.ts +53 -0
- package/dist/selection/SelectionSettingsImpl.d.ts.map +1 -0
- package/dist/selection/SelectionSettingsImpl.js +47 -0
- package/dist/selection/SelectionSettingsImpl.js.map +1 -0
- package/dist/selection/components/Chart/Bars/GroupSelectedBars.d.ts +8 -0
- package/dist/selection/components/Chart/Bars/GroupSelectedBars.d.ts.map +1 -0
- package/dist/selection/components/Chart/Bars/GroupSelectedBars.js +57 -0
- package/dist/selection/components/Chart/Bars/GroupSelectedBars.js.map +1 -0
- package/dist/selection/components/Chart/Bars/StackedBars.d.ts +12 -0
- package/dist/selection/components/Chart/Bars/StackedBars.d.ts.map +1 -0
- package/dist/selection/components/Chart/Bars/StackedBars.js +58 -0
- package/dist/selection/components/Chart/Bars/StackedBars.js.map +1 -0
- package/dist/selection/components/Chart/Bars/UngroupedBars.d.ts +6 -0
- package/dist/selection/components/Chart/Bars/UngroupedBars.d.ts.map +1 -0
- package/dist/selection/components/Chart/Bars/UngroupedBars.js +38 -0
- package/dist/selection/components/Chart/Bars/UngroupedBars.js.map +1 -0
- package/dist/selection/components/Chart/Bars.d.ts +10 -0
- package/dist/selection/components/Chart/Bars.d.ts.map +1 -0
- package/dist/selection/components/Chart/Bars.js +48 -0
- package/dist/selection/components/Chart/Bars.js.map +1 -0
- package/dist/selection/components/Chart/ChartAxes.d.ts +7 -0
- package/dist/selection/components/Chart/ChartAxes.d.ts.map +1 -0
- package/dist/selection/components/Chart/ChartAxes.js +51 -0
- package/dist/selection/components/Chart/ChartAxes.js.map +1 -0
- package/dist/selection/components/Chart/ChartFrame.d.ts +9 -0
- package/dist/selection/components/Chart/ChartFrame.d.ts.map +1 -0
- package/dist/selection/components/Chart/ChartFrame.js +41 -0
- package/dist/selection/components/Chart/ChartFrame.js.map +1 -0
- package/dist/selection/components/Chart/Dividers.d.ts +8 -0
- package/dist/selection/components/Chart/Dividers.d.ts.map +1 -0
- package/dist/selection/components/Chart/Dividers.js +27 -0
- package/dist/selection/components/Chart/Dividers.js.map +1 -0
- package/dist/selection/components/Chart/Gridlines.d.ts +10 -0
- package/dist/selection/components/Chart/Gridlines.d.ts.map +1 -0
- package/dist/selection/components/Chart/Gridlines.js +32 -0
- package/dist/selection/components/Chart/Gridlines.js.map +1 -0
- package/dist/selection/components/Chart/Ribbons/GroupFlowRibbon.d.ts +9 -0
- package/dist/selection/components/Chart/Ribbons/GroupFlowRibbon.d.ts.map +1 -0
- package/dist/selection/components/Chart/Ribbons/GroupFlowRibbon.js +36 -0
- package/dist/selection/components/Chart/Ribbons/GroupFlowRibbon.js.map +1 -0
- package/dist/selection/components/Chart/Ribbons/MultiGroupRibbon.d.ts +6 -0
- package/dist/selection/components/Chart/Ribbons/MultiGroupRibbon.d.ts.map +1 -0
- package/dist/selection/components/Chart/Ribbons/MultiGroupRibbon.js +22 -0
- package/dist/selection/components/Chart/Ribbons/MultiGroupRibbon.js.map +1 -0
- package/dist/selection/components/Chart/Ribbons/SimpleRibbon.d.ts +10 -0
- package/dist/selection/components/Chart/Ribbons/SimpleRibbon.d.ts.map +1 -0
- package/dist/selection/components/Chart/Ribbons/SimpleRibbon.js +33 -0
- package/dist/selection/components/Chart/Ribbons/SimpleRibbon.js.map +1 -0
- package/dist/selection/components/Chart/Ribbons/StackedGroupFlowRibbon.d.ts +10 -0
- package/dist/selection/components/Chart/Ribbons/StackedGroupFlowRibbon.d.ts.map +1 -0
- package/dist/selection/components/Chart/Ribbons/StackedGroupFlowRibbon.js +65 -0
- package/dist/selection/components/Chart/Ribbons/StackedGroupFlowRibbon.js.map +1 -0
- package/dist/selection/components/Chart/Ribbons/ribbonPath.d.ts +10 -0
- package/dist/selection/components/Chart/Ribbons/ribbonPath.d.ts.map +1 -0
- package/dist/selection/components/Chart/Ribbons/ribbonPath.js +13 -0
- package/dist/selection/components/Chart/Ribbons/ribbonPath.js.map +1 -0
- package/dist/selection/components/Chart/Ribbons.d.ts +9 -0
- package/dist/selection/components/Chart/Ribbons.d.ts.map +1 -0
- package/dist/selection/components/Chart/Ribbons.js +58 -0
- package/dist/selection/components/Chart/Ribbons.js.map +1 -0
- package/dist/selection/components/Chart/StageCounts.d.ts +7 -0
- package/dist/selection/components/Chart/StageCounts.d.ts.map +1 -0
- package/dist/selection/components/Chart/StageCounts.js +20 -0
- package/dist/selection/components/Chart/StageCounts.js.map +1 -0
- package/dist/selection/components/Chart/types.d.ts +132 -0
- package/dist/selection/components/Chart/types.d.ts.map +1 -0
- package/dist/selection/components/Chart.d.ts +22 -0
- package/dist/selection/components/Chart.d.ts.map +1 -0
- package/dist/selection/components/Chart.js +97 -0
- package/dist/selection/components/Chart.js.map +1 -0
- package/dist/selection/components/ChartsGroup.d.ts +18 -0
- package/dist/selection/components/ChartsGroup.d.ts.map +1 -0
- package/dist/selection/components/ChartsGroup.js +181 -0
- package/dist/selection/components/ChartsGroup.js.map +1 -0
- package/dist/selection/components/FacetCell.d.ts +22 -0
- package/dist/selection/components/FacetCell.d.ts.map +1 -0
- package/dist/selection/components/FacetCell.js +18 -0
- package/dist/selection/components/FacetCell.js.map +1 -0
- package/dist/selection/components/types.d.ts +58 -0
- package/dist/selection/components/types.d.ts.map +1 -0
- package/dist/selection/constants.d.ts +25 -0
- package/dist/selection/constants.d.ts.map +1 -0
- package/dist/selection/constants.js +4 -0
- package/dist/selection/constants.js.map +1 -0
- package/dist/selection/createSelectionData.d.ts +50 -0
- package/dist/selection/createSelectionData.d.ts.map +1 -0
- package/dist/selection/createSelectionData.js +92 -0
- package/dist/selection/createSelectionData.js.map +1 -0
- package/dist/selection/index.d.ts +26 -0
- package/dist/selection/index.d.ts.map +1 -0
- package/dist/selection/index.js +96 -0
- package/dist/selection/index.js.map +1 -0
- package/dist/selection/utils.d.ts +4 -0
- package/dist/selection/utils.d.ts.map +1 -0
- package/dist/selection/utils.js +13 -0
- package/dist/selection/utils.js.map +1 -0
- package/dist/types/bubble.d.ts +42 -0
- package/dist/types/bubble.d.ts.map +1 -1
- package/dist/types/common.d.ts +38 -0
- package/dist/types/common.d.ts.map +1 -1
- package/dist/types/common.js +1 -0
- package/dist/types/common.js.map +1 -1
- package/dist/types/dendro.d.ts +103 -0
- package/dist/types/dendro.d.ts.map +1 -1
- package/dist/types/discrete.d.ts +167 -0
- package/dist/types/discrete.d.ts.map +1 -1
- package/dist/types/heatmap.d.ts +159 -0
- package/dist/types/heatmap.d.ts.map +1 -1
- package/dist/types/histogram.d.ts +22 -0
- package/dist/types/histogram.d.ts.map +1 -1
- package/dist/types/index.d.ts +3 -1
- package/dist/types/index.d.ts.map +1 -1
- package/dist/types/index.js +1 -0
- package/dist/types/scatterplot-umap.d.ts +951 -87
- package/dist/types/scatterplot-umap.d.ts.map +1 -1
- package/dist/types/scatterplot-umap.js +19 -3
- package/dist/types/scatterplot-umap.js.map +1 -1
- package/dist/types/scatterplot.d.ts +1647 -44
- package/dist/types/scatterplot.d.ts.map +1 -1
- package/dist/types/scatterplot.js +27 -3
- package/dist/types/scatterplot.js.map +1 -1
- package/dist/types/selection.d.ts +452 -0
- package/dist/types/selection.d.ts.map +1 -0
- package/dist/types/selection.js +53 -0
- package/dist/types/selection.js.map +1 -0
- package/package.json +2 -2
|
@@ -41,7 +41,7 @@ var p = class extends e {
|
|
|
41
41
|
let n = this.settings, r = this.data;
|
|
42
42
|
this.settings = new l(t), this.data = e, this._needUpdateCalculatedDataBySettings(n, this.settings) || this._needUpdateCalculatedDataByData(r, this.data) ? this._updateData() : this._updateAesInData();
|
|
43
43
|
let i = n.layers.find((e) => e.type === "dots"), a = this.settings.layers.find((e) => e.type === "dots");
|
|
44
|
-
f(i.aes.dotSize, a.aes.dotSize) && this.calculatedData && this.chartRenderer.updatePointSize(this.calculatedData.legendLabels, this.settings.layers), this._updateChart(), this.hasError = !1;
|
|
44
|
+
f(i.aes.dotSize, a.aes.dotSize) && this.calculatedData && this.chartRenderer.updatePointSize(this.calculatedData.legendLabels, this.settings.layers, this.settings.additionalCurves), this._updateChart(), this.hasError = !1;
|
|
45
45
|
} catch (e) {
|
|
46
46
|
this.hasError = !0, e instanceof Error && (this.chartRenderer.renderError(e.message), console.error(e));
|
|
47
47
|
}
|
|
@@ -69,70 +69,104 @@ var p = class extends e {
|
|
|
69
69
|
return console.warn("export not implemented"), "";
|
|
70
70
|
}
|
|
71
71
|
_needUpdateCalculatedDataBySettings(e, t) {
|
|
72
|
-
|
|
72
|
+
let r = e.additionalCurves?.curves ?? [], i = t.additionalCurves?.curves ?? [];
|
|
73
|
+
return n(e.grouping.map((e) => e.columnName.value), t.grouping.map((e) => e.columnName.value)) || n(e.grouping.map((e) => e.columnName.nullValueLabel), t.grouping.map((e) => e.columnName.nullValueLabel)) || e.grouping.some((e, r) => n(e.order, t.grouping?.[r].order)) || e.layers.length !== t.layers.length || e.layers.some((e, n) => e.type !== t.layers[n].type) || (e.label?.value || t.label?.value) && e.label?.value !== t.label?.value || r.length !== i.length || n(r.map((e) => e.columnName.value), i.map((e) => e.columnName.value));
|
|
73
74
|
}
|
|
74
75
|
_needUpdateCalculatedDataByData(e, t) {
|
|
75
76
|
let n = Object.keys(e.data), r = Object.keys(t.data);
|
|
76
77
|
return e.id !== t.id || n.length !== r.length || n.some((n) => e.data[n].length !== t.data[n]?.length);
|
|
77
78
|
}
|
|
78
79
|
_updateData() {
|
|
79
|
-
let { x: e, y: t, label: n, highlight: a, grouping: s, layers: c } = this.settings,
|
|
80
|
+
let { x: e, y: t, label: n, highlight: a, grouping: s, layers: c, additionalCurves: l } = this.settings, d = {
|
|
80
81
|
minX: Infinity,
|
|
81
82
|
maxX: -Infinity,
|
|
82
83
|
minY: Infinity,
|
|
83
84
|
maxY: -Infinity
|
|
84
|
-
},
|
|
85
|
+
}, f = c.some((e) => e.type === "curve"), p = /* @__PURE__ */ new Set(), m = {}, h = [], g = n?.format ? u(n.format) : void 0;
|
|
85
86
|
for (let i = 0; i < this.data.rowsCount; i++) {
|
|
86
87
|
let o = this.data.getColumnValue(e.value, i), c = this.data.getColumnValue(t.value, i);
|
|
87
88
|
if (typeof o != "number" || typeof c != "number" || !isFinite(o) || !isFinite(c)) continue;
|
|
88
|
-
o <
|
|
89
|
-
let
|
|
89
|
+
o < d.minX && (d.minX = o), o > d.maxX && (d.maxX = o), c < d.minY && (d.minY = c), c > d.maxY && (d.maxY = c);
|
|
90
|
+
let l = a ? !this.data.getColumnValue(a.value, i) : !1, u = {
|
|
90
91
|
x: o,
|
|
91
92
|
y: c,
|
|
92
93
|
idx: i,
|
|
93
|
-
label: r(this.data, i, n,
|
|
94
|
-
dimmed:
|
|
94
|
+
label: r(this.data, i, n, g),
|
|
95
|
+
dimmed: l
|
|
95
96
|
};
|
|
96
|
-
if (
|
|
97
|
+
if (f) {
|
|
97
98
|
let e = s.map(({ columnName: e }) => this.data.getColumnValue(e.value, i)).join("_");
|
|
98
|
-
|
|
99
|
+
p.add(e), m[e] || (m[e] = []), m[e].push(u);
|
|
99
100
|
}
|
|
100
|
-
|
|
101
|
+
h.push(u);
|
|
101
102
|
}
|
|
102
|
-
let
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
})
|
|
106
|
-
let
|
|
107
|
-
if (
|
|
108
|
-
let
|
|
109
|
-
(
|
|
103
|
+
let _ = [...p];
|
|
104
|
+
f && _.forEach((e) => {
|
|
105
|
+
m[e].sort((e, t) => e.x - t.x);
|
|
106
|
+
});
|
|
107
|
+
let v = [];
|
|
108
|
+
if (l) for (let t of l.curves) {
|
|
109
|
+
let n = t.columnName.value, r = {};
|
|
110
|
+
for (let t = 0; t < this.data.rowsCount; t++) {
|
|
111
|
+
let i = this.data.getColumnValue(e.value, t), a = this.data.getColumnValue(n, t);
|
|
112
|
+
if (typeof i != "number" || !isFinite(i) || typeof a != "number" || !isFinite(a)) continue;
|
|
113
|
+
let o = s.map(({ columnName: e }) => this.data.getColumnValue(e.value, t)).join("_");
|
|
114
|
+
r[o] || (r[o] = []), r[o].push({
|
|
115
|
+
idx: t,
|
|
116
|
+
x: i,
|
|
117
|
+
y: a,
|
|
118
|
+
label: null,
|
|
119
|
+
dimmed: !1
|
|
120
|
+
});
|
|
121
|
+
}
|
|
122
|
+
for (let e of Object.keys(r)) r[e].sort((e, t) => e.x - t.x);
|
|
123
|
+
v.push({
|
|
124
|
+
entry: t,
|
|
125
|
+
dotsByGrouping: r,
|
|
126
|
+
smoothing: l.smoothing
|
|
127
|
+
});
|
|
128
|
+
}
|
|
129
|
+
i(this.data, h, s, a, c.find((e) => e.type === "dots"));
|
|
130
|
+
let y = o(this.data, s, c, l), b = this.calculatedData?.dotsExtents ?? null;
|
|
131
|
+
if (b) {
|
|
132
|
+
let { minX: e, maxX: t, minY: n, maxY: r } = b;
|
|
133
|
+
(e !== d.minX || t !== d.maxX || n !== d.minY || r !== d.maxY) && this.onZoomChange(!0);
|
|
110
134
|
}
|
|
111
135
|
this.calculatedData = {
|
|
112
|
-
dots:
|
|
113
|
-
dotsByGrouping:
|
|
114
|
-
groupingKeys:
|
|
115
|
-
dotsExtents:
|
|
116
|
-
legendLabels:
|
|
136
|
+
dots: h,
|
|
137
|
+
dotsByGrouping: m,
|
|
138
|
+
groupingKeys: _,
|
|
139
|
+
dotsExtents: d,
|
|
140
|
+
legendLabels: y,
|
|
141
|
+
additionalCurves: v
|
|
117
142
|
};
|
|
118
143
|
}
|
|
119
144
|
_updateAesInData() {
|
|
120
145
|
let e = this.calculatedData;
|
|
121
146
|
if (!e) return;
|
|
122
|
-
let { layers: t, grouping: n } = this.settings;
|
|
123
|
-
|
|
124
|
-
let
|
|
147
|
+
let { layers: t, grouping: n, additionalCurves: r } = this.settings;
|
|
148
|
+
r && (e.additionalCurves = e.additionalCurves.map((e, t) => {
|
|
149
|
+
let n = r.curves[t];
|
|
150
|
+
return n ? {
|
|
151
|
+
...e,
|
|
152
|
+
entry: n,
|
|
153
|
+
smoothing: r.smoothing
|
|
154
|
+
} : e;
|
|
155
|
+
})), n.forEach(({ columnName: n, inheritedAes: i }) => {
|
|
156
|
+
let o = /* @__PURE__ */ new Set(), s = {};
|
|
125
157
|
t.forEach((e) => {
|
|
126
158
|
e.aes && Object.entries(e.aes).forEach(([e, t]) => {
|
|
127
|
-
d(t) && t.value === n.value && (
|
|
159
|
+
d(t) && t.value === n.value && (o.add(e), t.palette && (s[e] = t.palette));
|
|
128
160
|
});
|
|
129
|
-
})
|
|
161
|
+
});
|
|
162
|
+
for (let e of r?.curves ?? []) d(e.lineColor) && e.lineColor.value === n.value && (o.add("lineColor"), e.lineColor.palette && (s.lineColor = e.lineColor.palette));
|
|
163
|
+
e.legendLabels[n.value].usedAes = [...o], e.legendLabels[n.value].aesMap = a(n, s, i);
|
|
130
164
|
});
|
|
131
165
|
}
|
|
132
166
|
_updateChart() {
|
|
133
167
|
if (!this.calculatedData) return;
|
|
134
|
-
let { id: e, chartSettings: t, keyColumn: n, layers: r, grouping: i } = this.settings;
|
|
135
|
-
this.chartRenderer.render(this.data, e, t, n, this.calculatedData.dots, this.calculatedData.dotsExtents, this.calculatedData.dotsByGrouping, r, this.calculatedData.legendLabels, i.map((e) => e.columnName), this.onPolygonUpdate, this.onTooltipHintSwitch, this.onLassoControlsStateUpdate, this.onZoomChange);
|
|
168
|
+
let { id: e, chartSettings: t, keyColumn: n, layers: r, grouping: i, additionalCurves: a, y: o } = this.settings;
|
|
169
|
+
this.chartRenderer.render(this.data, e, t, n, this.calculatedData.dots, this.calculatedData.dotsExtents, this.calculatedData.dotsByGrouping, r, this.calculatedData.legendLabels, i.map((e) => e.columnName), this.onPolygonUpdate, this.onTooltipHintSwitch, this.onLassoControlsStateUpdate, this.onZoomChange, this.calculatedData.additionalCurves, a, o);
|
|
136
170
|
}
|
|
137
171
|
};
|
|
138
172
|
export { p as ChartScatterplotUmap };
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","names":[],"sources":["../../src/scatterplot-umap/index.ts"],"sourcesContent":["import {format} from 'd3-format';\nimport { AbstractChart } from '../AbstractChart';\nimport type { DataFrame } from '../DataFrame';\nimport { addPalettesToAesMapping, createLegendInfo } from '../scatterplot/utils/createLegendInfo';\nimport {formatColumnValue} from '../scatterplot/utils/formatColumnValue';\nimport {sortDotsByGrouping} from '../scatterplot/utils/sortDotsByGrouping';\nimport { type AesItem, type ContinuousAesFromColumn, type InheritAesScatterplot, isContinuousAes, type ScatterplotEventHandlers } from '../types';\nimport type { ScatterplotUmapLegendInfo, ScatterplotUmapSettings } from '../types/scatterplot-umap';\nimport {arraysAreDifferent} from '../utils/arraysAreDifferent';\nimport ChartRenderer from './ChartRenderer';\nimport { SCATTERPLOT_CONTROLS_EVENTS } from './constants';\nimport type { DotsLayer } from './SettingsImpl';\nimport { ScatterplotUmapSettingsImpl } from './SettingsImpl';\nimport type { Dot, DotsExtents, LassoControlsState, LassoMode, Polygon } from './types';\n\nfunction isInheritMapping<T extends (string | number)>(value:T | InheritAesScatterplot | ContinuousAesFromColumn<T>):value is InheritAesScatterplot {\n return typeof value === 'object' && 'type' in value && value.type === 'grouping';\n}\n\nfunction dotSizeChanged(prevDotSize?: number | ContinuousAesFromColumn<number>, currentDotSize?: number | ContinuousAesFromColumn<number> ) {\n if (typeof prevDotSize === 'number' && typeof currentDotSize === 'number') {\n return prevDotSize !== currentDotSize;\n }\n if ((!prevDotSize && currentDotSize) || (!currentDotSize && prevDotSize)) {\n return true;\n }\n if (isContinuousAes(prevDotSize) && isContinuousAes(currentDotSize)) {\n return prevDotSize.range[0] !== currentDotSize.range[0] || prevDotSize.range[1] !== currentDotSize.range[1];\n }\n return false;\n}\n\nexport class ChartScatterplotUmap extends AbstractChart {\n settings: ScatterplotUmapSettingsImpl;\n chartRenderer: ChartRenderer;\n\n onPolygonUpdate: (data: number[], polygons: Polygon[]) => void = () => undefined; // dots indexes from input data\n onTooltipHintSwitch: (v:boolean) => void = () => undefined;\n onLassoControlsStateUpdate: (v: LassoControlsState) => void = () => undefined;\n onZoomChange: (isZoomChanged: boolean) => void = () => undefined;\n\n calculatedData: {\n dots: Dot[],\n groupingKeys: string[],\n dotsByGrouping: Record<string, Dot[]>,\n dotsExtents: DotsExtents,\n legendLabels: ScatterplotUmapLegendInfo,\n } | null = null;\n\n constructor(data: DataFrame, settings: ScatterplotUmapSettings, eventHandlers?: ScatterplotEventHandlers) {\n super(data, settings);\n\n this.settings = new ScatterplotUmapSettingsImpl(settings);\n this.chartRenderer = new ChartRenderer();\n\n if (eventHandlers) {\n this.onPolygonUpdate = eventHandlers.onPolygonUpdate;\n this.onTooltipHintSwitch = eventHandlers.onTooltipHintSwitch;\n this.onLassoControlsStateUpdate = eventHandlers.onLassoControlsStateUpdate;\n this.onZoomChange = eventHandlers.onZoomChange;\n }\n }\n\n mount(node: HTMLElement) {\n try {\n this.chartRenderer.init(node);\n this._updateData();\n this._updateChart();\n this.hasError = false;\n } catch (err) {\n this.hasError = true;\n console.error(err);\n if (err instanceof Error) {\n this.chartRenderer.renderError(err.message as string);\n console.error(err);\n }\n }\n }\n\n unmount() {\n this.chartRenderer.clear();\n }\n\n updateSettingsAndData(data: DataFrame, settings: ScatterplotUmapSettings) {\n try {\n const previousSettings = this.settings;\n const previousData = this.data;\n this.settings = new ScatterplotUmapSettingsImpl(settings);\n this.data = data;\n if (\n this._needUpdateCalculatedDataBySettings(previousSettings, this.settings) ||\n this._needUpdateCalculatedDataByData(previousData, this.data)\n ) {\n this._updateData();\n } else {\n this._updateAesInData();\n }\n\n // for some reason it's not enough for size updating to do like with fillColor\n const prevLayer = previousSettings.layers.find(l => l.type === 'dots') as DotsLayer;\n const currentLayer = this.settings.layers.find(l => l.type === 'dots') as DotsLayer;\n if (dotSizeChanged(prevLayer.aes.dotSize, currentLayer.aes.dotSize) && this.calculatedData) {\n this.chartRenderer.updatePointSize(this.calculatedData.legendLabels, this.settings.layers);\n }\n this._updateChart();\n this.hasError = false;\n } catch (err) {\n this.hasError = true;\n if (err instanceof Error) {\n this.chartRenderer.renderError(err.message as string);\n console.error(err);\n }\n }\n }\n\n updateChartState(field: string, value: unknown) {\n if (field === 'polygon') {\n this.chartRenderer.polygons = value as Polygon[];\n this._updateChart();\n }\n if (field === SCATTERPLOT_CONTROLS_EVENTS.lassoDelete) {\n if (document) {\n const event = new CustomEvent(SCATTERPLOT_CONTROLS_EVENTS.lassoDelete);\n document.dispatchEvent(event);\n }}\n if (field === SCATTERPLOT_CONTROLS_EVENTS.lassoSelectMode) {\n if (document) {\n const event = new CustomEvent(SCATTERPLOT_CONTROLS_EVENTS.lassoSelectMode, {detail: value as LassoMode});\n document.dispatchEvent(event);\n }\n }\n if (field === SCATTERPLOT_CONTROLS_EVENTS.lassoForward) {\n if (document) {\n const event = new CustomEvent(SCATTERPLOT_CONTROLS_EVENTS.lassoForward);\n document.dispatchEvent(event);\n }\n }\n if (field === SCATTERPLOT_CONTROLS_EVENTS.lassoBack) {\n if (document) {\n const event = new CustomEvent(SCATTERPLOT_CONTROLS_EVENTS.lassoBack);\n document.dispatchEvent(event);\n }\n }\n if (field === SCATTERPLOT_CONTROLS_EVENTS.resetViewport) {\n this.chartRenderer.resetZoom(this.settings.chartSettings.xAxis, this.settings.chartSettings.yAxis, this.calculatedData?.dotsExtents);\n this.onZoomChange(false);\n }\n }\n\n export(): string {\n console.warn('export not implemented');\n return '';\n // this._updateChart();\n // return renderToString(this.chartRenderer.component);\n }\n\n _needUpdateCalculatedDataBySettings(prevSettings: ScatterplotUmapSettingsImpl, settings: ScatterplotUmapSettingsImpl) {\n return (\n arraysAreDifferent(\n prevSettings.grouping.map(v => v.columnName.value),\n settings.grouping.map(v => v.columnName.value),\n ) ||\n arraysAreDifferent(\n prevSettings.grouping.map(v => v.columnName.nullValueLabel),\n settings.grouping.map(v => v.columnName.nullValueLabel),\n ) ||\n prevSettings.grouping.some((v, idx) => arraysAreDifferent(v.order, settings.grouping?.[idx].order)) ||\n prevSettings.layers.length !== settings.layers.length ||\n prevSettings.layers.some((l, idx) => l.type !== settings.layers[idx].type) ||\n (prevSettings.label?.value || settings.label?.value) && prevSettings.label?.value !== settings.label?.value\n );\n }\n\n _needUpdateCalculatedDataByData(prevData: DataFrame, data: DataFrame) {\n const prevKeys = Object.keys(prevData.data);\n const keys = Object.keys(data.data);\n return (\n prevData.id !== data.id ||\n prevKeys.length !== keys.length ||\n prevKeys.some(key => prevData.data[key].length !== data.data[key]?.length)\n );\n }\n\n _updateData() {\n const {x, y, label, highlight, grouping, layers} = this.settings;\n\n const dotsExtents = {\n minX: Infinity,\n maxX: -Infinity,\n minY: Infinity,\n maxY: -Infinity,\n };\n\n const hasCurve = layers.some(layer => layer.type === 'curve');\n const groupingKeysSet = new Set<string>();\n const dotsByGrouping:Record<string, Dot[]> = {};\n\n const dots: Dot[] = [];\n const labelFormatter = label?.format ? format(label.format) : undefined;\n for (let idx = 0; idx < this.data.rowsCount; idx++) {\n const xv = this.data.getColumnValue(x.value, idx);\n const yv = this.data.getColumnValue(y.value, idx);\n\n if (typeof xv !== 'number' || typeof yv !== 'number') {\n continue;\n }\n if (!isFinite(xv) || !isFinite(yv)) {\n continue;\n }\n\n if (xv < dotsExtents.minX) {\n dotsExtents.minX = xv;\n }\n if (xv > dotsExtents.maxX) {\n dotsExtents.maxX = xv;\n }\n if (yv < dotsExtents.minY) {\n dotsExtents.minY = yv;\n }\n if (yv > dotsExtents.maxY) {\n dotsExtents.maxY = yv;\n }\n\n const dimmed = highlight ? !this.data.getColumnValue(highlight.value, idx) : false;\n const dot: Dot = {\n x: xv,\n y: yv,\n idx,\n label: formatColumnValue(this.data, idx, label, labelFormatter),\n dimmed\n };\n if (hasCurve) {\n const groupingKey = grouping.map(({columnName}) => this.data.getColumnValue(columnName.value, idx)).join('_');\n groupingKeysSet.add(groupingKey);\n if (!dotsByGrouping[groupingKey]) {\n dotsByGrouping[groupingKey] = [];\n }\n dotsByGrouping[groupingKey].push(dot);\n }\n dots.push(dot);\n }\n\n const groupingKeys = [...groupingKeysSet];\n if (hasCurve) {\n groupingKeys.forEach(key => {\n dotsByGrouping[key].sort((a, b) => a.x - b.x);\n });\n }\n sortDotsByGrouping(this.data, dots, grouping, highlight, layers.find(l => l.type === 'dots'));\n const legendLabels = createLegendInfo(this.data, grouping, layers);\n\n const prevDotExtents = this.calculatedData?.dotsExtents ?? null;\n if (prevDotExtents) {\n const {minX, maxX, minY, maxY} = prevDotExtents;\n if (minX !== dotsExtents.minX || maxX !== dotsExtents.maxX \n || minY !== dotsExtents.minY || maxY !== dotsExtents.maxY) {\n this.onZoomChange(true); // dots viewport is changed but it will not be changed automatically; this call is to undisable reset button\n }\n }\n this.calculatedData = {\n dots,\n dotsByGrouping,\n groupingKeys,\n dotsExtents,\n legendLabels,\n };\n }\n\n _updateAesInData() {\n const calculated = this.calculatedData;\n if (!calculated) {\n return;\n }\n const {layers, grouping} = this.settings;\n grouping.forEach(({columnName, inheritedAes}) => {\n const usedAes = new Set<keyof AesItem>();\n const usedAesFromPalettes:Partial<Record<keyof AesItem, string[]>> = {}; // if there is palette in mapping then\n layers.forEach(layer => {\n if (!layer.aes) return;\n \n Object.entries(layer.aes).forEach(([key, value]) => {\n if (!(isInheritMapping(value) && value.value === columnName.value)) return;\n usedAes.add(key as keyof AesItem);\n if (value.palette) {\n usedAesFromPalettes[key as keyof AesItem] = value.palette;\n }\n });\n });\n\n calculated.legendLabels[columnName.value].usedAes = [...usedAes];\n calculated.legendLabels[columnName.value].aesMap = addPalettesToAesMapping(columnName, usedAesFromPalettes, inheritedAes);\n });\n }\n\n _updateChart() {\n if (!this.calculatedData) {\n return;\n }\n const {id, chartSettings, keyColumn, layers, grouping} = this.settings;\n this.chartRenderer.render(\n this.data,\n id,\n chartSettings,\n keyColumn,\n this.calculatedData.dots,\n this.calculatedData.dotsExtents,\n this.calculatedData.dotsByGrouping,\n layers,\n this.calculatedData.legendLabels,\n grouping.map(v => v.columnName),\n this.onPolygonUpdate,\n this.onTooltipHintSwitch,\n this.onLassoControlsStateUpdate,\n this.onZoomChange\n );\n }\n}\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"index.js","names":[],"sources":["../../src/scatterplot-umap/index.ts"],"sourcesContent":["import {format} from 'd3-format';\nimport { AbstractChart } from '../AbstractChart';\nimport type { DataFrame } from '../DataFrame';\nimport { addPalettesToAesMapping, createLegendInfo } from '../scatterplot/utils/createLegendInfo';\nimport {formatColumnValue} from '../scatterplot/utils/formatColumnValue';\nimport {sortDotsByGrouping} from '../scatterplot/utils/sortDotsByGrouping';\nimport { type AesItem, type ContinuousAesFromColumn, type InheritAesScatterplot, isContinuousAes, type ScatterplotEventHandlers } from '../types';\nimport type { ScatterplotUmapLegendInfo, ScatterplotUmapSettings } from '../types/scatterplot-umap';\nimport {arraysAreDifferent} from '../utils/arraysAreDifferent';\nimport ChartRenderer from './ChartRenderer';\nimport { SCATTERPLOT_CONTROLS_EVENTS } from './constants';\nimport type { DotsLayer } from './SettingsImpl';\nimport { ScatterplotUmapSettingsImpl } from './SettingsImpl';\nimport type { Dot, DotsExtents, LassoControlsState, LassoMode, Polygon } from './types';\n\nfunction isInheritMapping<T extends (string | number)>(value:T | InheritAesScatterplot | ContinuousAesFromColumn<T>):value is InheritAesScatterplot {\n return typeof value === 'object' && 'type' in value && value.type === 'grouping';\n}\n\nfunction dotSizeChanged(prevDotSize?: number | ContinuousAesFromColumn<number>, currentDotSize?: number | ContinuousAesFromColumn<number> ) {\n if (typeof prevDotSize === 'number' && typeof currentDotSize === 'number') {\n return prevDotSize !== currentDotSize;\n }\n if ((!prevDotSize && currentDotSize) || (!currentDotSize && prevDotSize)) {\n return true;\n }\n if (isContinuousAes(prevDotSize) && isContinuousAes(currentDotSize)) {\n return prevDotSize.range[0] !== currentDotSize.range[0] || prevDotSize.range[1] !== currentDotSize.range[1];\n }\n return false;\n}\n\nexport class ChartScatterplotUmap extends AbstractChart {\n settings: ScatterplotUmapSettingsImpl;\n chartRenderer: ChartRenderer;\n\n onPolygonUpdate: (data: number[], polygons: Polygon[]) => void = () => undefined; // dots indexes from input data\n onTooltipHintSwitch: (v:boolean) => void = () => undefined;\n onLassoControlsStateUpdate: (v: LassoControlsState) => void = () => undefined;\n onZoomChange: (isZoomChanged: boolean) => void = () => undefined;\n\n calculatedData: {\n dots: Dot[],\n groupingKeys: string[],\n dotsByGrouping: Record<string, Dot[]>,\n dotsExtents: DotsExtents,\n legendLabels: ScatterplotUmapLegendInfo,\n // One entry per additional curve; dots share primary x but source y from entry.columnName.\n // Grouped using the same grouping-key logic as the primary curve layer.\n additionalCurves: { entry: NonNullable<ScatterplotUmapSettingsImpl['additionalCurves']>['curves'][number], dotsByGrouping: Record<string, Dot[]>, smoothing: boolean }[],\n } | null = null;\n\n constructor(data: DataFrame, settings: ScatterplotUmapSettings, eventHandlers?: ScatterplotEventHandlers) {\n super(data, settings);\n\n this.settings = new ScatterplotUmapSettingsImpl(settings);\n this.chartRenderer = new ChartRenderer();\n\n if (eventHandlers) {\n this.onPolygonUpdate = eventHandlers.onPolygonUpdate;\n this.onTooltipHintSwitch = eventHandlers.onTooltipHintSwitch;\n this.onLassoControlsStateUpdate = eventHandlers.onLassoControlsStateUpdate;\n this.onZoomChange = eventHandlers.onZoomChange;\n }\n }\n\n mount(node: HTMLElement) {\n try {\n this.chartRenderer.init(node);\n this._updateData();\n this._updateChart();\n this.hasError = false;\n } catch (err) {\n this.hasError = true;\n console.error(err);\n if (err instanceof Error) {\n this.chartRenderer.renderError(err.message as string);\n console.error(err);\n }\n }\n }\n\n unmount() {\n this.chartRenderer.clear();\n }\n\n updateSettingsAndData(data: DataFrame, settings: ScatterplotUmapSettings) {\n try {\n const previousSettings = this.settings;\n const previousData = this.data;\n this.settings = new ScatterplotUmapSettingsImpl(settings);\n this.data = data;\n if (\n this._needUpdateCalculatedDataBySettings(previousSettings, this.settings) ||\n this._needUpdateCalculatedDataByData(previousData, this.data)\n ) {\n this._updateData();\n } else {\n this._updateAesInData();\n }\n\n // for some reason it's not enough for size updating to do like with fillColor\n const prevLayer = previousSettings.layers.find(l => l.type === 'dots') as DotsLayer;\n const currentLayer = this.settings.layers.find(l => l.type === 'dots') as DotsLayer;\n if (dotSizeChanged(prevLayer.aes.dotSize, currentLayer.aes.dotSize) && this.calculatedData) {\n this.chartRenderer.updatePointSize(this.calculatedData.legendLabels, this.settings.layers, this.settings.additionalCurves);\n }\n this._updateChart();\n this.hasError = false;\n } catch (err) {\n this.hasError = true;\n if (err instanceof Error) {\n this.chartRenderer.renderError(err.message as string);\n console.error(err);\n }\n }\n }\n\n updateChartState(field: string, value: unknown) {\n if (field === 'polygon') {\n this.chartRenderer.polygons = value as Polygon[];\n this._updateChart();\n }\n if (field === SCATTERPLOT_CONTROLS_EVENTS.lassoDelete) {\n if (document) {\n const event = new CustomEvent(SCATTERPLOT_CONTROLS_EVENTS.lassoDelete);\n document.dispatchEvent(event);\n }}\n if (field === SCATTERPLOT_CONTROLS_EVENTS.lassoSelectMode) {\n if (document) {\n const event = new CustomEvent(SCATTERPLOT_CONTROLS_EVENTS.lassoSelectMode, {detail: value as LassoMode});\n document.dispatchEvent(event);\n }\n }\n if (field === SCATTERPLOT_CONTROLS_EVENTS.lassoForward) {\n if (document) {\n const event = new CustomEvent(SCATTERPLOT_CONTROLS_EVENTS.lassoForward);\n document.dispatchEvent(event);\n }\n }\n if (field === SCATTERPLOT_CONTROLS_EVENTS.lassoBack) {\n if (document) {\n const event = new CustomEvent(SCATTERPLOT_CONTROLS_EVENTS.lassoBack);\n document.dispatchEvent(event);\n }\n }\n if (field === SCATTERPLOT_CONTROLS_EVENTS.resetViewport) {\n this.chartRenderer.resetZoom(this.settings.chartSettings.xAxis, this.settings.chartSettings.yAxis, this.calculatedData?.dotsExtents);\n this.onZoomChange(false);\n }\n }\n\n export(): string {\n console.warn('export not implemented');\n return '';\n // this._updateChart();\n // return renderToString(this.chartRenderer.component);\n }\n\n _needUpdateCalculatedDataBySettings(prevSettings: ScatterplotUmapSettingsImpl, settings: ScatterplotUmapSettingsImpl) {\n const prevCurves = prevSettings.additionalCurves?.curves ?? [];\n const curves = settings.additionalCurves?.curves ?? [];\n return (\n arraysAreDifferent(\n prevSettings.grouping.map(v => v.columnName.value),\n settings.grouping.map(v => v.columnName.value),\n ) ||\n arraysAreDifferent(\n prevSettings.grouping.map(v => v.columnName.nullValueLabel),\n settings.grouping.map(v => v.columnName.nullValueLabel),\n ) ||\n prevSettings.grouping.some((v, idx) => arraysAreDifferent(v.order, settings.grouping?.[idx].order)) ||\n prevSettings.layers.length !== settings.layers.length ||\n prevSettings.layers.some((l, idx) => l.type !== settings.layers[idx].type) ||\n (prevSettings.label?.value || settings.label?.value) && prevSettings.label?.value !== settings.label?.value ||\n // Curve count or columnName change triggers full recalc. UMAP has no per-entry trend.\n prevCurves.length !== curves.length ||\n arraysAreDifferent(prevCurves.map(c => c.columnName.value), curves.map(c => c.columnName.value))\n );\n }\n\n _needUpdateCalculatedDataByData(prevData: DataFrame, data: DataFrame) {\n const prevKeys = Object.keys(prevData.data);\n const keys = Object.keys(data.data);\n return (\n prevData.id !== data.id ||\n prevKeys.length !== keys.length ||\n prevKeys.some(key => prevData.data[key].length !== data.data[key]?.length)\n );\n }\n\n _updateData() {\n const {x, y, label, highlight, grouping, layers, additionalCurves} = this.settings;\n\n const dotsExtents = {\n minX: Infinity,\n maxX: -Infinity,\n minY: Infinity,\n maxY: -Infinity,\n };\n\n const hasCurve = layers.some(layer => layer.type === 'curve');\n const groupingKeysSet = new Set<string>();\n const dotsByGrouping:Record<string, Dot[]> = {};\n\n const dots: Dot[] = [];\n const labelFormatter = label?.format ? format(label.format) : undefined;\n for (let idx = 0; idx < this.data.rowsCount; idx++) {\n const xv = this.data.getColumnValue(x.value, idx);\n const yv = this.data.getColumnValue(y.value, idx);\n\n if (typeof xv !== 'number' || typeof yv !== 'number') {\n continue;\n }\n if (!isFinite(xv) || !isFinite(yv)) {\n continue;\n }\n\n if (xv < dotsExtents.minX) {\n dotsExtents.minX = xv;\n }\n if (xv > dotsExtents.maxX) {\n dotsExtents.maxX = xv;\n }\n if (yv < dotsExtents.minY) {\n dotsExtents.minY = yv;\n }\n if (yv > dotsExtents.maxY) {\n dotsExtents.maxY = yv;\n }\n\n const dimmed = highlight ? !this.data.getColumnValue(highlight.value, idx) : false;\n const dot: Dot = {\n x: xv,\n y: yv,\n idx,\n label: formatColumnValue(this.data, idx, label, labelFormatter),\n dimmed\n };\n if (hasCurve) {\n const groupingKey = grouping.map(({columnName}) => this.data.getColumnValue(columnName.value, idx)).join('_');\n groupingKeysSet.add(groupingKey);\n if (!dotsByGrouping[groupingKey]) {\n dotsByGrouping[groupingKey] = [];\n }\n dotsByGrouping[groupingKey].push(dot);\n }\n dots.push(dot);\n }\n\n const groupingKeys = [...groupingKeysSet];\n if (hasCurve) {\n groupingKeys.forEach(key => {\n dotsByGrouping[key].sort((a, b) => a.x - b.x);\n });\n }\n\n // Build per-entry grouped dots sourced from each entry's column as y. Same grouping-key logic as primary;\n // skip rows where overlay y is null or non-finite (they'd propagate NaN into d3 scales).\n const additionalCurvesData: NonNullable<typeof this.calculatedData>['additionalCurves'] = [];\n if (additionalCurves) {\n for (const entry of additionalCurves.curves) {\n const overlayColumn = entry.columnName.value;\n const entryDotsByGrouping: Record<string, Dot[]> = {};\n for (let idx = 0; idx < this.data.rowsCount; idx++) {\n const xv = this.data.getColumnValue(x.value, idx);\n const overlayY = this.data.getColumnValue(overlayColumn, idx);\n if (typeof xv !== 'number' || !isFinite(xv)) continue;\n if (typeof overlayY !== 'number' || !isFinite(overlayY)) continue;\n const groupingKey = grouping.map(({columnName}) => this.data.getColumnValue(columnName.value, idx)).join('_');\n if (!entryDotsByGrouping[groupingKey]) entryDotsByGrouping[groupingKey] = [];\n entryDotsByGrouping[groupingKey].push({ idx, x: xv, y: overlayY, label: null, dimmed: false });\n }\n for (const key of Object.keys(entryDotsByGrouping)) {\n entryDotsByGrouping[key].sort((a, b) => a.x - b.x);\n }\n additionalCurvesData.push({ entry, dotsByGrouping: entryDotsByGrouping, smoothing: additionalCurves.smoothing });\n }\n }\n\n sortDotsByGrouping(this.data, dots, grouping, highlight, layers.find(l => l.type === 'dots'));\n const legendLabels = createLegendInfo(this.data, grouping, layers, additionalCurves);\n\n const prevDotExtents = this.calculatedData?.dotsExtents ?? null;\n if (prevDotExtents) {\n const {minX, maxX, minY, maxY} = prevDotExtents;\n if (minX !== dotsExtents.minX || maxX !== dotsExtents.maxX \n || minY !== dotsExtents.minY || maxY !== dotsExtents.maxY) {\n this.onZoomChange(true); // dots viewport is changed but it will not be changed automatically; this call is to undisable reset button\n }\n }\n this.calculatedData = {\n dots,\n dotsByGrouping,\n groupingKeys,\n dotsExtents,\n legendLabels,\n additionalCurves: additionalCurvesData,\n };\n }\n\n _updateAesInData() {\n const calculated = this.calculatedData;\n if (!calculated) {\n return;\n }\n const {layers, grouping, additionalCurves} = this.settings;\n // Aesthetic-only refresh for additional-curve entries (UMAP has no facets; calculated.additionalCurves\n // is a flat array). Re-point entry + smoothing at the new settings so lineShape/lineWidth/lineColor/\n // opacity/showDots + shared smoothing flow into the renderer without a full recompute.\n //\n // The array AND each entry must be replaced (not mutated) — LowerSvg is React.memo'd on the\n // additionalCurves prop, so a stable reference would cause the renderer to skip the update.\n if (additionalCurves) {\n calculated.additionalCurves = calculated.additionalCurves.map((existing, i) => {\n const next = additionalCurves.curves[i];\n if (!next) return existing;\n return {\n ...existing,\n entry: next,\n smoothing: additionalCurves.smoothing,\n };\n });\n }\n grouping.forEach(({columnName, inheritedAes}) => {\n const usedAes = new Set<keyof AesItem>();\n const usedAesFromPalettes:Partial<Record<keyof AesItem, string[]>> = {}; // if there is palette in mapping then\n layers.forEach(layer => {\n if (!layer.aes) return;\n\n Object.entries(layer.aes).forEach(([key, value]) => {\n if (!(isInheritMapping(value) && value.value === columnName.value)) return;\n usedAes.add(key as keyof AesItem);\n if (value.palette) {\n usedAesFromPalettes[key as keyof AesItem] = value.palette;\n }\n });\n });\n // Mirrors scatterplot: ensure grouping-inherited lineColor on additional curves contributes\n // to the legend-info aes map, so the renderer can resolve per-group colors.\n for (const entry of additionalCurves?.curves ?? []) {\n if (isInheritMapping(entry.lineColor) && entry.lineColor.value === columnName.value) {\n usedAes.add('lineColor');\n if (entry.lineColor.palette) {\n usedAesFromPalettes['lineColor'] = entry.lineColor.palette;\n }\n }\n }\n\n calculated.legendLabels[columnName.value].usedAes = [...usedAes];\n calculated.legendLabels[columnName.value].aesMap = addPalettesToAesMapping(columnName, usedAesFromPalettes, inheritedAes);\n });\n }\n\n _updateChart() {\n if (!this.calculatedData) {\n return;\n }\n const {id, chartSettings, keyColumn, layers, grouping, additionalCurves, y} = this.settings;\n this.chartRenderer.render(\n this.data,\n id,\n chartSettings,\n keyColumn,\n this.calculatedData.dots,\n this.calculatedData.dotsExtents,\n this.calculatedData.dotsByGrouping,\n layers,\n this.calculatedData.legendLabels,\n grouping.map(v => v.columnName),\n this.onPolygonUpdate,\n this.onTooltipHintSwitch,\n this.onLassoControlsStateUpdate,\n this.onZoomChange,\n this.calculatedData.additionalCurves,\n additionalCurves,\n y,\n );\n }\n}\n"],"mappings":"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"}
|
|
@@ -43,6 +43,11 @@ export interface CaptionsSizes {
|
|
|
43
43
|
xAxisCaptionsWidth: number;
|
|
44
44
|
yAxisCaptionsWidth: number;
|
|
45
45
|
}
|
|
46
|
+
export type AdditionalCurveRenderData = {
|
|
47
|
+
entry: NonNullable<ScatterplotUmapSettingsImpl['additionalCurves']>['curves'][number];
|
|
48
|
+
dotsByGrouping: Record<string, Dot[]>;
|
|
49
|
+
smoothing: boolean;
|
|
50
|
+
};
|
|
46
51
|
export interface SVGLayerProps {
|
|
47
52
|
settingsId: string;
|
|
48
53
|
scales: ChartScales;
|
|
@@ -60,6 +65,7 @@ export interface SVGLayerProps {
|
|
|
60
65
|
labels: Label[];
|
|
61
66
|
dotsByGrouping: Record<string, Dot[]>;
|
|
62
67
|
layers: ScatterplotUmapSettingsImpl['layers'];
|
|
68
|
+
additionalCurves: AdditionalCurveRenderData[];
|
|
63
69
|
defaultPolygons: Polygon[];
|
|
64
70
|
onPolygonUpdate: (data: Polygon[]) => void;
|
|
65
71
|
onTooltipHintSwitch: (v: boolean) => void;
|
|
@@ -76,6 +82,7 @@ export type AesGetters = {
|
|
|
76
82
|
dotFill: (idx: number) => string;
|
|
77
83
|
dotSize: (idx: number) => number;
|
|
78
84
|
lineType: (idx: number) => LineShape;
|
|
85
|
+
additionalCurveLineColor: ((idx: number) => string)[];
|
|
79
86
|
};
|
|
80
87
|
export type LassoControlsState = {
|
|
81
88
|
mode: LassoMode;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/scatterplot-umap/types.ts"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/scatterplot-umap/types.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,90 @@
|
|
|
1
|
+
import { ReactElement } from 'react';
|
|
2
|
+
import { Root } from 'react-dom/client';
|
|
3
|
+
import { LegendData } from '../common/types';
|
|
4
|
+
import { ColumnName, FrameType, TitlePosition } from '../types';
|
|
5
|
+
import { Margins } from './components/types';
|
|
6
|
+
import { FacetedSelectionData } from './createSelectionData';
|
|
7
|
+
import { SelectionFillColor, SelectionSettingsImpl, SelectionXAxisSettings, SelectionYAxisSettings } from './SelectionSettingsImpl';
|
|
8
|
+
type GroupingSettings = NonNullable<SelectionSettingsImpl['grouping']>;
|
|
9
|
+
declare class ChartRenderer {
|
|
10
|
+
reactRoot: Root | null;
|
|
11
|
+
parentNode: HTMLElement | null;
|
|
12
|
+
rootNode: HTMLElement | null;
|
|
13
|
+
component: ReactElement;
|
|
14
|
+
cellPlotWidth: number;
|
|
15
|
+
cellPlotHeight: number;
|
|
16
|
+
nCols: number;
|
|
17
|
+
nRows: number;
|
|
18
|
+
isFaceted: boolean;
|
|
19
|
+
cellLabelHeight: number;
|
|
20
|
+
orderedFaceted: FacetedSelectionData;
|
|
21
|
+
facetLabels: Record<string, string[]>;
|
|
22
|
+
facetTitles: Record<string, string[]>;
|
|
23
|
+
grouped: boolean;
|
|
24
|
+
groupNames: string[];
|
|
25
|
+
colorMap: Map<string, string>;
|
|
26
|
+
solidColor: string;
|
|
27
|
+
xLabelsByFacet: Record<string, Record<string, string[]>>;
|
|
28
|
+
xCountsByFacet: Record<string, Record<string, string>>;
|
|
29
|
+
xLabelsPosition: 'center' | '45deg' | '90deg';
|
|
30
|
+
maxLabelLines: number;
|
|
31
|
+
maxLabelPx: number;
|
|
32
|
+
yTickWidth: number;
|
|
33
|
+
labelBlock: number;
|
|
34
|
+
xTitleHeight: number;
|
|
35
|
+
yTitleWidth: number;
|
|
36
|
+
yTickReserve: number;
|
|
37
|
+
xLabelTopReserve: number;
|
|
38
|
+
topPad: number;
|
|
39
|
+
rightPad: number;
|
|
40
|
+
fullLeftPad: number;
|
|
41
|
+
fullBottomPad: number;
|
|
42
|
+
colLeftPads: number[];
|
|
43
|
+
rowBottomPads: number[];
|
|
44
|
+
colXOffsets: number[];
|
|
45
|
+
rowYOffsets: number[];
|
|
46
|
+
gridWidth: number;
|
|
47
|
+
gridHeight: number;
|
|
48
|
+
legend: LegendData;
|
|
49
|
+
mainTitle: string[];
|
|
50
|
+
margins: Margins;
|
|
51
|
+
totalWidth: number;
|
|
52
|
+
totalHeight: number;
|
|
53
|
+
clear(): void;
|
|
54
|
+
init(node: HTMLElement): void;
|
|
55
|
+
updateChartSizes(width: number, height: number): void;
|
|
56
|
+
updateGrid({ faceted, facetLabels, facetBy, facetSettings, }: {
|
|
57
|
+
faceted: FacetedSelectionData;
|
|
58
|
+
facetLabels: Record<string, string[]>;
|
|
59
|
+
facetBy: ColumnName[];
|
|
60
|
+
facetSettings: SelectionSettingsImpl['facetSettings'];
|
|
61
|
+
}): void;
|
|
62
|
+
updateGroupingMaps(grouping: GroupingSettings | undefined, fillColor: SelectionFillColor): void;
|
|
63
|
+
createAxisLabels(xAxis: SelectionXAxisSettings): void;
|
|
64
|
+
updateCaptionsSize(xAxis: SelectionXAxisSettings, yAxis: SelectionYAxisSettings): void;
|
|
65
|
+
updateChartDimensions(): void;
|
|
66
|
+
updateLegendSize(showLegend: boolean, grouping: GroupingSettings | undefined): void;
|
|
67
|
+
createMainTitle(title: string, showTitle: boolean): void;
|
|
68
|
+
updateMargins(): void;
|
|
69
|
+
render({ faceted, facetLabels, width, height, title, showTitle, grouping, showLegend, facetBy, facetSettings, xAxis, yAxis, frame, titlePosition, fillColor, opacity, }: {
|
|
70
|
+
faceted: FacetedSelectionData;
|
|
71
|
+
facetLabels: Record<string, string[]>;
|
|
72
|
+
width: number;
|
|
73
|
+
height: number;
|
|
74
|
+
title: string;
|
|
75
|
+
showTitle: boolean;
|
|
76
|
+
grouping: GroupingSettings | undefined;
|
|
77
|
+
showLegend: boolean;
|
|
78
|
+
facetBy: ColumnName[];
|
|
79
|
+
facetSettings: SelectionSettingsImpl['facetSettings'];
|
|
80
|
+
xAxis: SelectionXAxisSettings;
|
|
81
|
+
yAxis: SelectionYAxisSettings;
|
|
82
|
+
frame: FrameType;
|
|
83
|
+
titlePosition: TitlePosition;
|
|
84
|
+
fillColor: SelectionFillColor;
|
|
85
|
+
opacity: number;
|
|
86
|
+
}): void;
|
|
87
|
+
renderError(message: string): void;
|
|
88
|
+
}
|
|
89
|
+
export default ChartRenderer;
|
|
90
|
+
//# sourceMappingURL=ChartRenderer.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ChartRenderer.d.ts","sourceRoot":"","sources":["../../src/selection/ChartRenderer.tsx"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,254 @@
|
|
|
1
|
+
import { Error as e } from "../common/Error.js";
|
|
2
|
+
import { TextMeasurer as t } from "../utils/TextMeasurer/TextMeasurer.js";
|
|
3
|
+
import { arrangeLegendParts as n } from "../utils/arrangeLegendParts.js";
|
|
4
|
+
import { splitTextByWidth as r } from "../utils/splitTextByWidth.js";
|
|
5
|
+
import "../discrete/utils/index.js";
|
|
6
|
+
import { AGGREGATE_RIBBON_COLOR as i } from "./constants.js";
|
|
7
|
+
import { formatCount as a, formatPercent as o } from "./utils.js";
|
|
8
|
+
import { ChartsGroup as s } from "./components/ChartsGroup.js";
|
|
9
|
+
import { scaleOrdinal as c } from "d3-scale";
|
|
10
|
+
import { createRoot as l } from "react-dom/client";
|
|
11
|
+
import { Fragment as u, jsx as d } from "react/jsx-runtime";
|
|
12
|
+
var f = class {
|
|
13
|
+
reactRoot = null;
|
|
14
|
+
parentNode = null;
|
|
15
|
+
rootNode = null;
|
|
16
|
+
component = /* @__PURE__ */ d(u, {});
|
|
17
|
+
cellPlotWidth = 0;
|
|
18
|
+
cellPlotHeight = 0;
|
|
19
|
+
nCols = 1;
|
|
20
|
+
nRows = 1;
|
|
21
|
+
isFaceted = !1;
|
|
22
|
+
cellLabelHeight = 0;
|
|
23
|
+
orderedFaceted = {
|
|
24
|
+
facetKeys: [],
|
|
25
|
+
byFacet: {},
|
|
26
|
+
groupNames: []
|
|
27
|
+
};
|
|
28
|
+
facetLabels = {};
|
|
29
|
+
facetTitles = {};
|
|
30
|
+
grouped = !1;
|
|
31
|
+
groupNames = [];
|
|
32
|
+
colorMap = /* @__PURE__ */ new Map();
|
|
33
|
+
solidColor = "";
|
|
34
|
+
xLabelsByFacet = {};
|
|
35
|
+
xCountsByFacet = {};
|
|
36
|
+
xLabelsPosition = "center";
|
|
37
|
+
maxLabelLines = 1;
|
|
38
|
+
maxLabelPx = 0;
|
|
39
|
+
yTickWidth = 0;
|
|
40
|
+
labelBlock = 0;
|
|
41
|
+
xTitleHeight = 0;
|
|
42
|
+
yTitleWidth = 0;
|
|
43
|
+
yTickReserve = 0;
|
|
44
|
+
xLabelTopReserve = 0;
|
|
45
|
+
topPad = 0;
|
|
46
|
+
rightPad = 12;
|
|
47
|
+
fullLeftPad = 0;
|
|
48
|
+
fullBottomPad = 0;
|
|
49
|
+
colLeftPads = [];
|
|
50
|
+
rowBottomPads = [];
|
|
51
|
+
colXOffsets = [0];
|
|
52
|
+
rowYOffsets = [0];
|
|
53
|
+
gridWidth = 0;
|
|
54
|
+
gridHeight = 0;
|
|
55
|
+
legend = {
|
|
56
|
+
width: 0,
|
|
57
|
+
height: 0,
|
|
58
|
+
items: []
|
|
59
|
+
};
|
|
60
|
+
mainTitle = [];
|
|
61
|
+
margins = {
|
|
62
|
+
top: 24,
|
|
63
|
+
bottom: 24,
|
|
64
|
+
left: 24,
|
|
65
|
+
right: 24
|
|
66
|
+
};
|
|
67
|
+
totalWidth = 0;
|
|
68
|
+
totalHeight = 0;
|
|
69
|
+
clear() {
|
|
70
|
+
this.parentNode && this.rootNode && (this.parentNode.removeChild(this.rootNode), this.parentNode = null, this.rootNode = null), setTimeout(() => {
|
|
71
|
+
this.reactRoot?.unmount(), this.reactRoot = null;
|
|
72
|
+
});
|
|
73
|
+
}
|
|
74
|
+
init(e) {
|
|
75
|
+
this.parentNode === null && (this.parentNode = e, this.rootNode = document.createElement("div"), this.parentNode.appendChild(this.rootNode), this.reactRoot = l(this.rootNode));
|
|
76
|
+
}
|
|
77
|
+
updateChartSizes(e, t) {
|
|
78
|
+
this.cellPlotWidth = e, this.cellPlotHeight = t;
|
|
79
|
+
}
|
|
80
|
+
updateGrid({ faceted: e, facetLabels: t, facetBy: n, facetSettings: i }) {
|
|
81
|
+
let a = i.order?.length ? i.order.filter((t) => e.facetKeys.includes(t)) : e.facetKeys;
|
|
82
|
+
if (this.orderedFaceted = {
|
|
83
|
+
...e,
|
|
84
|
+
facetKeys: a
|
|
85
|
+
}, this.facetLabels = t, this.isFaceted = n.length > 0, this.isFaceted) {
|
|
86
|
+
let e = Math.max(this.cellPlotWidth, 40);
|
|
87
|
+
this.facetTitles = {};
|
|
88
|
+
let n = 1;
|
|
89
|
+
for (let i of a) {
|
|
90
|
+
let a = (t[i] ?? []).join(" / "), o = a ? r(a, e, 20) : [];
|
|
91
|
+
this.facetTitles[i] = o, o.length > n && (n = o.length);
|
|
92
|
+
}
|
|
93
|
+
this.cellLabelHeight = 48 + (n - 1) * 24;
|
|
94
|
+
} else this.facetTitles = {}, this.cellLabelHeight = 0;
|
|
95
|
+
let o = a.length;
|
|
96
|
+
this.nCols = Math.min(o, i.nCols ?? Math.max(1, Math.ceil(Math.sqrt(o)))), this.nRows = i.nRows ?? Math.max(1, Math.ceil(o / this.nCols));
|
|
97
|
+
}
|
|
98
|
+
updateGroupingMaps(e, t) {
|
|
99
|
+
let n = typeof t == "object" && !!t;
|
|
100
|
+
this.grouped = n && !!e;
|
|
101
|
+
let r = e?.order ? e.order.map(String).filter((e) => this.orderedFaceted.groupNames.includes(e)) : this.orderedFaceted.groupNames;
|
|
102
|
+
this.groupNames = [...r, ...this.orderedFaceted.groupNames.filter((e) => !r.includes(e))];
|
|
103
|
+
let a = e?.inheritedAes;
|
|
104
|
+
if (this.colorMap = /* @__PURE__ */ new Map(), this.grouped && a) for (let e of this.groupNames) {
|
|
105
|
+
let t = a[e]?.fillColor;
|
|
106
|
+
t && this.colorMap.set(e, t);
|
|
107
|
+
}
|
|
108
|
+
this.solidColor = n ? i : t;
|
|
109
|
+
}
|
|
110
|
+
createAxisLabels(e) {
|
|
111
|
+
let n = new t("500 14px Manrope"), i = this.orderedFaceted.facetKeys, o = i.map((e) => this.orderedFaceted.byFacet[e]?.stages.length ?? 0).reduce((e, t) => Math.max(e, t), 0), s = 0;
|
|
112
|
+
for (let e of i) for (let t of this.orderedFaceted.byFacet[e]?.stages ?? []) s = Math.max(s, n.getTextWidth(t.label));
|
|
113
|
+
this.maxLabelPx = s;
|
|
114
|
+
let c = o > 0 ? this.cellPlotWidth / o : this.cellPlotWidth;
|
|
115
|
+
this.xLabelsPosition = e.labelsPosition ?? (s > c * .65 ? "90deg" : "center");
|
|
116
|
+
let l = this.xLabelsPosition !== "center";
|
|
117
|
+
this.xLabelsByFacet = {}, this.xCountsByFacet = {}, this.maxLabelLines = 1;
|
|
118
|
+
for (let e of i) {
|
|
119
|
+
let t = this.orderedFaceted.byFacet[e]?.stages ?? [], n = {}, i = {};
|
|
120
|
+
for (let [e, o] of t.entries()) {
|
|
121
|
+
let t = l ? [o.label] : r(o.label, 120, 14);
|
|
122
|
+
n[String(e)] = t, i[String(e)] = a(o.total), this.maxLabelLines = Math.max(this.maxLabelLines, t.length);
|
|
123
|
+
}
|
|
124
|
+
this.xLabelsByFacet[e] = n, this.xCountsByFacet[e] = i;
|
|
125
|
+
}
|
|
126
|
+
}
|
|
127
|
+
updateCaptionsSize(e, n) {
|
|
128
|
+
let r = new t("500 14px Manrope");
|
|
129
|
+
n.hiddenLabels ? (this.yTickWidth = 0, this.yTickReserve = n.showTicks ? 4 : 0) : (this.yTickWidth = r.getTextWidth(o(100)), this.yTickReserve = 40), e.hiddenLabels ? (this.labelBlock = 0, this.xLabelTopReserve = e.showTicks ? 4 : 0) : (this.labelBlock = this.xLabelsPosition === "center" ? this.maxLabelLines * 20 : this.xLabelsPosition === "45deg" ? Math.ceil(this.maxLabelPx * .71) + 10 : Math.ceil(this.maxLabelPx) + 10, this.xLabelTopReserve = 6), this.xTitleHeight = e.title ? 26 : 0, this.yTitleWidth = n.title ? 24 : 0;
|
|
130
|
+
}
|
|
131
|
+
updateChartDimensions() {
|
|
132
|
+
this.fullLeftPad = this.yTitleWidth + this.yTickWidth + this.yTickReserve, this.fullBottomPad = this.xLabelTopReserve + this.labelBlock + this.xTitleHeight, this.topPad = 20, this.rightPad = 12, this.colLeftPads = Array.from({ length: this.nCols }, (e, t) => !this.isFaceted || t === 0 ? this.fullLeftPad : 12);
|
|
133
|
+
let e = this.orderedFaceted.facetKeys.length % this.nCols !== 0;
|
|
134
|
+
this.rowBottomPads = Array.from({ length: this.nRows }, (t, n) => {
|
|
135
|
+
let r = n === this.nRows - 1 || n === this.nRows - 2 && e;
|
|
136
|
+
return !this.isFaceted || r ? this.fullBottomPad : 12;
|
|
137
|
+
}), this.colXOffsets = [0];
|
|
138
|
+
for (let [e, t] of this.colLeftPads.entries()) this.colXOffsets.push(this.colXOffsets[e] + t + this.cellPlotWidth + this.rightPad);
|
|
139
|
+
this.rowYOffsets = [0];
|
|
140
|
+
for (let [e, t] of this.rowBottomPads.entries()) this.rowYOffsets.push(this.rowYOffsets[e] + this.topPad + this.cellLabelHeight + this.cellPlotHeight + t);
|
|
141
|
+
this.gridWidth = this.colXOffsets[this.nCols], this.gridHeight = this.rowYOffsets[this.nRows];
|
|
142
|
+
}
|
|
143
|
+
updateLegendSize(e, t) {
|
|
144
|
+
if (!e || !this.grouped || this.groupNames.length === 0) {
|
|
145
|
+
this.legend = {
|
|
146
|
+
width: 0,
|
|
147
|
+
height: 0,
|
|
148
|
+
items: []
|
|
149
|
+
};
|
|
150
|
+
return;
|
|
151
|
+
}
|
|
152
|
+
let r = n([{
|
|
153
|
+
id: "selection-group",
|
|
154
|
+
type: "discreteColor",
|
|
155
|
+
title: t?.columnName.label ?? t?.columnName.value ?? "",
|
|
156
|
+
width: 0,
|
|
157
|
+
height: 0,
|
|
158
|
+
left: 0,
|
|
159
|
+
top: 0,
|
|
160
|
+
values: this.groupNames,
|
|
161
|
+
scale: c().domain(this.groupNames).range(this.groupNames.map((e) => this.colorMap.get(e) ?? "")),
|
|
162
|
+
labels: Object.fromEntries(this.groupNames.map((e) => [e, e === "null" ? t?.columnName.nullValueLabel ?? "N/A" : e]))
|
|
163
|
+
}], this.cellPlotHeight);
|
|
164
|
+
this.legend = {
|
|
165
|
+
width: r.reduce((e, t) => Math.max(e, t.left + t.width), 0) + 24,
|
|
166
|
+
height: this.cellPlotHeight,
|
|
167
|
+
items: r
|
|
168
|
+
};
|
|
169
|
+
}
|
|
170
|
+
createMainTitle(e, t) {
|
|
171
|
+
this.mainTitle = t && e ? r(e, Math.max(this.cellPlotWidth, 40), 20) : [];
|
|
172
|
+
}
|
|
173
|
+
updateMargins() {
|
|
174
|
+
let e = this.mainTitle.length > 0 ? this.mainTitle.length * 24 + 48 : 0;
|
|
175
|
+
this.margins = {
|
|
176
|
+
top: Math.max(e, 24),
|
|
177
|
+
bottom: 24,
|
|
178
|
+
left: 24,
|
|
179
|
+
right: 24 + this.legend.width
|
|
180
|
+
}, this.totalWidth = this.margins.left + this.gridWidth + this.margins.right, this.totalHeight = this.margins.top + this.gridHeight + this.margins.bottom;
|
|
181
|
+
}
|
|
182
|
+
render({ faceted: e, facetLabels: t, width: n, height: r, title: i, showTitle: a, grouping: o, showLegend: c, facetBy: l, facetSettings: u, xAxis: f, yAxis: p, frame: m, titlePosition: h, fillColor: g, opacity: _ }) {
|
|
183
|
+
this.updateChartSizes(n, r), this.updateGrid({
|
|
184
|
+
faceted: e,
|
|
185
|
+
facetLabels: t,
|
|
186
|
+
facetBy: l,
|
|
187
|
+
facetSettings: u
|
|
188
|
+
}), this.updateGroupingMaps(o, g), this.createAxisLabels(f), this.updateCaptionsSize(f, p), this.updateChartDimensions(), this.updateLegendSize(c, o), this.createMainTitle(i, a), this.updateMargins();
|
|
189
|
+
let v = /* @__PURE__ */ d(s, {
|
|
190
|
+
facetData: {
|
|
191
|
+
faceted: this.orderedFaceted,
|
|
192
|
+
facetLabels: this.facetLabels,
|
|
193
|
+
facetTitles: this.facetTitles
|
|
194
|
+
},
|
|
195
|
+
gridLayout: {
|
|
196
|
+
nRows: this.nRows,
|
|
197
|
+
nCols: this.nCols,
|
|
198
|
+
totalWidth: this.totalWidth,
|
|
199
|
+
totalHeight: this.totalHeight,
|
|
200
|
+
margins: this.margins,
|
|
201
|
+
cellPlotWidth: this.cellPlotWidth,
|
|
202
|
+
cellPlotHeight: this.cellPlotHeight,
|
|
203
|
+
cellLabelHeight: this.cellLabelHeight,
|
|
204
|
+
topPad: this.topPad,
|
|
205
|
+
rightPad: this.rightPad,
|
|
206
|
+
colLeftPads: this.colLeftPads,
|
|
207
|
+
rowBottomPads: this.rowBottomPads,
|
|
208
|
+
colXOffsets: this.colXOffsets,
|
|
209
|
+
rowYOffsets: this.rowYOffsets,
|
|
210
|
+
sharedX: this.isFaceted,
|
|
211
|
+
sharedY: this.isFaceted
|
|
212
|
+
},
|
|
213
|
+
xAxis: {
|
|
214
|
+
labelsByFacet: this.xLabelsByFacet,
|
|
215
|
+
countsByFacet: this.xCountsByFacet,
|
|
216
|
+
countsFontSize: 14,
|
|
217
|
+
labelsPosition: this.xLabelsPosition,
|
|
218
|
+
showGrid: f.showGrid,
|
|
219
|
+
showTicks: f.showTicks,
|
|
220
|
+
hiddenLabels: f.hiddenLabels,
|
|
221
|
+
title: f.title
|
|
222
|
+
},
|
|
223
|
+
yAxis: {
|
|
224
|
+
showGrid: p.showGrid,
|
|
225
|
+
showTicks: p.showTicks,
|
|
226
|
+
hiddenLabels: p.hiddenLabels,
|
|
227
|
+
title: p.title
|
|
228
|
+
},
|
|
229
|
+
style: {
|
|
230
|
+
frameType: this.isFaceted ? "full" : m,
|
|
231
|
+
barColor: this.solidColor,
|
|
232
|
+
opacity: _,
|
|
233
|
+
colorMap: this.colorMap,
|
|
234
|
+
nullValueLabel: o?.columnName.nullValueLabel
|
|
235
|
+
},
|
|
236
|
+
title: {
|
|
237
|
+
text: this.mainTitle,
|
|
238
|
+
show: this.mainTitle.length > 0,
|
|
239
|
+
position: h
|
|
240
|
+
},
|
|
241
|
+
legend: this.legend,
|
|
242
|
+
showFacetLabels: this.isFaceted,
|
|
243
|
+
grouped: this.grouped,
|
|
244
|
+
orderedGroupNames: this.groupNames
|
|
245
|
+
});
|
|
246
|
+
this.component = v, this.reactRoot?.render(v);
|
|
247
|
+
}
|
|
248
|
+
renderError(t) {
|
|
249
|
+
this.reactRoot?.render(/* @__PURE__ */ d(e, { message: t }));
|
|
250
|
+
}
|
|
251
|
+
};
|
|
252
|
+
export { f as default };
|
|
253
|
+
|
|
254
|
+
//# sourceMappingURL=ChartRenderer.js.map
|