@milaboratories/miplots4 1.0.179 → 1.1.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.
Files changed (60) hide show
  1. package/dist/scatterplot/ChartRenderer.d.ts +2 -2
  2. package/dist/scatterplot/ChartRenderer.d.ts.map +1 -1
  3. package/dist/scatterplot/ChartRenderer.js +155 -115
  4. package/dist/scatterplot/ChartRenderer.js.map +1 -1
  5. package/dist/scatterplot/ScatterplotSettingsImpl.d.ts +11 -1
  6. package/dist/scatterplot/ScatterplotSettingsImpl.d.ts.map +1 -1
  7. package/dist/scatterplot/ScatterplotSettingsImpl.js +20 -0
  8. package/dist/scatterplot/ScatterplotSettingsImpl.js.map +1 -1
  9. package/dist/scatterplot/components/ChartLayersData.d.ts +5 -0
  10. package/dist/scatterplot/components/ChartLayersData.d.ts.map +1 -1
  11. package/dist/scatterplot/components/ChartLayersData.js +115 -35
  12. package/dist/scatterplot/components/ChartLayersData.js.map +1 -1
  13. package/dist/scatterplot/components/types.d.ts +2 -0
  14. package/dist/scatterplot/components/types.d.ts.map +1 -1
  15. package/dist/scatterplot/getLayersData.d.ts +11 -2
  16. package/dist/scatterplot/getLayersData.d.ts.map +1 -1
  17. package/dist/scatterplot/getLayersData.js +36 -19
  18. package/dist/scatterplot/getLayersData.js.map +1 -1
  19. package/dist/scatterplot/index.d.ts.map +1 -1
  20. package/dist/scatterplot/index.js +51 -33
  21. package/dist/scatterplot/index.js.map +1 -1
  22. package/dist/scatterplot/linearRegression.js +1 -1
  23. package/dist/scatterplot/utils/createAesGetter.d.ts.map +1 -1
  24. package/dist/scatterplot/utils/createAesGetter.js +5 -3
  25. package/dist/scatterplot/utils/createAesGetter.js.map +1 -1
  26. package/dist/scatterplot/utils/createLegendInfo.d.ts +11 -2
  27. package/dist/scatterplot/utils/createLegendInfo.d.ts.map +1 -1
  28. package/dist/scatterplot/utils/createLegendInfo.js +21 -16
  29. package/dist/scatterplot/utils/createLegendInfo.js.map +1 -1
  30. package/dist/scatterplot-umap/ChartRenderer.d.ts +6 -6
  31. package/dist/scatterplot-umap/ChartRenderer.d.ts.map +1 -1
  32. package/dist/scatterplot-umap/ChartRenderer.js +99 -57
  33. package/dist/scatterplot-umap/ChartRenderer.js.map +1 -1
  34. package/dist/scatterplot-umap/SettingsImpl.d.ts +11 -1
  35. package/dist/scatterplot-umap/SettingsImpl.d.ts.map +1 -1
  36. package/dist/scatterplot-umap/SettingsImpl.js +21 -1
  37. package/dist/scatterplot-umap/SettingsImpl.js.map +1 -1
  38. package/dist/scatterplot-umap/components/LowerSVG.d.ts +3 -2
  39. package/dist/scatterplot-umap/components/LowerSVG.d.ts.map +1 -1
  40. package/dist/scatterplot-umap/components/LowerSVG.js +159 -108
  41. package/dist/scatterplot-umap/components/LowerSVG.js.map +1 -1
  42. package/dist/scatterplot-umap/components/SVGLayer.d.ts +1 -1
  43. package/dist/scatterplot-umap/components/SVGLayer.d.ts.map +1 -1
  44. package/dist/scatterplot-umap/components/SVGLayer.js +9 -8
  45. package/dist/scatterplot-umap/components/SVGLayer.js.map +1 -1
  46. package/dist/scatterplot-umap/index.d.ts +6 -1
  47. package/dist/scatterplot-umap/index.d.ts.map +1 -1
  48. package/dist/scatterplot-umap/index.js +65 -31
  49. package/dist/scatterplot-umap/index.js.map +1 -1
  50. package/dist/scatterplot-umap/types.d.ts +7 -0
  51. package/dist/scatterplot-umap/types.d.ts.map +1 -1
  52. package/dist/types/scatterplot-umap.d.ts +763 -87
  53. package/dist/types/scatterplot-umap.d.ts.map +1 -1
  54. package/dist/types/scatterplot-umap.js +19 -3
  55. package/dist/types/scatterplot-umap.js.map +1 -1
  56. package/dist/types/scatterplot.d.ts +1377 -44
  57. package/dist/types/scatterplot.d.ts.map +1 -1
  58. package/dist/types/scatterplot.js +27 -3
  59. package/dist/types/scatterplot.js.map +1 -1
  60. package/package.json +1 -1
@@ -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
- 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;
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, l = {
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
- }, d = c.some((e) => e.type === "curve"), f = /* @__PURE__ */ new Set(), p = {}, m = [], h = n?.format ? u(n.format) : void 0;
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 < l.minX && (l.minX = o), o > l.maxX && (l.maxX = o), c < l.minY && (l.minY = c), c > l.maxY && (l.maxY = c);
89
- let u = a ? !this.data.getColumnValue(a.value, i) : !1, g = {
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, h),
94
- dimmed: u
94
+ label: r(this.data, i, n, g),
95
+ dimmed: l
95
96
  };
96
- if (d) {
97
+ if (f) {
97
98
  let e = s.map(({ columnName: e }) => this.data.getColumnValue(e.value, i)).join("_");
98
- f.add(e), p[e] || (p[e] = []), p[e].push(g);
99
+ p.add(e), m[e] || (m[e] = []), m[e].push(u);
99
100
  }
100
- m.push(g);
101
+ h.push(u);
101
102
  }
102
- let g = [...f];
103
- d && g.forEach((e) => {
104
- p[e].sort((e, t) => e.x - t.x);
105
- }), i(this.data, m, s, a, c.find((e) => e.type === "dots"));
106
- let _ = o(this.data, s, c), v = this.calculatedData?.dotsExtents ?? null;
107
- if (v) {
108
- let { minX: e, maxX: t, minY: n, maxY: r } = v;
109
- (e !== l.minX || t !== l.maxX || n !== l.minY || r !== l.maxY) && this.onZoomChange(!0);
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: m,
113
- dotsByGrouping: p,
114
- groupingKeys: g,
115
- dotsExtents: l,
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
- n.forEach(({ columnName: n, inheritedAes: r }) => {
124
- let i = /* @__PURE__ */ new Set(), o = {};
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 && (i.add(e), t.palette && (o[e] = t.palette));
159
+ d(t) && t.value === n.value && (o.add(e), t.palette && (s[e] = t.palette));
128
160
  });
129
- }), e.legendLabels[n.value].usedAes = [...i], e.legendLabels[n.value].aesMap = a(n, o, r);
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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"}