@milaboratories/graph-maker 1.1.142 → 1.1.143
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/GraphMaker/components/ReorderForm.vue.d.ts +15 -0
- package/dist/GraphMaker/components/ReorderForm.vue.d.ts.map +1 -0
- package/dist/GraphMaker/components/ReorderForm.vue.js +43 -0
- package/dist/GraphMaker/components/ReorderForm.vue.js.map +1 -0
- package/dist/GraphMaker/components/ReorderForm.vue2.js +5 -0
- package/dist/GraphMaker/components/ReorderForm.vue2.js.map +1 -0
- package/dist/GraphMaker/constantsCommon.d.ts +15 -0
- package/dist/GraphMaker/constantsCommon.d.ts.map +1 -1
- package/dist/GraphMaker/constantsCommon.js +11 -8
- package/dist/GraphMaker/constantsCommon.js.map +1 -1
- package/dist/GraphMaker/forms/AxesSettingsForm/DiscreteAxesSettingsForm.vue.js.map +1 -1
- package/dist/GraphMaker/forms/AxesSettingsForm/ScatterplotAxesSettingsForm.vue.d.ts.map +1 -1
- package/dist/GraphMaker/forms/AxesSettingsForm/ScatterplotAxesSettingsForm.vue.js +305 -172
- package/dist/GraphMaker/forms/AxesSettingsForm/ScatterplotAxesSettingsForm.vue.js.map +1 -1
- package/dist/GraphMaker/index.vue.js +33 -33
- package/dist/GraphMaker/index.vue.js.map +1 -1
- package/dist/GraphMaker/utils/createChartSettingsForRender/composeBubbleSettings.d.ts +3 -3
- package/dist/GraphMaker/utils/createChartSettingsForRender/composeBubbleSettings.d.ts.map +1 -1
- package/dist/GraphMaker/utils/createChartSettingsForRender/composeDendroSettings.d.ts +9 -9
- package/dist/GraphMaker/utils/createChartSettingsForRender/composeDendroSettings.d.ts.map +1 -1
- package/dist/GraphMaker/utils/createChartSettingsForRender/composeDiscreteSettings.d.ts +5 -11
- package/dist/GraphMaker/utils/createChartSettingsForRender/composeDiscreteSettings.d.ts.map +1 -1
- package/dist/GraphMaker/utils/createChartSettingsForRender/composeHeatmapSettings.d.ts +3 -3
- package/dist/GraphMaker/utils/createChartSettingsForRender/composeHeatmapSettings.d.ts.map +1 -1
- package/dist/GraphMaker/utils/createChartSettingsForRender/composeHistogramSettings.d.ts +1 -1
- package/dist/GraphMaker/utils/createChartSettingsForRender/composeScatterplotSettings.d.ts +31 -5
- package/dist/GraphMaker/utils/createChartSettingsForRender/composeScatterplotSettings.d.ts.map +1 -1
- package/dist/GraphMaker/utils/createChartSettingsForRender/composeScatterplotSettings.js +56 -53
- package/dist/GraphMaker/utils/createChartSettingsForRender/composeScatterplotSettings.js.map +1 -1
- package/dist/GraphMaker/utils/createChartSettingsForRender/composeScatterplotUmapSettings.d.ts +1 -7
- package/dist/GraphMaker/utils/createChartSettingsForRender/composeScatterplotUmapSettings.d.ts.map +1 -1
- package/dist/GraphMaker/utils/createChartSettingsForRender/composeScatterplotUmapSettings.js +13 -13
- package/dist/GraphMaker/utils/createChartSettingsForRender/composeScatterplotUmapSettings.js.map +1 -1
- package/dist/GraphMaker/utils/createChartSettingsForRender/getAxesDataFromForms.d.ts +6 -4
- package/dist/GraphMaker/utils/createChartSettingsForRender/getAxesDataFromForms.d.ts.map +1 -1
- package/dist/GraphMaker/utils/createChartSettingsForRender/getAxesDataFromForms.js +42 -13
- package/dist/GraphMaker/utils/createChartSettingsForRender/getAxesDataFromForms.js.map +1 -1
- package/dist/GraphMaker/utils/loadUniqueValuesToSave.d.ts.map +1 -1
- package/dist/GraphMaker/utils/loadUniqueValuesToSave.js +48 -44
- package/dist/GraphMaker/utils/loadUniqueValuesToSave.js.map +1 -1
- package/dist/node_modules/@milaboratories/miplots4/dist/{discrete/components → common}/BandAxis.js +3 -3
- package/dist/node_modules/@milaboratories/miplots4/dist/common/BandAxis.js.map +1 -0
- package/dist/node_modules/@milaboratories/miplots4/dist/common/ContinuousGrid.js.map +1 -1
- package/dist/node_modules/@milaboratories/miplots4/dist/dendro/ChartRenderer.js +14 -14
- package/dist/node_modules/@milaboratories/miplots4/dist/discrete/ChartRenderer.js +197 -270
- package/dist/node_modules/@milaboratories/miplots4/dist/discrete/ChartRenderer.js.map +1 -1
- package/dist/node_modules/@milaboratories/miplots4/dist/discrete/DiscreteSettingsImpl.js +9 -9
- package/dist/node_modules/@milaboratories/miplots4/dist/discrete/components/Chart.js +1 -1
- package/dist/node_modules/@milaboratories/miplots4/dist/discrete/components/Chart.js.map +1 -1
- package/dist/node_modules/@milaboratories/miplots4/dist/discrete/components/Grid.js.map +1 -1
- package/dist/node_modules/@milaboratories/miplots4/dist/discrete/index.js +11 -11
- package/dist/node_modules/@milaboratories/miplots4/dist/histogram/ChartRenderer.js +1 -1
- package/dist/node_modules/@milaboratories/miplots4/dist/node_modules/d3-scale/src/band.js +44 -34
- package/dist/node_modules/@milaboratories/miplots4/dist/node_modules/d3-scale/src/band.js.map +1 -1
- package/dist/node_modules/@milaboratories/miplots4/dist/scatterplot/ChartRenderer.js +272 -195
- package/dist/node_modules/@milaboratories/miplots4/dist/scatterplot/ChartRenderer.js.map +1 -1
- package/dist/node_modules/@milaboratories/miplots4/dist/scatterplot/ScatterplotSettingsImpl.js +23 -23
- package/dist/node_modules/@milaboratories/miplots4/dist/scatterplot/ScatterplotSettingsImpl.js.map +1 -1
- package/dist/node_modules/@milaboratories/miplots4/dist/scatterplot/components/Chart.js +54 -50
- package/dist/node_modules/@milaboratories/miplots4/dist/scatterplot/components/Chart.js.map +1 -1
- package/dist/node_modules/@milaboratories/miplots4/dist/scatterplot/components/ChartAxis.js +32 -28
- package/dist/node_modules/@milaboratories/miplots4/dist/scatterplot/components/ChartAxis.js.map +1 -1
- package/dist/node_modules/@milaboratories/miplots4/dist/scatterplot/components/ChartLayersData.js.map +1 -1
- package/dist/node_modules/@milaboratories/miplots4/dist/scatterplot/components/ChartTooltip.js.map +1 -1
- package/dist/node_modules/@milaboratories/miplots4/dist/scatterplot/components/ChartTrendsData.js +29 -26
- package/dist/node_modules/@milaboratories/miplots4/dist/scatterplot/components/ChartTrendsData.js.map +1 -1
- package/dist/node_modules/@milaboratories/miplots4/dist/scatterplot/components/ChartsGroup.js +44 -41
- package/dist/node_modules/@milaboratories/miplots4/dist/scatterplot/components/ChartsGroup.js.map +1 -1
- package/dist/node_modules/@milaboratories/miplots4/dist/scatterplot/components/Grid.js +31 -27
- package/dist/node_modules/@milaboratories/miplots4/dist/scatterplot/components/Grid.js.map +1 -1
- package/dist/node_modules/@milaboratories/miplots4/dist/scatterplot/dots.js.map +1 -1
- package/dist/node_modules/@milaboratories/miplots4/dist/scatterplot/getLayersData.js +29 -18
- package/dist/node_modules/@milaboratories/miplots4/dist/scatterplot/getLayersData.js.map +1 -1
- package/dist/node_modules/@milaboratories/miplots4/dist/scatterplot/index.js +71 -57
- package/dist/node_modules/@milaboratories/miplots4/dist/scatterplot/index.js.map +1 -1
- package/dist/node_modules/@milaboratories/miplots4/dist/scatterplot/linearRegression.js.map +1 -1
- package/dist/node_modules/@milaboratories/miplots4/dist/scatterplot/utils/isNumericScale.js +11 -0
- package/dist/node_modules/@milaboratories/miplots4/dist/scatterplot/utils/isNumericScale.js.map +1 -0
- package/dist/node_modules/@milaboratories/miplots4/dist/scatterplot-umap/ChartRenderer.js +10 -10
- package/dist/node_modules/@milaboratories/miplots4/dist/scatterplot-umap/ChartRenderer.js.map +1 -1
- package/dist/node_modules/@milaboratories/miplots4/dist/scatterplot-umap/SettingsImpl.js.map +1 -1
- package/dist/node_modules/@milaboratories/miplots4/dist/scatterplot-umap/components/LowerSVG.js +6 -6
- package/dist/node_modules/@milaboratories/miplots4/dist/scatterplot-umap/components/LowerSVG.js.map +1 -1
- package/dist/node_modules/@milaboratories/miplots4/dist/types/common.js +35 -25
- package/dist/node_modules/@milaboratories/miplots4/dist/types/common.js.map +1 -1
- package/dist/node_modules/@milaboratories/miplots4/dist/types/dendro.js +3 -3
- package/dist/node_modules/@milaboratories/miplots4/dist/types/discrete.js +37 -37
- package/dist/node_modules/@milaboratories/miplots4/dist/types/discrete.js.map +1 -1
- package/dist/node_modules/@milaboratories/miplots4/dist/types/heatmap.js +6 -6
- package/dist/node_modules/@milaboratories/miplots4/dist/types/scatterplot-umap.js +7 -7
- package/dist/node_modules/@milaboratories/miplots4/dist/types/scatterplot-umap.js.map +1 -1
- package/dist/node_modules/@milaboratories/miplots4/dist/utils/createMultilineDiscreteLabels.js +32 -0
- package/dist/node_modules/@milaboratories/miplots4/dist/utils/createMultilineDiscreteLabels.js.map +1 -0
- package/dist/node_modules/@milaboratories/miplots4/dist/utils/getFacetRowsColumns.js +18 -0
- package/dist/node_modules/@milaboratories/miplots4/dist/utils/getFacetRowsColumns.js.map +1 -0
- package/dist/node_modules/@milaboratories/miplots4/dist/utils/measureMultilineDiscreteLabels.js +63 -0
- package/dist/node_modules/@milaboratories/miplots4/dist/utils/measureMultilineDiscreteLabels.js.map +1 -0
- package/dist/node_modules/@milaboratories/miplots4/dist/{discrete/utils → utils}/splitTextByWidth.js +1 -1
- package/dist/node_modules/@milaboratories/miplots4/dist/utils/splitTextByWidth.js.map +1 -0
- package/dist/node_modules/@milaboratories/pf-plots/dist/controllers/controllersByChartType/scatterplot.js +2 -2
- package/dist/node_modules/@milaboratories/pf-plots/dist/controllers/controllersByChartType/scatterplot.js.map +1 -1
- package/package.json +3 -3
- package/dist/node_modules/@milaboratories/miplots4/dist/discrete/components/BandAxis.js.map +0 -1
- package/dist/node_modules/@milaboratories/miplots4/dist/discrete/utils/splitTextByWidth.js.map +0 -1
- package/dist/node_modules/@milaboratories/miplots4/dist/scatterplot/components/Axis.js +0 -59
- package/dist/node_modules/@milaboratories/miplots4/dist/scatterplot/components/Axis.js.map +0 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"linearRegression.js","sources":["../../../../../../node_modules/@milaboratories/miplots4/src/scatterplot/linearRegression.ts"],"sourcesContent":["import fCDF from '@stdlib/stats-base-dists-f-cdf';\nimport { extent, mean, sum } from 'd3-array';\nimport type { ScaleLinear } from 'd3-scale';\nimport { area } from 'd3-shape';\nimport type { DataFrame } from '../DataFrame';\nimport type { ColumnName, ContinuousAesFromColumn, InheritAesScatterplot } from '../types';\nimport type { Dot, GroupedDots } from './dots';\nimport type { ScatterplotSettingsImpl } from './ScatterplotSettingsImpl';\n\nconst CONFIDENCE_LEVEL = 0.05;\n\n/*\n Returns the normal deviate Z corresponding to a given lower tail area of P; Z is accurate to about 1 part in 10**16.\n\n Wichura, M. J. (1988) Algorithm AS 241: The percentage points of the normal distribution. Applied Statistics, 37, 477–484.\n\n extension of:\n Beasley, J. D./ Springer, S. G. (1977), The percentage points of the NormalDistribution, Applied Statistics. 26, 118–121.\n\n Excel: STANDNORMINV(); R: qnorm()\n */\n\nfunction normdev(p: number) {\n if (p < 0 || p > 1) throw Error('P p < 0 || p > 1 in linear regression calculation');\n if (p == 0) return -Infinity;\n if (p == 1) return Infinity;\n\n /* eslint-disable @typescript-eslint/no-loss-of-precision */\n const a0 = 3.387132872796366608,\n a1 = 1.3314166789178437745e2,\n a2 = 1.9715909503065514427e3,\n a3 = 1.3731693765509461125e4,\n a4 = 4.5921953931549871457e4,\n a5 = 6.7265770927008700853e4,\n a6 = 3.3430575583588128105e4,\n a7 = 2.5090809287301226727e3,\n b1 = 4.2313330701600911252e1,\n b2 = 6.871870074920579083e2,\n b3 = 5.3941960214247511077e3,\n b4 = 2.1213794301586595867e4,\n b5 = 3.930789580009271061e4,\n b6 = 2.8729085735721942674e4,\n b7 = 5.226495278852854561e3,\n c0 = 1.42343711074968357734,\n c1 = 4.6303378461565452959,\n c2 = 5.7694972214606914055,\n c3 = 3.64784832476320460504,\n c4 = 1.27045825245236838258,\n c5 = 2.4178072517745061177e-1,\n c6 = 2.27238449892691845833e-2,\n c7 = 7.7454501427834140764e-4,\n d1 = 2.05319162663775882187,\n d2 = 1.6763848301838038494,\n d3 = 6.8976733498510000455e-1,\n d4 = 1.4810397642748007459e-1,\n d5 = 1.51986665636164571966e-2,\n d6 = 5.475938084995344946e-4,\n d7 = 1.05075007164441684324e-9,\n e0 = 6.6579046435011037772,\n e1 = 5.4637849111641143699,\n e2 = 1.7848265399172913358,\n e3 = 2.9656057182850489123e-1,\n e4 = 2.6532189526576123093e-2,\n e5 = 1.2426609473880784386e-3,\n e6 = 2.71155556874348757815e-5,\n e7 = 2.01033439929228813265e-7,\n f1 = 5.9983220655588793769e-1,\n f2 = 1.3692988092273580531e-1,\n f3 = 1.48753612908506148525e-2,\n f4 = 7.868691311456132591e-4,\n f5 = 1.8463183175100546818e-5,\n f6 = 1.4215117583164458887e-7,\n f7 = 2.04426310338993978564e-15;\n /* eslint-enable @typescript-eslint/no-loss-of-precision */\n\n const q = p - 0.5;\n let r, z;\n\n // p close to 0.5\n if (Math.abs(q) <= 0.425) {\n r = 0.180625 - q * q;\n z =\n (q * (((((((a7 * r + a6) * r + a5) * r + a4) * r + a3) * r + a2) * r + a1) * r + a0)) /\n (((((((b7 * r + b6) * r + b5) * r + b4) * r + b3) * r + b2) * r + b1) * r + 1);\n return z;\n }\n\n if (q > 0) r = 1 - p;\n else r = p;\n r = Math.sqrt(-Math.log(r));\n\n // p neither close to 0.5 nor 0 or 1\n if (r <= 5) {\n r += -1.6;\n z =\n (((((((c7 * r + c6) * r + c5) * r + c4) * r + c3) * r + c2) * r + c1) * r + c0) /\n (((((((d7 * r + d6) * r + d5) * r + d4) * r + d3) * r + d2) * r + d1) * r + 1);\n }\n // p near 0 or 1\n else {\n r += -5;\n z =\n (((((((e7 * r + e6) * r + e5) * r + e4) * r + e3) * r + e2) * r + e1) * r + e0) /\n (((((((f7 * r + f6) * r + f5) * r + f4) * r + f3) * r + f2) * r + f1) * r + 1);\n }\n\n if (q < 0.0) z = -z;\n return z;\n}\n\n/*\nHill's approximated inverse t-distribution calculates t given df and two-tail probability:\nHill, G. W. (1970), Algorithm 396: Student's t-quantiles. Communications of the ACM, 13(10), 619–620.\n\nResult should be \"correct to at least 6 significant digits even for the analytic continuation through noninteger values of n > 5\". For higher precision (used in R, ...) see:\nHill, G. W. (1981) Remark on Algorithm 396, ACM Transactions on Mathematical Software, 7, 250–1.\n\nExcel: TINV(); R: qt()\n*/\nfunction inverseT(p: number, df: number) {\n const {sin, cos, sqrt, pow, exp, PI} = Math;\n let x: number, y: number;\n\n if (df == 1) return cos((p * PI) / 2) / sin((p * PI) / 2);\n if (df == 2) return sqrt(2 / (p * (2 - p)) - 2);\n\n const a = 1 / (df - 0.5);\n const b = 48 / (a * a);\n let c = (((20700 * a) / b - 98) * a - 16) * a + 96.36;\n const d = ((94.5 / (b + c) - 3) / b + 1) * sqrt(a * PI * 0.5) * df;\n x = d * p;\n y = pow(x, 2 / df);\n\n if (y > 0.05 + a) {\n // The procedure normdev(p) is assumed to return a negative normal\n // deviate at the lower tail probability level p, e.g. -2.32 for p = 0.01.\n x = normdev(p / 2);\n y = x * x;\n if (df < 5) c = c + 0.3 * (df - 4.5) * (x + 0.6);\n c = (((0.05 * d * x - 5) * x - 7) * x - 2) * x + b + c;\n y = (((((0.4 * y + 6.3) * y + 36) * y + 94.5) / c - y - 3) / b + 1) * x;\n y = a * y * y;\n if (y > 0.002) y = exp(y) - 1;\n else y = 0.5 * y * y + y;\n } else {\n y =\n (((1 / (((df + 6) / (df * y) - 0.089 * d - 0.822) * (df + 2) * 3) + 0.5 / (df + 4)) * y - 1) * (df + 1)) /\n (df + 2) +\n 1 / y;\n }\n\n return sqrt(df * y);\n}\n\nexport function linearRegression(data: {x: number; y: number}[]): [number, number] {\n let n = data.length,\n sumX = 0,\n sumY = 0,\n sumXY = 0,\n sumX2 = 0;\n for (let i = 0; i < data.length; ++i) {\n const xi = data[i].x;\n const yi = data[i].y;\n if (!Number.isFinite(xi) || !Number.isFinite(yi)) {\n --n;\n continue;\n }\n sumX += xi;\n sumY += yi;\n sumXY += xi * yi;\n sumX2 += xi * xi;\n }\n const slope = (n * sumXY - sumX * sumY) / (n * sumX2 - sumX * sumX);\n const intercept = (sumY - slope * sumX) / n;\n\n return [slope, intercept];\n}\n\nfunction getCoefficientsInterval(dots: Dot[], slope: number, intercept: number) {\n const predict = (x: number) => x * slope + intercept;\n const n = dots.length;\n const meanX = sum(dots, d => d.x) / dots.length;\n const t = inverseT(CONFIDENCE_LEVEL, n - 2);\n\n const se_b = Math.sqrt(\n sum(dots, dot => (dot.y - predict(dot.x)) ** 2) / (n - 2) / sum(dots, dot => (dot.x - meanX) ** 2)\n );\n const slopeError = se_b * t;\n\n const se_a = se_b * Math.sqrt(sum(dots, dot => dot.x ** 2) / n);\n const interceptError = se_a * t;\n\n return {slope, intercept, slopeError, interceptError};\n}\n\nexport type PointIntervalInfo = {\n x: number; y: number, left: number; right: number\n}\n// https://stats.stackexchange.com/questions/101318/understanding-shape-and-calculation-of-confidence-bands-in-linear-regression\nexport function confidenceInterval(\n data: {x: number; y: number}[],\n predict: (x: number) => number\n): (x: number) => PointIntervalInfo {\n const mean = sum(data, d => d.x) / data.length;\n let a = 0,\n b = 0;\n for (let i = 0; i < data.length; ++i) {\n a += Math.pow(data[i].x - mean, 2);\n b += Math.pow(data[i].y - predict(data[i].x), 2);\n }\n const sy = Math.sqrt(b / (data.length - 2));\n const t = inverseT(CONFIDENCE_LEVEL, data.length - 2);\n return function (x: number) {\n const Y = predict(x);\n const se = sy * Math.sqrt(1 / data.length + Math.pow(x - mean, 2) / a);\n const left = Y - t * se;\n const right = Y + t * se;\n return {x, y: Y, left: isNaN(left) ? Y : left, right: isNaN(right) ? Y : right};\n };\n}\n\nfunction getR2(dots: Dot[]) {\n const n = dots.length;\n return Math.pow(\n (n * sum(dots, (d: Dot) => d.x * d.y) - sum(dots, (d: Dot) => d.x) * sum(dots, (d: Dot) => d.y)) /\n (Math.sqrt(\n n * sum(dots, d => d.x * d.x) -\n Math.pow(\n sum(dots, d => d.x),\n 2\n )\n ) *\n Math.sqrt(\n n * sum(dots, d => d.y * d.y) -\n Math.pow(\n sum(dots, d => d.y),\n 2\n )\n )),\n 2\n );\n}\n\nfunction getVariance(arr: Dot[], getter: (d: Dot) => number) {\n const vMean = mean(arr, getter) as number;\n\n return mean(arr.map(v => (getter(v) - vMean) ** 2)) as number;\n}\n\nfunction getStandardDeviation(arr: Dot[], getter: (d: Dot) => number) {\n return Math.sqrt(getVariance(arr, getter));\n}\n\nfunction getCovariance(arr: Dot[], getterX: (d: Dot) => number, getterY: (d: Dot) => number) {\n const meanX = mean(arr, getterX) as number;\n const meanY = mean(arr, getterY) as number;\n const n = arr.length;\n\n return sum(arr, d => (d.x - meanX) * (d.y - meanY)) / n;\n}\n\nfunction getR(dots: Dot[]) {\n const cov = getCovariance(\n dots,\n d => d.x,\n d => d.y\n );\n const sigmaX = getStandardDeviation(dots, d => d.x);\n const sigmaY = getStandardDeviation(dots, d => d.y);\n\n return cov / (sigmaX * sigmaY);\n}\n\nfunction getPValue(dots: Dot[], predict: (x: number) => number) {\n const n = dots.length;\n const p = 1; // number of coefficients\n const dfm = 1; // degrees of freedom model\n const dfe = n - p - 1; // degrees of freedom error\n const meanY = mean(dots, d => d.y) as number;\n const ssr = sum(dots, d => (predict(d.x) - meanY) ** 2); // sum of squares regression\n const sse = sum(dots, d => (predict(d.x) - d.y) ** 2); // sum of squares errors\n\n const msr = ssr / dfm;\n const mse = sse / dfe;\n\n const f = msr / mse;\n\n const pval = fCDF(f, dfm, dfe);\n\n return 1.0 - pval; // \"greater\" p-value\n}\n\ntype TrendInfo = {\n idx: number;\n predict: (x: number) => number;\n getInterval: (x: number) => PointIntervalInfo;\n getArea: (x: ScaleLinear<number, number>, y: ScaleLinear<number, number>, range: number[]) => string;\n color: string | InheritAesScatterplot | ContinuousAesFromColumn<string>;\n bounded: boolean;\n showStats: boolean;\n xBounds: [number, number];\n stats: {\n r2?: number;\n r?: number;\n pValue?: number;\n coefficients?: {slope: number, intercept: number, slopeError:number, interceptError: number};\n };\n};\nexport type TrendsData = Record<string, TrendInfo[]>;\n\nexport function getRegressionData(\n dataFrame: DataFrame,\n dotsByFacets: GroupedDots,\n facetKeys: string[],\n groupingKeysValues: string[][],\n grouping: ColumnName[],\n trend: ScatterplotSettingsImpl['trend']\n): TrendsData | null {\n if (!trend) {\n return null;\n }\n return facetKeys.reduce((res: TrendsData, facetKey) => {\n const facetDots = dotsByFacets[facetKey].dots;\n \n res[facetKey] = groupingKeysValues\n .map(values => {\n const dots = facetDots.filter(dot =>\n grouping.every((column, idx) => String(dataFrame.getColumnValue(column.value, dot.idx)) === values[idx])\n );\n\n if (dots.length === 0) return null;\n\n const [minX = 0, maxX = 0] = extent(dots, (dot: Dot) => dot.x);\n const [slope, intercept] = linearRegression(dots);\n const predict = (x: number) => slope * x + intercept;\n const getInterval = confidenceInterval(dots, predict);\n\n return {\n idx: dots[0].idx,\n predict,\n getInterval,\n getArea: (scaleX: ScaleLinear<number, number>, scaleY: ScaleLinear<number, number>, range: number[]) =>\n area<PointIntervalInfo>()\n .x(d => scaleX(d.x))\n .y0(d => scaleY(d.left))\n .y1(d => scaleY(d.right))(range.map(getInterval)) ?? '',\n color: trend.color,\n bounded: trend.bounded,\n showStats: true,\n xBounds: [minX, maxX],\n stats: {\n r2: getR2(dots),\n r: getR(dots),\n pValue: getPValue(dots, predict),\n coefficients: getCoefficientsInterval(dots, slope, intercept),\n },\n };\n })\n .filter((item) => item !== null) as TrendInfo[];\n \n return res;\n }, {});\n}\n"],"names":["CONFIDENCE_LEVEL","normdev","p","a0","a1","a2","a3","a4","a5","a6","a7","b1","b2","b3","b4","b5","b6","b7","c0","c1","c2","c3","c4","c5","c6","c7","d1","d2","d3","d4","d5","d6","d7","e0","e1","e2","e3","e4","e5","e6","e7","f1","f2","f3","f4","f5","f6","f7","q","r","z","inverseT","df","sin","cos","sqrt","pow","exp","PI","x","y","a","b","c","d","linearRegression","data","n","sumX","sumY","sumXY","sumX2","i","xi","yi","slope","intercept","getCoefficientsInterval","dots","predict","meanX","sum","t","se_b","dot","slopeError","interceptError","confidenceInterval","mean","sy","Y","se","left","right","getR2","getVariance","arr","getter","vMean","v","getStandardDeviation","getCovariance","getterX","getterY","meanY","getR","cov","sigmaX","sigmaY","getPValue","dfm","dfe","ssr","sse","msr","mse","f","fCDF","getRegressionData","dataFrame","dotsByFacets","facetKeys","groupingKeysValues","grouping","trend","res","facetKey","facetDots","values","column","idx","minX","maxX","extent","getInterval","scaleX","scaleY","range","area","item"],"mappings":"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","x_google_ignoreList":[0]}
|
|
1
|
+
{"version":3,"file":"linearRegression.js","sources":["../../../../../../node_modules/@milaboratories/miplots4/src/scatterplot/linearRegression.ts"],"sourcesContent":["import fCDF from '@stdlib/stats-base-dists-f-cdf';\nimport { extent, mean, sum } from 'd3-array';\nimport type { ScaleLinear } from 'd3-scale';\nimport { area } from 'd3-shape';\nimport type { DataFrame } from '../DataFrame';\nimport type { ColumnName, ContinuousAesFromColumn, InheritAesScatterplot } from '../types';\nimport type { Dot, GroupedDots } from './dots';\nimport type { ScatterplotSettingsImpl } from './ScatterplotSettingsImpl';\n\ntype NumericDot = {x: number, y:number};\nconst CONFIDENCE_LEVEL = 0.05;\n\n/*\n Returns the normal deviate Z corresponding to a given lower tail area of P; Z is accurate to about 1 part in 10**16.\n\n Wichura, M. J. (1988) Algorithm AS 241: The percentage points of the normal distribution. Applied Statistics, 37, 477–484.\n\n extension of:\n Beasley, J. D./ Springer, S. G. (1977), The percentage points of the NormalDistribution, Applied Statistics. 26, 118–121.\n\n Excel: STANDNORMINV(); R: qnorm()\n */\n\nfunction normdev(p: number) {\n if (p < 0 || p > 1) throw Error('P p < 0 || p > 1 in linear regression calculation');\n if (p == 0) return -Infinity;\n if (p == 1) return Infinity;\n\n /* eslint-disable @typescript-eslint/no-loss-of-precision */\n const a0 = 3.387132872796366608,\n a1 = 1.3314166789178437745e2,\n a2 = 1.9715909503065514427e3,\n a3 = 1.3731693765509461125e4,\n a4 = 4.5921953931549871457e4,\n a5 = 6.7265770927008700853e4,\n a6 = 3.3430575583588128105e4,\n a7 = 2.5090809287301226727e3,\n b1 = 4.2313330701600911252e1,\n b2 = 6.871870074920579083e2,\n b3 = 5.3941960214247511077e3,\n b4 = 2.1213794301586595867e4,\n b5 = 3.930789580009271061e4,\n b6 = 2.8729085735721942674e4,\n b7 = 5.226495278852854561e3,\n c0 = 1.42343711074968357734,\n c1 = 4.6303378461565452959,\n c2 = 5.7694972214606914055,\n c3 = 3.64784832476320460504,\n c4 = 1.27045825245236838258,\n c5 = 2.4178072517745061177e-1,\n c6 = 2.27238449892691845833e-2,\n c7 = 7.7454501427834140764e-4,\n d1 = 2.05319162663775882187,\n d2 = 1.6763848301838038494,\n d3 = 6.8976733498510000455e-1,\n d4 = 1.4810397642748007459e-1,\n d5 = 1.51986665636164571966e-2,\n d6 = 5.475938084995344946e-4,\n d7 = 1.05075007164441684324e-9,\n e0 = 6.6579046435011037772,\n e1 = 5.4637849111641143699,\n e2 = 1.7848265399172913358,\n e3 = 2.9656057182850489123e-1,\n e4 = 2.6532189526576123093e-2,\n e5 = 1.2426609473880784386e-3,\n e6 = 2.71155556874348757815e-5,\n e7 = 2.01033439929228813265e-7,\n f1 = 5.9983220655588793769e-1,\n f2 = 1.3692988092273580531e-1,\n f3 = 1.48753612908506148525e-2,\n f4 = 7.868691311456132591e-4,\n f5 = 1.8463183175100546818e-5,\n f6 = 1.4215117583164458887e-7,\n f7 = 2.04426310338993978564e-15;\n /* eslint-enable @typescript-eslint/no-loss-of-precision */\n\n const q = p - 0.5;\n let r, z;\n\n // p close to 0.5\n if (Math.abs(q) <= 0.425) {\n r = 0.180625 - q * q;\n z =\n (q * (((((((a7 * r + a6) * r + a5) * r + a4) * r + a3) * r + a2) * r + a1) * r + a0)) /\n (((((((b7 * r + b6) * r + b5) * r + b4) * r + b3) * r + b2) * r + b1) * r + 1);\n return z;\n }\n\n if (q > 0) r = 1 - p;\n else r = p;\n r = Math.sqrt(-Math.log(r));\n\n // p neither close to 0.5 nor 0 or 1\n if (r <= 5) {\n r += -1.6;\n z =\n (((((((c7 * r + c6) * r + c5) * r + c4) * r + c3) * r + c2) * r + c1) * r + c0) /\n (((((((d7 * r + d6) * r + d5) * r + d4) * r + d3) * r + d2) * r + d1) * r + 1);\n }\n // p near 0 or 1\n else {\n r += -5;\n z =\n (((((((e7 * r + e6) * r + e5) * r + e4) * r + e3) * r + e2) * r + e1) * r + e0) /\n (((((((f7 * r + f6) * r + f5) * r + f4) * r + f3) * r + f2) * r + f1) * r + 1);\n }\n\n if (q < 0.0) z = -z;\n return z;\n}\n\n/*\nHill's approximated inverse t-distribution calculates t given df and two-tail probability:\nHill, G. W. (1970), Algorithm 396: Student's t-quantiles. Communications of the ACM, 13(10), 619–620.\n\nResult should be \"correct to at least 6 significant digits even for the analytic continuation through noninteger values of n > 5\". For higher precision (used in R, ...) see:\nHill, G. W. (1981) Remark on Algorithm 396, ACM Transactions on Mathematical Software, 7, 250–1.\n\nExcel: TINV(); R: qt()\n*/\nfunction inverseT(p: number, df: number) {\n const {sin, cos, sqrt, pow, exp, PI} = Math;\n let x: number, y: number;\n\n if (df == 1) return cos((p * PI) / 2) / sin((p * PI) / 2);\n if (df == 2) return sqrt(2 / (p * (2 - p)) - 2);\n\n const a = 1 / (df - 0.5);\n const b = 48 / (a * a);\n let c = (((20700 * a) / b - 98) * a - 16) * a + 96.36;\n const d = ((94.5 / (b + c) - 3) / b + 1) * sqrt(a * PI * 0.5) * df;\n x = d * p;\n y = pow(x, 2 / df);\n\n if (y > 0.05 + a) {\n // The procedure normdev(p) is assumed to return a negative normal\n // deviate at the lower tail probability level p, e.g. -2.32 for p = 0.01.\n x = normdev(p / 2);\n y = x * x;\n if (df < 5) c = c + 0.3 * (df - 4.5) * (x + 0.6);\n c = (((0.05 * d * x - 5) * x - 7) * x - 2) * x + b + c;\n y = (((((0.4 * y + 6.3) * y + 36) * y + 94.5) / c - y - 3) / b + 1) * x;\n y = a * y * y;\n if (y > 0.002) y = exp(y) - 1;\n else y = 0.5 * y * y + y;\n } else {\n y =\n (((1 / (((df + 6) / (df * y) - 0.089 * d - 0.822) * (df + 2) * 3) + 0.5 / (df + 4)) * y - 1) * (df + 1)) /\n (df + 2) +\n 1 / y;\n }\n\n return sqrt(df * y);\n}\n\nexport function linearRegression(data: NumericDot[]): [number, number] {\n let n = data.length,\n sumX = 0,\n sumY = 0,\n sumXY = 0,\n sumX2 = 0;\n for (let i = 0; i < data.length; ++i) {\n const xi = data[i].x;\n const yi = data[i].y;\n if (!Number.isFinite(xi) || !Number.isFinite(yi)) {\n --n;\n continue;\n }\n sumX += xi;\n sumY += yi;\n sumXY += xi * yi;\n sumX2 += xi * xi;\n }\n const slope = (n * sumXY - sumX * sumY) / (n * sumX2 - sumX * sumX);\n const intercept = (sumY - slope * sumX) / n;\n\n return [slope, intercept];\n}\n\nfunction getCoefficientsInterval(dots: NumericDot[], slope: number, intercept: number) {\n const predict = (x: number) => x * slope + intercept;\n const n = dots.length;\n const meanX = sum(dots, d => d.x) / dots.length;\n const t = inverseT(CONFIDENCE_LEVEL, n - 2);\n\n const se_b = Math.sqrt(\n sum(dots, dot => (dot.y - predict(dot.x)) ** 2) / (n - 2) / sum(dots, dot => (dot.x - meanX) ** 2)\n );\n const slopeError = se_b * t;\n\n const se_a = se_b * Math.sqrt(sum(dots, dot => dot.x ** 2) / n);\n const interceptError = se_a * t;\n\n return {slope, intercept, slopeError, interceptError};\n}\n\nexport type PointIntervalInfo = {\n x: number; y: number, left: number; right: number\n}\n// https://stats.stackexchange.com/questions/101318/understanding-shape-and-calculation-of-confidence-bands-in-linear-regression\nexport function confidenceInterval(\n data: NumericDot[],\n predict: (x: number) => number\n): (x: number) => PointIntervalInfo {\n const mean = sum(data, d => d.x) / data.length;\n let a = 0,\n b = 0;\n for (let i = 0; i < data.length; ++i) {\n a += Math.pow(data[i].x - mean, 2);\n b += Math.pow(data[i].y - predict(data[i].x), 2);\n }\n const sy = Math.sqrt(b / (data.length - 2));\n const t = inverseT(CONFIDENCE_LEVEL, data.length - 2);\n return function (x: number) {\n const Y = predict(x);\n const se = sy * Math.sqrt(1 / data.length + Math.pow(x - mean, 2) / a);\n const left = Y - t * se;\n const right = Y + t * se;\n return {x, y: Y, left: isNaN(left) ? Y : left, right: isNaN(right) ? Y : right};\n };\n}\n\nfunction getR2(dots: NumericDot[]) {\n const n = dots.length;\n return Math.pow(\n (n * sum(dots, (d: NumericDot) => d.x * d.y) - sum(dots, (d: NumericDot) => d.x) * sum(dots, (d: NumericDot) => d.y)) /\n (Math.sqrt(\n n * sum(dots, d => d.x * d.x) -\n Math.pow(\n sum(dots, d => d.x),\n 2\n )\n ) *\n Math.sqrt(\n n * sum(dots, d => d.y * d.y) -\n Math.pow(\n sum(dots, d => d.y),\n 2\n )\n )),\n 2\n );\n}\n\nfunction getVariance(arr: NumericDot[], getter: (d: NumericDot) => number) {\n const vMean = mean(arr, getter) as number;\n\n return mean(arr.map(v => (getter(v) - vMean) ** 2)) as number;\n}\n\nfunction getStandardDeviation(arr: NumericDot[], getter: (d: NumericDot) => number) {\n return Math.sqrt(getVariance(arr, getter));\n}\n\nfunction getCovariance(arr: NumericDot[], getterX: (d: NumericDot) => number, getterY: (d: NumericDot) => number) {\n const meanX = mean(arr, getterX) as number;\n const meanY = mean(arr, getterY) as number;\n const n = arr.length;\n\n return sum(arr, d => (d.x - meanX) * (d.y - meanY)) / n;\n}\n\nfunction getR(dots: NumericDot[]) {\n const cov = getCovariance(\n dots,\n d => d.x,\n d => d.y\n );\n const sigmaX = getStandardDeviation(dots, d => d.x);\n const sigmaY = getStandardDeviation(dots, d => d.y);\n\n return cov / (sigmaX * sigmaY);\n}\n\nfunction getPValue(dots: NumericDot[], predict: (x: number) => number) {\n const n = dots.length;\n const p = 1; // number of coefficients\n const dfm = 1; // degrees of freedom model\n const dfe = n - p - 1; // degrees of freedom error\n const meanY = mean(dots, d => d.y) as number;\n const ssr = sum(dots, d => (predict(d.x) - meanY) ** 2); // sum of squares regression\n const sse = sum(dots, d => (predict(d.x) - d.y) ** 2); // sum of squares errors\n\n const msr = ssr / dfm;\n const mse = sse / dfe;\n\n const f = msr / mse;\n\n const pval = fCDF(f, dfm, dfe);\n\n return 1.0 - pval; // \"greater\" p-value\n}\n\ntype TrendInfo = {\n idx: number;\n predict: (x: number) => number;\n getInterval: (x: number) => PointIntervalInfo;\n getArea: (x: ScaleLinear<number, number>, y: ScaleLinear<number, number>, range: number[]) => string;\n color: string | InheritAesScatterplot | ContinuousAesFromColumn<string>;\n bounded: boolean;\n showStats: boolean;\n xBounds: [number, number];\n stats: {\n r2?: number;\n r?: number;\n pValue?: number;\n coefficients?: {slope: number, intercept: number, slopeError:number, interceptError: number};\n };\n};\nexport type TrendsData = Record<string, TrendInfo[]>;\n\nexport function getRegressionData(\n dataFrame: DataFrame,\n dotsByFacets: GroupedDots,\n facetKeys: string[],\n groupingKeysValues: string[][],\n grouping: ColumnName[],\n trend: ScatterplotSettingsImpl['trend']\n): TrendsData | null {\n if (!trend) {\n return null;\n }\n return facetKeys.reduce((res: TrendsData, facetKey) => {\n const facetDots = dotsByFacets[facetKey].dots;\n \n res[facetKey] = groupingKeysValues\n .map(values => {\n const dots = facetDots.filter(dot =>\n grouping.every((column, idx) => String(dataFrame.getColumnValue(column.value, dot.idx)) === values[idx])\n ) as NumericDot[];\n\n if (dots.length === 0) return null;\n\n const [minX = 0, maxX = 0] = extent(dots, (dot: NumericDot) => dot.x);\n const [slope, intercept] = linearRegression(dots);\n const predict = (x: number) => slope * x + intercept;\n const getInterval = confidenceInterval(dots, predict);\n\n return {\n idx: (dots[0] as Dot).idx,\n predict,\n getInterval,\n getArea: (scaleX: ScaleLinear<number, number>, scaleY: ScaleLinear<number, number>, range: number[]) =>\n area<PointIntervalInfo>()\n .x(d => scaleX(d.x))\n .y0(d => scaleY(d.left))\n .y1(d => scaleY(d.right))(range.map(getInterval)) ?? '',\n color: trend.color,\n bounded: trend.bounded,\n showStats: true,\n xBounds: [minX, maxX],\n stats: {\n r2: getR2(dots),\n r: getR(dots),\n pValue: getPValue(dots, predict),\n coefficients: getCoefficientsInterval(dots, slope, intercept),\n },\n };\n })\n .filter((item) => item !== null) as TrendInfo[];\n \n return res;\n }, {});\n}\n"],"names":["CONFIDENCE_LEVEL","normdev","p","a0","a1","a2","a3","a4","a5","a6","a7","b1","b2","b3","b4","b5","b6","b7","c0","c1","c2","c3","c4","c5","c6","c7","d1","d2","d3","d4","d5","d6","d7","e0","e1","e2","e3","e4","e5","e6","e7","f1","f2","f3","f4","f5","f6","f7","q","r","z","inverseT","df","sin","cos","sqrt","pow","exp","PI","x","y","a","b","c","d","linearRegression","data","n","sumX","sumY","sumXY","sumX2","i","xi","yi","slope","intercept","getCoefficientsInterval","dots","predict","meanX","sum","t","se_b","dot","slopeError","interceptError","confidenceInterval","mean","sy","Y","se","left","right","getR2","getVariance","arr","getter","vMean","v","getStandardDeviation","getCovariance","getterX","getterY","meanY","getR","cov","sigmaX","sigmaY","getPValue","dfm","dfe","ssr","sse","msr","mse","f","fCDF","getRegressionData","dataFrame","dotsByFacets","facetKeys","groupingKeysValues","grouping","trend","res","facetKey","facetDots","values","column","idx","minX","maxX","extent","getInterval","scaleX","scaleY","range","area","item"],"mappings":"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","x_google_ignoreList":[0]}
|
package/dist/node_modules/@milaboratories/miplots4/dist/scatterplot/utils/isNumericScale.js.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"isNumericScale.js","sources":["../../../../../../../node_modules/@milaboratories/miplots4/src/scatterplot/utils/isNumericScale.ts"],"sourcesContent":["import type { ScalePoint } from 'd3-scale';\nimport type { ChartScales } from '../components/types';\nimport type { AxisSettings, AxisSettingsContinuous } from '../../types';\n\nexport function isNumericScale(scale: ChartScales['x' | 'y']): scale is Exclude<ChartScales['x' | 'y'], ScalePoint<string | number>> {\n return !('bandwidth' in (scale as ScalePoint<string | number>));\n}\n\nexport function isContinuousAxis(axis:AxisSettings): axis is AxisSettingsContinuous {\n return axis.scale !== 'discrete';\n}"],"names":["isNumericScale","scale","isContinuousAxis","axis"],"mappings":"AAIO,SAASA,EAAeC,GAAsG;AACjI,SAAO,EAAE,eAAgBA;AAC7B;AAEO,SAASC,EAAiBC,GAAmD;AAChF,SAAOA,EAAK,UAAU;AAC1B;","x_google_ignoreList":[0]}
|
|
@@ -9,13 +9,13 @@ import q from "../node_modules/d3-zoom/src/zoom.js";
|
|
|
9
9
|
import "../node_modules/d3-zoom/src/transform.js";
|
|
10
10
|
import { createRoot as X } from "../node_modules/react-dom/client.js";
|
|
11
11
|
import { Error as Y } from "../common/Error.js";
|
|
12
|
-
import { DEFAULT_HEIGHT as w, DEFAULT_WIDTH as E, TITLE_LINE_HEIGHT as Q, BLACK as
|
|
13
|
-
import { splitTextByWidth as Z } from "../
|
|
12
|
+
import { DEFAULT_HEIGHT as w, DEFAULT_WIDTH as E, TITLE_LINE_HEIGHT as Q, BLACK as $, TITLE_MARGIN as J } from "../constants.js";
|
|
13
|
+
import { splitTextByWidth as Z } from "../utils/splitTextByWidth.js";
|
|
14
14
|
import { MIN_MARGIN as C, DEFAULT_DOT_AES as M } from "../scatterplot/constants.js";
|
|
15
15
|
import { createAesGetter as P } from "../scatterplot/utils/createAesGetter.js";
|
|
16
16
|
import { getTicksAndFormat as tt } from "../scatterplot/utils/getTicksAndFormat.js";
|
|
17
17
|
import { createLabelPositioner as et } from "../scatterplot/utils/getVisibleLabels.js";
|
|
18
|
-
import { isContinuousAes as
|
|
18
|
+
import { isContinuousAes as F } from "../types/common.js";
|
|
19
19
|
import "../types/discrete.js";
|
|
20
20
|
import "../types/scatterplot.js";
|
|
21
21
|
import "../types/heatmap.js";
|
|
@@ -24,7 +24,7 @@ import "../types/histogram.js";
|
|
|
24
24
|
import "../types/bubble.js";
|
|
25
25
|
import { getContinuousColorScale as st } from "../utils/getContinuousColorScale.js";
|
|
26
26
|
import { getContinuousLegendTicks as it } from "../utils/getContinuousLegendTicks.js";
|
|
27
|
-
import { TextMeasurer as
|
|
27
|
+
import { TextMeasurer as G } from "../utils/TextMeasurer/TextMeasurer.js";
|
|
28
28
|
import { SVGLayer as at } from "./components/SVGLayer.js";
|
|
29
29
|
import { PADDINGS as D, TITLE_LINE as I, LEGEND_OFFSET as ot } from "./constants.js";
|
|
30
30
|
import lt from "../node_modules/@d3fc/d3fc-pointer/src/pointer.js";
|
|
@@ -58,7 +58,7 @@ class ie {
|
|
|
58
58
|
constructor() {
|
|
59
59
|
c(this, "reactRoot", null), c(this, "parentNode", null), c(this, "rootNode", null), c(this, "canvasNode", null), c(this, "svgLayerElement", null), c(this, "svgLayerComponent", /* @__PURE__ */ b.jsx(b.Fragment, {})), c(this, "aesGetters", {
|
|
60
60
|
dotSize: () => 2,
|
|
61
|
-
dotFill: () =>
|
|
61
|
+
dotFill: () => $,
|
|
62
62
|
lineType: () => "solid"
|
|
63
63
|
}), c(this, "tools", null), c(this, "margins", {
|
|
64
64
|
top: C,
|
|
@@ -127,7 +127,7 @@ class ie {
|
|
|
127
127
|
d.domain([g.invert(this.chartSizes.chartHeight), g.invert(0)]).range(n).nice(), this.scales.y = d, this.scales.yOriginal = d.copy();
|
|
128
128
|
}
|
|
129
129
|
updateCaptionsSize() {
|
|
130
|
-
const t = new
|
|
130
|
+
const t = new G("600 14px Arial");
|
|
131
131
|
function e(r) {
|
|
132
132
|
return Math.max(...r.map((u) => t.getTextWidth(u)));
|
|
133
133
|
}
|
|
@@ -166,17 +166,17 @@ class ie {
|
|
|
166
166
|
const g = {};
|
|
167
167
|
n.values.forEach((m) => {
|
|
168
168
|
g[m] || (g[m] = { ...M }), n.usedAes.forEach((v) => {
|
|
169
|
-
v === "dotFill" && (g[m].color = n.aesMap(m, v) ??
|
|
169
|
+
v === "dotFill" && (g[m].color = n.aesMap(m, v) ?? $), v === "dotSize" && (g[m].size = Number(n.aesMap(m, v) ?? 3));
|
|
170
170
|
});
|
|
171
171
|
});
|
|
172
172
|
const o = d.label ?? d.value, y = dt().domain(n.values).range(n.values.map((m) => g[m]));
|
|
173
173
|
a.push({ ...r, id: d.value, type: "dots", title: o, scale: y, values: n.values, labels: n.labels });
|
|
174
174
|
}), l.forEach((d) => {
|
|
175
|
-
if (d.type === "dots" &&
|
|
175
|
+
if (d.type === "dots" && F(d.aes.dotFill)) {
|
|
176
176
|
const { domain: n, range: g, columnName: o, type: y = "linear" } = d.aes.dotFill, m = o.label ?? o.value, v = st(g, n, "linear"), i = (y === "log" ? ct() : T()).domain(n).range([this.chartSizes.chartHeight, 0]), h = it(i, n);
|
|
177
177
|
a.push({ ...r, id: "dotFill", type: "continuous", title: m, scale: v, tickPositionScale: i, values: h });
|
|
178
178
|
}
|
|
179
|
-
if (d.type === "dots" &&
|
|
179
|
+
if (d.type === "dots" && F(d.aes.dotSize)) {
|
|
180
180
|
const { columnName: n, domain: g, range: o } = d.aes.dotSize, y = n.label ?? n.value, m = mt(g, o), v = m.ticks(3), i = m.tickFormat(3), h = v.reduce((z, L) => (z[String(L)] = i(L), z), {});
|
|
181
181
|
a.push({ ...r, id: n.value, type: "size", title: y, scale: m, values: v, labels: h });
|
|
182
182
|
}
|
|
@@ -323,7 +323,7 @@ class ie {
|
|
|
323
323
|
(e = this.reactRoot) == null || e.render(/* @__PURE__ */ b.jsx(Y, { message: t }));
|
|
324
324
|
}
|
|
325
325
|
computeLabels(t) {
|
|
326
|
-
const e = new
|
|
326
|
+
const e = new G("16px Manrope"), s = et(this.chartSizes.chartWidth, this.chartSizes.chartHeight), l = [];
|
|
327
327
|
for (let a = 0; a < t.length; a++) {
|
|
328
328
|
const r = t[a];
|
|
329
329
|
if (r.label == null)
|
package/dist/node_modules/@milaboratories/miplots4/dist/scatterplot-umap/ChartRenderer.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ChartRenderer.js","sources":["../../../../../../node_modules/@milaboratories/miplots4/src/scatterplot-umap/ChartRenderer.tsx"],"sourcesContent":["import { chartCartesian } from '@d3fc/d3fc-chart';\nimport type { CartesianChart } from '@d3fc/d3fc-chart/src/cartesian';\nimport type { ScaleLinear } from 'd3-scale';\nimport { scaleLinear, scaleLog, scaleOrdinal, scaleSqrt, scaleSymlog } from 'd3-scale';\nimport { select } from 'd3-selection';\nimport type { D3ZoomEvent, ZoomBehavior, ZoomTransform } from 'd3-zoom';\nimport { zoom } from 'd3-zoom';\nimport type { ReactElement } from 'react';\nimport type { Root } from 'react-dom/client';\nimport { createRoot } from 'react-dom/client';\nimport { Error } from '../common/Error';\nimport type { DotAesItem, LegendData, LegendItem } from '../common/types';\nimport {\n BLACK,\n DEFAULT_HEIGHT,\n DEFAULT_WIDTH,\n TITLE_LINE_HEIGHT,\n TITLE_MARGIN\n} from '../constants';\nimport { splitTextByWidth } from '../discrete/utils';\nimport { DEFAULT_DOT_AES, MIN_MARGIN } from '../scatterplot/constants';\nimport { createAesGetter } from '../scatterplot/utils/createAesGetter';\nimport { getTicksAndFormat } from '../scatterplot/utils/getTicksAndFormat';\nimport type { Label } from '../scatterplot/utils/getVisibleLabels';\nimport { createLabelPositioner } from '../scatterplot/utils/getVisibleLabels';\nimport type { ColumnName, ScatterplotEventHandlers } from '../types';\nimport { isContinuousAes } from '../types';\nimport type { ScatterplotUmapLegendInfo } from '../types/scatterplot-umap';\nimport { getContinuousColorScale } from '../utils/getContinuousColorScale';\nimport { getContinuousLegendTicks } from '../utils/getContinuousLegendTicks';\nimport { TextMeasurer } from '../utils/TextMeasurer/TextMeasurer';\nimport { SVGLayer } from './components/SVGLayer';\nimport { LEGEND_OFFSET, PADDINGS, TITLE_LINE } from './constants';\nimport type { CurveLayer, DotsLayer, ScatterplotUmapLayer, ScatterplotUmapSettingsImpl } from './SettingsImpl';\nimport type {\n AesGetters,\n CaptionsSizes,\n ChartScales, ChartSizes,\n Dot,\n DotsExtents,\n LassoControlsState,\n Margins,\n Polygon,\n SVGLayerProps,\n} from './types';\n// @ts-ignore\nimport { seriesSvgMulti, seriesWebglMulti, seriesWebglPoint } from '@d3fc/d3fc-series';\n// @ts-ignore\nimport { webglFillColor } from '@d3fc/d3fc-webgl';\n// @ts-ignore\nimport { pointer } from '@d3fc/d3fc-pointer';\nimport { polygonContains } from 'd3-polygon';\nimport KDBush from 'kdbush';\nimport { DataFrameProvider } from '../common/useDataFrame';\nimport type { DataFrame } from '../DataFrame';\nimport { arrangeLegendParts } from '../utils/arrangeLegendParts';\nimport { GET_BLACK, getColorWithFakeOpacity, stringToNumberRgba } from './colors';\n\nfunction convertDotRToSymbolSize(r:number) {\n return (r / 2.35) * (r / 2.35) * 64;\n}\n\nfunction isDotInsidePolygons(x:number, y:number, polygons: Polygon[]) {\n if (polygons.length === 0) {\n return true;\n }\n return polygons.some((p) => p.closed && p.points.length > 2 && polygonContains(p.points, [x, y]));\n}\n\nfunction getGettersFromLayers(\n dataFrame: DataFrame,\n legendInfo: ScatterplotUmapLegendInfo,\n layers: ScatterplotUmapSettingsImpl['layers'],\n): AesGetters {\n const dotLayer = layers.find(l => l.type === 'dots') as DotsLayer | undefined;\n const curveLayer = layers.find(l => l.type === 'curve') as CurveLayer | undefined;\n return {\n dotFill: createAesGetter(dataFrame, legendInfo, dotLayer?.aes.dotFill ?? DEFAULT_DOT_AES.color, 'dotFill'),\n dotSize: createAesGetter(dataFrame, legendInfo, dotLayer?.aes.dotSize ?? DEFAULT_DOT_AES.size, 'dotSize'),\n lineType: createAesGetter(dataFrame, legendInfo, curveLayer?.aes.lineShape ?? 'solid', 'lineShape')\n };\n}\n\nclass ChartRenderer {\n reactRoot: Root | null = null;\n parentNode: HTMLElement | null = null;\n rootNode: HTMLElement | null = null;\n canvasNode: HTMLElement | null = null;\n\n svgLayerElement: SVGElement | null = null;\n svgLayerComponent: ReactElement = (<></>);\n\n aesGetters: AesGetters = {\n dotSize: () => 2,\n dotFill: () => BLACK,\n lineType: () => 'solid'\n };\n\n tools: {\n webglChart: CartesianChart<any, any>;\n qt?: KDBush;\n fillColor: () => {\n value: (setter: (d: Dot) => [number, number, number, number]) => void;\n data: (setter: () => Dot[]) => void;\n };\n pointSeries: () => any;\n zoom: ZoomBehavior<any, any>;\n } | null = null;\n\n margins: Margins = {\n top: MIN_MARGIN,\n bottom: MIN_MARGIN,\n left: MIN_MARGIN,\n right: MIN_MARGIN,\n };\n chartSizes: ChartSizes = {\n chartWidth: DEFAULT_WIDTH, // width of single chart\n chartHeight: DEFAULT_HEIGHT, // height of single chart\n totalWidth: DEFAULT_WIDTH, // width of all charts in charts row, plus left axis, plus legend\n totalHeight: DEFAULT_HEIGHT, // width of all charts in charts height, plus bottom axis, plus top title\n };\n scales: ChartScales = {\n x: scaleLinear().domain([0, 10]).range([0, DEFAULT_WIDTH]),\n y: scaleLinear().domain([0, 10]).range([DEFAULT_HEIGHT, 0]),\n xOriginal: scaleLinear().domain([0, 10]).range([0, DEFAULT_WIDTH]),\n yOriginal: scaleLinear().domain([0, 10]).range([DEFAULT_HEIGHT, 0]),\n };\n\n polygons:Polygon[] = [];\n onPolygonUpdateOutside: ScatterplotEventHandlers['onPolygonUpdate'] = () => undefined;\n onTooltipHintSwitch: ScatterplotEventHandlers['onTooltipHintSwitch'] = () => undefined;\n onLassoControlsStateUpdate: ScatterplotEventHandlers['onLassoControlsStateUpdate'] = () => undefined;\n\n zoomTransform: ZoomTransform | null = null;\n zoomStateKey = '';\n selectedDot: Dot | null = null;\n captionsSizes: CaptionsSizes = {\n xAxisCaptionsWidth: 30,\n yAxisCaptionsWidth: 100,\n };\n mainTitle: string[] = []; // can be multiline\n legend: LegendData = {width: 0, height: 0, items: []};\n\n notCalculatedProps: Partial<SVGLayerProps> = {};\n\n allDots: Dot[] = [];\n visibleLabels: Label[] = [];\n clear() {\n if (this.parentNode && this.rootNode && this.canvasNode) {\n this.parentNode?.removeChild(this.rootNode);\n this.parentNode?.removeChild(this.canvasNode);\n this.parentNode = null;\n this.rootNode = null;\n this.canvasNode = null;\n this.svgLayerElement = null;\n this.tools = null;\n }\n // timeout to avoid trying to unmount during rendering\n setTimeout(() => {\n this.reactRoot?.unmount();\n this.reactRoot = null;\n });\n }\n\n init(node: HTMLElement) {\n if (this.parentNode === null) {\n this.parentNode = node;\n this.rootNode = document.createElement('div');\n this.canvasNode = document.createElement('div');\n this.parentNode.appendChild(this.rootNode);\n this.parentNode.appendChild(this.canvasNode);\n this.reactRoot = createRoot(this.rootNode);\n }\n }\n\n updateChartSizes(size: ScatterplotUmapSettingsImpl['chartSettings']['size']) {\n if (size.width !== this.chartSizes.chartWidth || size.height !== this.chartSizes.chartHeight) {\n // NB: now chart sizes always change with one multiplier for width/height so qt stays without changes\n this.chartSizes.chartWidth = size.width;\n this.chartSizes.chartHeight = size.height;\n this.scales.x.range([0, this.chartSizes.chartWidth]);\n this.scales.y.range([this.chartSizes.chartHeight, 0]);\n }\n \n }\n\n updateViewport(\n xAxis: ScatterplotUmapSettingsImpl['chartSettings']['xAxis'],\n yAxis: ScatterplotUmapSettingsImpl['chartSettings']['yAxis'],\n dotsExtents: DotsExtents\n ) {\n const scaleX = xAxis.scale === 'log' ? scaleLog() : scaleLinear();\n\n let {minX, minY, maxX, maxY} = dotsExtents;\n if (xAxis.lowerValue !== undefined) {\n minX = Math.max(minX, xAxis.lowerValue);\n }\n if (xAxis.upperValue !== undefined) {\n maxX = Math.min(maxX, xAxis.upperValue);\n }\n if (yAxis.lowerValue !== undefined) {\n minY = Math.max(minY, yAxis.lowerValue);\n }\n if (yAxis.upperValue !== undefined) {\n maxY = Math.min(maxY, yAxis.upperValue);\n }\n if (xAxis.symmetricRange !== undefined) {\n const middle = xAxis.symmetricRange;\n if (middle >= minX && middle <= maxX) {\n const halfRange = Math.max(middle - minX, maxX - middle);\n minX = middle - halfRange;\n maxX = middle + halfRange;\n }\n }\n if (typeof yAxis.symmetricRange !== 'undefined') {\n const middle = yAxis.symmetricRange;\n if (middle >= minY && middle <= maxY) {\n const halfRange = Math.max(middle - minY, maxY - middle);\n minY = middle - halfRange;\n maxY = middle + halfRange;\n }\n }\n\n const rangeH = [0, this.chartSizes.chartWidth];\n // supporting scale, it needs to add offsets of fixed size in pixels to general scale Y\n const tempX = scaleX\n .copy()\n .domain([minX, maxX])\n .range([PADDINGS.LEFT, this.chartSizes.chartWidth - PADDINGS.RIGHT]);\n scaleX\n .domain([tempX.invert(0), tempX.invert(this.chartSizes.chartWidth)])\n .range(rangeH)\n .nice();\n this.scales.x = scaleX;\n this.scales.xOriginal = scaleX.copy();\n\n const scaleY = yAxis.scale === 'log' ? scaleLog() : scaleLinear();\n const rangeV = [this.chartSizes.chartHeight, 0];\n // supporting scale, it needs to add offsets of fixed size in pixels to general scale Y\n const tempY = scaleY\n .copy()\n .domain([minY, maxY])\n .range([this.chartSizes.chartHeight - PADDINGS.BOTTOM, PADDINGS.TOP]);\n scaleY\n .domain([tempY.invert(this.chartSizes.chartHeight), tempY.invert(0)])\n .range(rangeV)\n .nice();\n this.scales.y = scaleY;\n this.scales.yOriginal = scaleY.copy();\n }\n\n updateCaptionsSize() {\n const textMeasurer = new TextMeasurer('600 14px Arial');\n\n function getMaxTickWidth(ticks: string[]) {\n return Math.max(...ticks.map(key => textMeasurer.getTextWidth(key)));\n }\n\n const {ticks, format} = getTicksAndFormat(this.scales.y, false);\n const maxYTick = getMaxTickWidth(ticks.map(format));\n\n this.captionsSizes = {\n xAxisCaptionsWidth: 20,\n yAxisCaptionsWidth: maxYTick,\n };\n }\n\n createMainTitle(title: ScatterplotUmapSettingsImpl['chartSettings']['title']) {\n this.mainTitle = splitTextByWidth(\n title.name,\n this.chartSizes.totalWidth - this.margins.left - this.margins.right,\n 20\n );\n }\n\n updateMargins() {\n const titleTextHeight = TITLE_LINE_HEIGHT * this.mainTitle.length;\n const titleHeight = titleTextHeight > 0 ? titleTextHeight + TITLE_MARGIN * 2 : 0;\n this.margins = {\n top: Math.max(titleHeight, MIN_MARGIN),\n bottom: MIN_MARGIN + this.captionsSizes.xAxisCaptionsWidth + TITLE_LINE,\n left: MIN_MARGIN + this.captionsSizes.yAxisCaptionsWidth + TITLE_LINE,\n right: this.legend.width + MIN_MARGIN,\n };\n this.chartSizes.totalWidth = this.margins.left + this.chartSizes.chartWidth + this.margins.right;\n this.chartSizes.totalHeight =\n this.margins.top + Math.max(this.chartSizes.chartHeight, this.legend.height) + this.margins.bottom;\n\n select(this.canvasNode)\n .style('width', this.chartSizes.chartWidth + 'px')\n .style('height', this.chartSizes.chartHeight + 'px')\n .style('top', this.margins.top + 'px')\n .style('left', this.margins.left + 'px');\n }\n\n updateLegendSize(\n legend: ScatterplotUmapSettingsImpl['chartSettings']['legend'],\n legendLabels: ScatterplotUmapLegendInfo,\n grouping: ColumnName[],\n layers: ScatterplotUmapLayer[]\n ) {\n if (!legend.show) {\n this.legend = {width: 0, height: 0, items: []};\n return;\n }\n\n const legendItems: LegendItem[] = [];\n const emptySizes = {width:0, height:0, left:0, top: 0};\n \n grouping.forEach(column => {\n const info = legendLabels[column.value];\n if (info.usedAes.length === 0 || !info.aesMap) {\n return;\n }\n const aesData: Record<string, DotAesItem> = {};\n info.values.forEach(category => {\n if (!aesData[category]) {\n aesData[category] = {...DEFAULT_DOT_AES} as DotAesItem;\n }\n info.usedAes.forEach(key => {\n if (key === 'dotFill') {\n aesData[category].color = (info.aesMap(category, key) ?? BLACK) as string;\n }\n if (key === 'dotSize') {\n aesData[category].size = Number(info.aesMap(category, key) ?? 3);\n }\n });\n });\n\n const title = column.label ?? column.value;\n const scale = scaleOrdinal<DotAesItem>()\n .domain(info.values)\n .range(info.values.map(value => aesData[value]));\n legendItems.push({...emptySizes, id: column.value, type: 'dots', title, scale, values:info.values, labels:info.labels});\n });\n\n layers.forEach(layer => {\n if (layer.type === 'dots' && isContinuousAes(layer.aes.dotFill)) {\n const {domain, range, columnName, type = 'linear'} = layer.aes.dotFill;\n const title = columnName.label ?? columnName.value;\n const colorScale = getContinuousColorScale(range, domain, 'linear') as ScaleLinear<string, string>; // always linear for legend - scale to render gradient, not for dots\n const tickPositionScale = (type === 'log' ? scaleSymlog<string, string>() : scaleLinear<string, string>())\n .domain(domain)\n // @ts-ignore\n .range([this.chartSizes.chartHeight, 0]);\n const values = getContinuousLegendTicks(tickPositionScale, domain as [number, number]);\n legendItems.push({...emptySizes, id: 'dotFill', type: 'continuous', title, scale: colorScale, tickPositionScale, values});\n }\n if (layer.type === 'dots' && isContinuousAes(layer.aes.dotSize)) {\n const {columnName, domain, range} = layer.aes.dotSize;\n const title = columnName.label ?? columnName.value;\n const scale = scaleSqrt(domain, range);\n const values = scale.ticks(3);\n const format = scale.tickFormat(3);\n const labels = values.reduce((res: Record<string, string>, v) => {\n res[String(v)] = format(v);\n return res;\n }, {});\n legendItems.push({...emptySizes, id: columnName.value, type: 'size', title, scale, values, labels});\n }\n });\n\n if (!legendItems.length) {\n this.legend = {width: 0, height: 0, items: []};\n return;\n }\n\n const items = arrangeLegendParts(legendItems, this.chartSizes.chartHeight);\n const lastItem = items[items.length - 1];\n const legendWidth = lastItem.left + lastItem.width + LEGEND_OFFSET;\n const legendHeight = this.chartSizes.chartHeight;\n\n this.legend = {\n width: legendWidth,\n height: legendHeight,\n items,\n };\n }\n\n initSettings(\n dataFrame: DataFrame,\n dots: Dot[],\n chartSettings: ScatterplotUmapSettingsImpl['chartSettings'],\n dotExtents: DotsExtents,\n legendInfo: ScatterplotUmapLegendInfo,\n layers: ScatterplotUmapSettingsImpl['layers'],\n grouping: ColumnName[]\n ) {\n const {xAxis, yAxis, size, title, legend} = chartSettings;\n this.updateChartSizes(size);\n this.updateViewport(xAxis, yAxis, dotExtents);\n this.updateCaptionsSize();\n this.updateLegendSize(legend, legendInfo, grouping, layers);\n this.createMainTitle(title);\n this.updateMargins();\n\n this.aesGetters = getGettersFromLayers(dataFrame, legendInfo, layers);\n\n const fillColor = webglFillColor()\n .data(dots)\n .value((d: Dot) => {\n const rgba = stringToNumberRgba(this.aesGetters.dotFill(d.idx));\n rgba[3] = !d.dimmed && isDotInsidePolygons(d.x, d.y, this.polygons) ? 1 : 0.4;\n return getColorWithFakeOpacity(rgba, rgba);\n });\n\n const pointSeries = seriesWebglPoint()\n .equals((a: Dot[], b: Dot[]) => a === b)\n .size((d: Dot) => convertDotRToSymbolSize(this.aesGetters.dotSize(d.idx)))\n .crossValue((d: Dot) => d.x)\n .mainValue((d: Dot) => d.y)\n .decorate((program: unknown) => fillColor(program));\n\n const z = zoom()\n .scaleExtent([0.1, 1000])\n .filter((e:MouseEvent) => {\n return e.type === 'wheel' || e.metaKey || e.ctrlKey;\n })\n .on('start', () => {\n this.selectedDot = null;\n })\n .on('zoom', (e: D3ZoomEvent<SVGElement, unknown>) => {\n const transform = e.transform;\n const x = transform.rescaleX(this.scales.xOriginal);\n const y = transform.rescaleY(this.scales.yOriginal);\n this.scales.x.domain(x.domain());\n this.scales.y.domain(y.domain());\n\n this.zoomTransform = transform;\n this.zoomStateKey = `${transform.x}_${transform.y}_${transform.k}`; // need it to update axes\n\n this.updateLabelsPosition(this.visibleLabels);\n this.renderSvgLayer(dataFrame);\n this.renderWebglLayer();\n }).on('end', () => {\n this.visibleLabels = this.computeLabels(this.allDots);\n this.renderSvgLayer(dataFrame);\n });\n\n // eslint-disable-next-line @typescript-eslint/ban-ts-comment\n // @ts-ignore\n const p = pointer().on('point', ([coord]) => {\n let closestDatum;\n if (coord) {\n closestDatum = this.getClosestDot(coord.x, coord.y);\n }\n \n const needRedraw =\n (this.selectedDot && !closestDatum) ||\n (!this.selectedDot && closestDatum) ||\n this.selectedDot?.idx !== closestDatum?.idx;\n\n this.selectedDot = closestDatum ?? null;\n\n if (needRedraw) {\n this.renderSvgLayer(dataFrame);\n }\n });\n\n const webglChart = chartCartesian({\n xScale: this.scales.x,\n yScale: this.scales.y,\n })\n .xAxisHeight(() => '0') // removing build-in axes from chartCartesian\n .yAxisWidth(() => '0') // removing build-in axes from chartCartesian\n .svgPlotArea(seriesSvgMulti())\n .webglPlotArea(\n // only render the point series on the WebGL layer\n seriesWebglMulti()\n .series([pointSeries])\n .mapping((d: unknown) => d)\n )\n .decorate(selection => {\n const s = selection.enter();\n if (s && !this.svgLayerElement) {\n s.style('grid-template-columns', '0 auto 1fr auto 0'); // removing build-in axes from chartCartesian\n s.style('grid-template-rows', '0 auto 1fr auto 0'); // removing build-in axes from chartCartesian\n this.svgLayerElement = s.select('.svg-plot-area.plot-area svg').node() as SVGElement;\n }\n s.select('.svg-plot-area.plot-area').attr('class', 'svg-plot-area plot-area miplots-scatterplot-plot-area')\n // eslint-disable-next-line @typescript-eslint/ban-ts-comment\n // @ts-ignore\n .call(z)\n .call(p);\n });\n\n this.tools = {\n webglChart,\n zoom: z,\n fillColor,\n pointSeries,\n };\n\n select(this.canvasNode)\n .datum(dots)\n .style('position', 'absolute')\n .style('width', this.chartSizes.chartWidth + 'px')\n .style('height', this.chartSizes.chartHeight + 'px')\n .style('top', this.margins.top + 'px')\n .style('left', this.margins.left + 'px');\n }\n\n updateAes(\n dataFrame: DataFrame,\n legendInfo: ScatterplotUmapLegendInfo,\n layers: ScatterplotUmapSettingsImpl['layers']\n ) {\n if (this.tools === null) {\n return;\n }\n this.aesGetters = getGettersFromLayers(dataFrame, legendInfo, layers);\n // eslint-disable-next-line @typescript-eslint/ban-ts-comment\n // @ts-ignore\n this.tools.fillColor.value((d: Dot) => {\n const colorGetter = this.aesGetters.dotFill ?? GET_BLACK;\n const rgba = stringToNumberRgba(colorGetter(d.idx));\n rgba[3] = !d.dimmed && isDotInsidePolygons(d.x, d.y, this.polygons) ? 1 : 0.4;\n return getColorWithFakeOpacity(rgba, rgba);\n });\n }\n\n updatePointSize() {\n if (this.tools === null) {\n return;\n }\n // TODO: try remove array copy\n select(this.canvasNode).datum([...this.allDots]);\n // eslint-disable-next-line @typescript-eslint/ban-ts-comment\n // @ts-ignore\n this.tools.pointSeries.size((d: Dot) => convertDotRToSymbolSize(this.aesGetters.dotSize(d.data)));\n }\n\n updateByLasso() {\n if (this.tools === null) {\n return;\n }\n // eslint-disable-next-line @typescript-eslint/ban-ts-comment\n // @ts-ignore\n this.tools?.fillColor.value((d: Dot) => {\n const colorGetter = this.aesGetters.dotFill ?? GET_BLACK;\n const rgba = stringToNumberRgba(colorGetter(d.idx));\n rgba[3] = !d.dimmed && isDotInsidePolygons(d.x, d.y, this.polygons) ? 1 : 0.4;\n return getColorWithFakeOpacity(rgba, rgba);\n });\n this.renderWebglLayer();\n }\n\n createQuadtree(dots: Dot[]): KDBush {\n const tree = new KDBush(dots.length, 512);\n\n for (let i = 0; i < dots.length; i++) {\n tree.add(dots[i].x, dots[i].y);\n } \n\n return tree.finish();\n }\n\n getClosestDot(_x: number, _y: number): Dot | null {\n const tree = this.tools?.qt;\n if (!tree) return null;\n const dots = this.allDots;\n const x = this.scales.x.invert(_x);\n const y = this.scales.y.invert(_y);\n const radius = 1 / (this.zoomTransform?.k || 1);\n const minX = x - radius;\n const maxX = x + radius;\n const minY = y - radius;\n const maxY = y + radius;\n\n const indexes = tree.range(minX, minY, maxX, maxY);\n const closest = indexes.reduce((closest, idx: number) => {\n const dot = dots[idx];\n const dX = this.scales.x(dot.x) - _x;\n const dY = this.scales.y(dot.y) - _y;\n const distance = Math.hypot(dX, dY);\n if (closest === null || distance < closest.distance) {\n closest.index = idx;\n closest.distance = distance;\n }\n return closest;\n }, {\n index: -1,\n distance: Infinity\n });\n return indexes.length === 0 || closest.index === -1 ? null : dots[closest.index];\n }\n\n updateDots(dots: Dot[]) {\n if (this.tools === null) {\n return;\n }\n select(this.canvasNode).datum(dots);\n // eslint-disable-next-line @typescript-eslint/ban-ts-comment\n // @ts-ignore\n this.tools.fillColor.data(dots);\n this.tools.qt = this.createQuadtree(dots);\n this.allDots = dots;\n }\n\n render(\n dataFrame: DataFrame,\n settingsId: string,\n chartSettings: ScatterplotUmapSettingsImpl['chartSettings'],\n keyColumn: ColumnName | null,\n dots: Dot[],\n dotExtents: DotsExtents,\n dotsByGrouping: Record<string, Dot[]>,\n layers: ScatterplotUmapSettingsImpl['layers'],\n legendInfo: ScatterplotUmapLegendInfo,\n grouping: ColumnName[],\n onPolygonUpdateOutside: ScatterplotEventHandlers['onPolygonUpdate'],\n onTooltipHintSwitch: (v:boolean) => void,\n onLassoControlsStateUpdate: (v:LassoControlsState) => void,\n ) { \n if (this.tools === null) {\n this.initSettings(\n dataFrame,\n dots,\n chartSettings,\n dotExtents,\n legendInfo,\n layers,\n grouping\n ); \n } else {\n const {title, legend, size} = chartSettings;\n this.updateChartSizes(size);\n this.updateLegendSize(legend, legendInfo, grouping, layers);\n this.createMainTitle(title);\n this.updateMargins();\n this.updateAes(dataFrame, legendInfo, layers);\n }\n\n this.onPolygonUpdateOutside = onPolygonUpdateOutside;\n this.onTooltipHintSwitch = onTooltipHintSwitch;\n this.onLassoControlsStateUpdate = onLassoControlsStateUpdate;\n\n if (this.allDots !== dots) {\n this.updateDots(dots);\n this.visibleLabels = this.computeLabels(dots);\n }\n\n this.notCalculatedProps = {\n settingsId,\n chartSettings,\n keyColumn,\n dotsByGrouping,\n layers\n };\n\n this.renderWebglLayer();\n this.renderSvgLayer(dataFrame);\n }\n\n renderWebglLayer() {\n if (this.tools?.webglChart) {\n select(this.canvasNode).call(this.tools?.webglChart);\n }\n }\n\n onPolygonUpdate = (p:Polygon[]) => {\n this.polygons = p;\n this.updateByLasso();\n const filteredDotsIndexes = this.allDots\n .filter(d => isDotInsidePolygons(d.x, d.y, this.polygons))\n .map(d => d.idx);\n this.onPolygonUpdateOutside(filteredDotsIndexes, p);\n };\n\n renderSvgLayer(dataFrame: DataFrame) {\n const props = {\n settingsId: this.notCalculatedProps.settingsId,\n chartSettings: this.notCalculatedProps.chartSettings,\n keyColumn: this.notCalculatedProps.keyColumn,\n dotsByGrouping: this.notCalculatedProps.dotsByGrouping,\n layers: this.notCalculatedProps.layers,\n chartSizes: this.chartSizes,\n scales: this.scales,\n margins: this.margins,\n mainTitle: this.mainTitle,\n captionsSizes: this.captionsSizes,\n container: this.svgLayerElement,\n zoomStateKey: this.zoomStateKey,\n selectedDot: this.selectedDot,\n aesGetters: this.aesGetters,\n legendData: this.legend,\n labels: this.visibleLabels,\n defaultPolygons: this.polygons,\n onPolygonUpdate: this.onPolygonUpdate,\n onTooltipHintSwitch: this.onTooltipHintSwitch,\n onLassoControlsStateUpdate: this.onLassoControlsStateUpdate,\n } as SVGLayerProps;\n this.svgLayerComponent = (\n <DataFrameProvider dataFrame={dataFrame}>\n <SVGLayer {...props} />\n </DataFrameProvider>\n );\n this.reactRoot?.render(this.svgLayerComponent);\n }\n\n renderError(message: string) {\n this.reactRoot?.render(<Error message={message} />);\n }\n\n private computeLabels(dots: Dot[]) {\n const textMeasurer = new TextMeasurer('16px Manrope');\n const getPosition = createLabelPositioner(this.chartSizes.chartWidth, this.chartSizes.chartHeight);\n const labels = [];\n\n for (let i = 0; i < dots.length; i++) {\n const dot = dots[i];\n if (dot.label == null) {\n continue;\n }\n const name = String(dot.label);\n const metrics = textMeasurer.getTextMetrics(name);\n const x = this.scales.x(dot.x);\n const y = this.scales.y(dot.y);\n const w = metrics.width;\n const h = (metrics.actualBoundingBoxAscent) + (metrics.actualBoundingBoxDescent);\n const p = 10;\n const position = getPosition(x, y, w, h, p);\n if (!position) {\n continue;\n }\n\n labels.push({\n x,\n y,\n dot,\n name,\n width: w,\n height: h,\n padding: p,\n xPosition: position[0],\n yPosition: position[1],\n } satisfies Label);\n }\n\n return labels;\n }\n\n private updateLabelsPosition(labels: Label[]) {\n for (let i = 0; i < labels.length; i++) {\n const label = labels[i];\n label.x = this.scales.x(label.dot.x);\n label.y = this.scales.y(label.dot.y);\n }\n }\n}\n\nexport default ChartRenderer;\n"],"names":["convertDotRToSymbolSize","r","isDotInsidePolygons","x","y","polygons","p","polygonContains","getGettersFromLayers","dataFrame","legendInfo","layers","dotLayer","l","curveLayer","createAesGetter","DEFAULT_DOT_AES","ChartRenderer","__publicField","jsx","Fragment","BLACK","MIN_MARGIN","DEFAULT_WIDTH","DEFAULT_HEIGHT","scaleLinear","filteredDotsIndexes","d","_a","_b","node","createRoot","size","xAxis","yAxis","dotsExtents","scaleX","scaleLog","minX","minY","maxX","maxY","middle","halfRange","rangeH","tempX","PADDINGS","scaleY","rangeV","tempY","textMeasurer","TextMeasurer","getMaxTickWidth","ticks","key","format","getTicksAndFormat","maxYTick","title","splitTextByWidth","titleTextHeight","TITLE_LINE_HEIGHT","titleHeight","TITLE_MARGIN","TITLE_LINE","select","legend","legendLabels","grouping","legendItems","emptySizes","column","info","aesData","category","scale","scaleOrdinal","value","layer","isContinuousAes","domain","range","columnName","type","colorScale","getContinuousColorScale","tickPositionScale","scaleSymlog","values","getContinuousLegendTicks","scaleSqrt","labels","res","v","items","arrangeLegendParts","lastItem","legendWidth","LEGEND_OFFSET","legendHeight","dots","chartSettings","dotExtents","fillColor","webglFillColor","rgba","stringToNumberRgba","getColorWithFakeOpacity","pointSeries","seriesWebglPoint","a","b","program","z","zoom","e","transform","pointer","coord","closestDatum","needRedraw","webglChart","chartCartesian","seriesSvgMulti","seriesWebglMulti","selection","s","colorGetter","GET_BLACK","tree","KDBush","i","_x","_y","radius","indexes","closest","idx","dot","dX","dY","distance","settingsId","keyColumn","dotsByGrouping","onPolygonUpdateOutside","onTooltipHintSwitch","onLassoControlsStateUpdate","props","DataFrameProvider","SVGLayer","message","Error","getPosition","createLabelPositioner","name","metrics","w","h","position","label"],"mappings":"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","x_google_ignoreList":[0]}
|
|
1
|
+
{"version":3,"file":"ChartRenderer.js","sources":["../../../../../../node_modules/@milaboratories/miplots4/src/scatterplot-umap/ChartRenderer.tsx"],"sourcesContent":["import { chartCartesian } from '@d3fc/d3fc-chart';\nimport type { CartesianChart } from '@d3fc/d3fc-chart/src/cartesian';\nimport type { ScaleLinear } from 'd3-scale';\nimport { scaleLinear, scaleLog, scaleOrdinal, scaleSqrt, scaleSymlog } from 'd3-scale';\nimport { select } from 'd3-selection';\nimport type { D3ZoomEvent, ZoomBehavior, ZoomTransform } from 'd3-zoom';\nimport { zoom } from 'd3-zoom';\nimport type { ReactElement } from 'react';\nimport type { Root } from 'react-dom/client';\nimport { createRoot } from 'react-dom/client';\nimport { Error } from '../common/Error';\nimport type { DotAesItem, LegendData, LegendItem } from '../common/types';\nimport {\n BLACK,\n DEFAULT_HEIGHT,\n DEFAULT_WIDTH,\n TITLE_LINE_HEIGHT,\n TITLE_MARGIN\n} from '../constants';\nimport { splitTextByWidth } from '../discrete/utils';\nimport { DEFAULT_DOT_AES, MIN_MARGIN } from '../scatterplot/constants';\nimport { createAesGetter } from '../scatterplot/utils/createAesGetter';\nimport { getTicksAndFormat } from '../scatterplot/utils/getTicksAndFormat';\nimport type { Label } from '../scatterplot/utils/getVisibleLabels';\nimport { createLabelPositioner } from '../scatterplot/utils/getVisibleLabels';\nimport type { ColumnName, ScatterplotEventHandlers } from '../types';\nimport { isContinuousAes } from '../types';\nimport type { ScatterplotUmapLegendInfo } from '../types/scatterplot-umap';\nimport { getContinuousColorScale } from '../utils/getContinuousColorScale';\nimport { getContinuousLegendTicks } from '../utils/getContinuousLegendTicks';\nimport { TextMeasurer } from '../utils/TextMeasurer/TextMeasurer';\nimport { SVGLayer } from './components/SVGLayer';\nimport { LEGEND_OFFSET, PADDINGS, TITLE_LINE } from './constants';\nimport type { CurveLayer, DotsLayer, ScatterplotUmapLayer, ScatterplotUmapSettingsImpl } from './SettingsImpl';\nimport type {\n AesGetters,\n CaptionsSizes,\n ChartScales, ChartSizes,\n Dot,\n DotsExtents,\n LassoControlsState,\n Margins,\n Polygon,\n SVGLayerProps,\n} from './types';\n// @ts-ignore\nimport { seriesSvgMulti, seriesWebglMulti, seriesWebglPoint } from '@d3fc/d3fc-series';\n// @ts-ignore\nimport { webglFillColor } from '@d3fc/d3fc-webgl';\n// @ts-ignore\nimport { pointer } from '@d3fc/d3fc-pointer';\nimport { polygonContains } from 'd3-polygon';\nimport KDBush from 'kdbush';\nimport { DataFrameProvider } from '../common/useDataFrame';\nimport type { DataFrame } from '../DataFrame';\nimport { arrangeLegendParts } from '../utils/arrangeLegendParts';\nimport { GET_BLACK, getColorWithFakeOpacity, stringToNumberRgba } from './colors';\n\nfunction convertDotRToSymbolSize(r:number) {\n return (r / 2.35) * (r / 2.35) * 64;\n}\n\nfunction isDotInsidePolygons(x:number, y:number, polygons: Polygon[]) {\n if (polygons.length === 0) {\n return true;\n }\n return polygons.some((p) => p.closed && p.points.length > 2 && polygonContains(p.points, [x, y]));\n}\n\nfunction getGettersFromLayers(\n dataFrame: DataFrame,\n legendInfo: ScatterplotUmapLegendInfo,\n layers: ScatterplotUmapSettingsImpl['layers'],\n): AesGetters {\n const dotLayer = layers.find(l => l.type === 'dots') as DotsLayer | undefined;\n const curveLayer = layers.find(l => l.type === 'curve') as CurveLayer | undefined;\n return {\n dotFill: createAesGetter(dataFrame, legendInfo, dotLayer?.aes.dotFill ?? DEFAULT_DOT_AES.color, 'dotFill'),\n dotSize: createAesGetter(dataFrame, legendInfo, dotLayer?.aes.dotSize ?? DEFAULT_DOT_AES.size, 'dotSize'),\n lineType: createAesGetter(dataFrame, legendInfo, curveLayer?.aes.lineShape ?? 'solid', 'lineShape')\n };\n}\n\nclass ChartRenderer {\n reactRoot: Root | null = null;\n parentNode: HTMLElement | null = null;\n rootNode: HTMLElement | null = null;\n canvasNode: HTMLElement | null = null;\n\n svgLayerElement: SVGElement | null = null;\n svgLayerComponent: ReactElement = (<></>);\n\n aesGetters: AesGetters = {\n dotSize: () => 2,\n dotFill: () => BLACK,\n lineType: () => 'solid'\n };\n\n tools: {\n webglChart: CartesianChart<any, any>;\n qt?: KDBush;\n fillColor: () => {\n value: (setter: (d: Dot) => [number, number, number, number]) => void;\n data: (setter: () => Dot[]) => void;\n };\n pointSeries: () => any;\n zoom: ZoomBehavior<any, any>;\n } | null = null;\n\n margins: Margins = {\n top: MIN_MARGIN,\n bottom: MIN_MARGIN,\n left: MIN_MARGIN,\n right: MIN_MARGIN,\n };\n chartSizes: ChartSizes = {\n chartWidth: DEFAULT_WIDTH, // width of single chart\n chartHeight: DEFAULT_HEIGHT, // height of single chart\n totalWidth: DEFAULT_WIDTH, // width of all charts in charts row, plus left axis, plus legend\n totalHeight: DEFAULT_HEIGHT, // width of all charts in charts height, plus bottom axis, plus top title\n };\n scales: ChartScales = {\n x: scaleLinear().domain([0, 10]).range([0, DEFAULT_WIDTH]),\n y: scaleLinear().domain([0, 10]).range([DEFAULT_HEIGHT, 0]),\n xOriginal: scaleLinear().domain([0, 10]).range([0, DEFAULT_WIDTH]),\n yOriginal: scaleLinear().domain([0, 10]).range([DEFAULT_HEIGHT, 0]),\n };\n\n polygons:Polygon[] = [];\n onPolygonUpdateOutside: ScatterplotEventHandlers['onPolygonUpdate'] = () => undefined;\n onTooltipHintSwitch: ScatterplotEventHandlers['onTooltipHintSwitch'] = () => undefined;\n onLassoControlsStateUpdate: ScatterplotEventHandlers['onLassoControlsStateUpdate'] = () => undefined;\n\n zoomTransform: ZoomTransform | null = null;\n zoomStateKey = '';\n selectedDot: Dot | null = null;\n captionsSizes: CaptionsSizes = {\n xAxisCaptionsWidth: 30,\n yAxisCaptionsWidth: 100,\n };\n mainTitle: string[] = []; // can be multiline\n legend: LegendData = {width: 0, height: 0, items: []};\n\n notCalculatedProps: Partial<SVGLayerProps> = {};\n\n allDots: Dot[] = [];\n visibleLabels: Label[] = [];\n clear() {\n if (this.parentNode && this.rootNode && this.canvasNode) {\n this.parentNode?.removeChild(this.rootNode);\n this.parentNode?.removeChild(this.canvasNode);\n this.parentNode = null;\n this.rootNode = null;\n this.canvasNode = null;\n this.svgLayerElement = null;\n this.tools = null;\n }\n // timeout to avoid trying to unmount during rendering\n setTimeout(() => {\n this.reactRoot?.unmount();\n this.reactRoot = null;\n });\n }\n\n init(node: HTMLElement) {\n if (this.parentNode === null) {\n this.parentNode = node;\n this.rootNode = document.createElement('div');\n this.canvasNode = document.createElement('div');\n this.parentNode.appendChild(this.rootNode);\n this.parentNode.appendChild(this.canvasNode);\n this.reactRoot = createRoot(this.rootNode);\n }\n }\n\n updateChartSizes(size: ScatterplotUmapSettingsImpl['chartSettings']['size']) {\n if (size.width !== this.chartSizes.chartWidth || size.height !== this.chartSizes.chartHeight) {\n // NB: now chart sizes always change with one multiplier for width/height so qt stays without changes\n this.chartSizes.chartWidth = size.width;\n this.chartSizes.chartHeight = size.height;\n this.scales.x.range([0, this.chartSizes.chartWidth]);\n this.scales.y.range([this.chartSizes.chartHeight, 0]);\n }\n \n }\n\n updateViewport(\n xAxis: ScatterplotUmapSettingsImpl['chartSettings']['xAxis'],\n yAxis: ScatterplotUmapSettingsImpl['chartSettings']['yAxis'],\n dotsExtents: DotsExtents\n ) {\n const scaleX = xAxis.scale === 'log' ? scaleLog() : scaleLinear();\n\n let {minX, minY, maxX, maxY} = dotsExtents;\n if (xAxis.lowerValue !== undefined) {\n minX = Math.max(minX, xAxis.lowerValue);\n }\n if (xAxis.upperValue !== undefined) {\n maxX = Math.min(maxX, xAxis.upperValue);\n }\n if (yAxis.lowerValue !== undefined) {\n minY = Math.max(minY, yAxis.lowerValue);\n }\n if (yAxis.upperValue !== undefined) {\n maxY = Math.min(maxY, yAxis.upperValue);\n }\n if (xAxis.symmetricRange !== undefined) {\n const middle = xAxis.symmetricRange;\n if (middle >= minX && middle <= maxX) {\n const halfRange = Math.max(middle - minX, maxX - middle);\n minX = middle - halfRange;\n maxX = middle + halfRange;\n }\n }\n if (typeof yAxis.symmetricRange !== 'undefined') {\n const middle = yAxis.symmetricRange;\n if (middle >= minY && middle <= maxY) {\n const halfRange = Math.max(middle - minY, maxY - middle);\n minY = middle - halfRange;\n maxY = middle + halfRange;\n }\n }\n\n const rangeH = [0, this.chartSizes.chartWidth];\n // supporting scale, it needs to add offsets of fixed size in pixels to general scale Y\n const tempX = scaleX\n .copy()\n .domain([minX, maxX])\n .range([PADDINGS.LEFT, this.chartSizes.chartWidth - PADDINGS.RIGHT]);\n scaleX\n .domain([tempX.invert(0), tempX.invert(this.chartSizes.chartWidth)])\n .range(rangeH)\n .nice();\n this.scales.x = scaleX;\n this.scales.xOriginal = scaleX.copy();\n\n const scaleY = yAxis.scale === 'log' ? scaleLog() : scaleLinear();\n const rangeV = [this.chartSizes.chartHeight, 0];\n // supporting scale, it needs to add offsets of fixed size in pixels to general scale Y\n const tempY = scaleY\n .copy()\n .domain([minY, maxY])\n .range([this.chartSizes.chartHeight - PADDINGS.BOTTOM, PADDINGS.TOP]);\n scaleY\n .domain([tempY.invert(this.chartSizes.chartHeight), tempY.invert(0)])\n .range(rangeV)\n .nice();\n this.scales.y = scaleY;\n this.scales.yOriginal = scaleY.copy();\n }\n\n updateCaptionsSize() {\n const textMeasurer = new TextMeasurer('600 14px Arial');\n\n function getMaxTickWidth(ticks: string[]) {\n return Math.max(...ticks.map(key => textMeasurer.getTextWidth(key)));\n }\n\n const {ticks, format} = getTicksAndFormat(this.scales.y, false);\n const maxYTick = getMaxTickWidth(ticks.map(format));\n\n this.captionsSizes = {\n xAxisCaptionsWidth: 20,\n yAxisCaptionsWidth: maxYTick,\n };\n }\n\n createMainTitle(title: ScatterplotUmapSettingsImpl['chartSettings']['title']) {\n this.mainTitle = splitTextByWidth(\n title.name,\n this.chartSizes.totalWidth - this.margins.left - this.margins.right,\n 20\n );\n }\n\n updateMargins() {\n const titleTextHeight = TITLE_LINE_HEIGHT * this.mainTitle.length;\n const titleHeight = titleTextHeight > 0 ? titleTextHeight + TITLE_MARGIN * 2 : 0;\n this.margins = {\n top: Math.max(titleHeight, MIN_MARGIN),\n bottom: MIN_MARGIN + this.captionsSizes.xAxisCaptionsWidth + TITLE_LINE,\n left: MIN_MARGIN + this.captionsSizes.yAxisCaptionsWidth + TITLE_LINE,\n right: this.legend.width + MIN_MARGIN,\n };\n this.chartSizes.totalWidth = this.margins.left + this.chartSizes.chartWidth + this.margins.right;\n this.chartSizes.totalHeight =\n this.margins.top + Math.max(this.chartSizes.chartHeight, this.legend.height) + this.margins.bottom;\n\n select(this.canvasNode)\n .style('width', this.chartSizes.chartWidth + 'px')\n .style('height', this.chartSizes.chartHeight + 'px')\n .style('top', this.margins.top + 'px')\n .style('left', this.margins.left + 'px');\n }\n\n updateLegendSize(\n legend: ScatterplotUmapSettingsImpl['chartSettings']['legend'],\n legendLabels: ScatterplotUmapLegendInfo,\n grouping: ColumnName[],\n layers: ScatterplotUmapLayer[]\n ) {\n if (!legend.show) {\n this.legend = {width: 0, height: 0, items: []};\n return;\n }\n\n const legendItems: LegendItem[] = [];\n const emptySizes = {width:0, height:0, left:0, top: 0};\n \n grouping.forEach(column => {\n const info = legendLabels[column.value];\n if (info.usedAes.length === 0 || !info.aesMap) {\n return;\n }\n const aesData: Record<string, DotAesItem> = {};\n info.values.forEach(category => {\n if (!aesData[category]) {\n aesData[category] = {...DEFAULT_DOT_AES} as DotAesItem;\n }\n info.usedAes.forEach(key => {\n if (key === 'dotFill') {\n aesData[category].color = (info.aesMap(category, key) ?? BLACK) as string;\n }\n if (key === 'dotSize') {\n aesData[category].size = Number(info.aesMap(category, key) ?? 3);\n }\n });\n });\n\n const title = column.label ?? column.value;\n const scale = scaleOrdinal<DotAesItem>()\n .domain(info.values)\n .range(info.values.map(value => aesData[value]));\n legendItems.push({...emptySizes, id: column.value, type: 'dots', title, scale, values:info.values, labels:info.labels});\n });\n\n layers.forEach(layer => {\n if (layer.type === 'dots' && isContinuousAes(layer.aes.dotFill)) {\n const {domain, range, columnName, type = 'linear'} = layer.aes.dotFill;\n const title = columnName.label ?? columnName.value;\n const colorScale = getContinuousColorScale(range, domain, 'linear') as ScaleLinear<string, string>; // always linear for legend - scale to render gradient, not for dots\n const tickPositionScale = (type === 'log' ? scaleSymlog<string, string>() : scaleLinear<string, string>())\n .domain(domain)\n // @ts-ignore\n .range([this.chartSizes.chartHeight, 0]);\n const values = getContinuousLegendTicks(tickPositionScale, domain as [number, number]);\n legendItems.push({...emptySizes, id: 'dotFill', type: 'continuous', title, scale: colorScale, tickPositionScale, values});\n }\n if (layer.type === 'dots' && isContinuousAes(layer.aes.dotSize)) {\n const {columnName, domain, range} = layer.aes.dotSize;\n const title = columnName.label ?? columnName.value;\n const scale = scaleSqrt(domain, range);\n const values = scale.ticks(3);\n const format = scale.tickFormat(3);\n const labels = values.reduce((res: Record<string, string>, v) => {\n res[String(v)] = format(v);\n return res;\n }, {});\n legendItems.push({...emptySizes, id: columnName.value, type: 'size', title, scale, values, labels});\n }\n });\n\n if (!legendItems.length) {\n this.legend = {width: 0, height: 0, items: []};\n return;\n }\n\n const items = arrangeLegendParts(legendItems, this.chartSizes.chartHeight);\n const lastItem = items[items.length - 1];\n const legendWidth = lastItem.left + lastItem.width + LEGEND_OFFSET;\n const legendHeight = this.chartSizes.chartHeight;\n\n this.legend = {\n width: legendWidth,\n height: legendHeight,\n items,\n };\n }\n\n initSettings(\n dataFrame: DataFrame,\n dots: Dot[],\n chartSettings: ScatterplotUmapSettingsImpl['chartSettings'],\n dotExtents: DotsExtents,\n legendInfo: ScatterplotUmapLegendInfo,\n layers: ScatterplotUmapSettingsImpl['layers'],\n grouping: ColumnName[]\n ) {\n const {xAxis, yAxis, size, title, legend} = chartSettings;\n this.updateChartSizes(size);\n this.updateViewport(xAxis, yAxis, dotExtents);\n this.updateCaptionsSize();\n this.updateLegendSize(legend, legendInfo, grouping, layers);\n this.createMainTitle(title);\n this.updateMargins();\n\n this.aesGetters = getGettersFromLayers(dataFrame, legendInfo, layers);\n\n const fillColor = webglFillColor()\n .data(dots)\n .value((d: Dot) => {\n const rgba = stringToNumberRgba(this.aesGetters.dotFill(d.idx));\n rgba[3] = !d.dimmed && isDotInsidePolygons(d.x, d.y, this.polygons) ? 1 : 0.4;\n return getColorWithFakeOpacity(rgba, rgba);\n });\n\n const pointSeries = seriesWebglPoint()\n .equals((a: Dot[], b: Dot[]) => a === b)\n .size((d: Dot) => convertDotRToSymbolSize(this.aesGetters.dotSize(d.idx)))\n .crossValue((d: Dot) => d.x)\n .mainValue((d: Dot) => d.y)\n .decorate((program: unknown) => fillColor(program));\n\n const z = zoom()\n .scaleExtent([0.1, 1000])\n .filter((e:MouseEvent) => {\n return e.type === 'wheel' || e.metaKey || e.ctrlKey;\n })\n .on('start', () => {\n this.selectedDot = null;\n })\n .on('zoom', (e: D3ZoomEvent<SVGElement, unknown>) => {\n const transform = e.transform;\n const x = transform.rescaleX(this.scales.xOriginal);\n const y = transform.rescaleY(this.scales.yOriginal);\n this.scales.x.domain(x.domain());\n this.scales.y.domain(y.domain());\n\n this.zoomTransform = transform;\n this.zoomStateKey = `${transform.x}_${transform.y}_${transform.k}`; // need it to update axes\n\n this.updateLabelsPosition(this.visibleLabels);\n this.renderSvgLayer(dataFrame);\n this.renderWebglLayer();\n }).on('end', () => {\n this.visibleLabels = this.computeLabels(this.allDots);\n this.renderSvgLayer(dataFrame);\n });\n\n // eslint-disable-next-line @typescript-eslint/ban-ts-comment\n // @ts-ignore\n const p = pointer().on('point', ([coord]) => {\n let closestDatum;\n if (coord) {\n closestDatum = this.getClosestDot(coord.x, coord.y);\n }\n \n const needRedraw =\n (this.selectedDot && !closestDatum) ||\n (!this.selectedDot && closestDatum) ||\n this.selectedDot?.idx !== closestDatum?.idx;\n\n this.selectedDot = closestDatum ?? null;\n\n if (needRedraw) {\n this.renderSvgLayer(dataFrame);\n }\n });\n\n const webglChart = chartCartesian({\n xScale: this.scales.x,\n yScale: this.scales.y,\n })\n .xAxisHeight(() => '0') // removing build-in axes from chartCartesian\n .yAxisWidth(() => '0') // removing build-in axes from chartCartesian\n .svgPlotArea(seriesSvgMulti())\n .webglPlotArea(\n // only render the point series on the WebGL layer\n seriesWebglMulti()\n .series([pointSeries])\n .mapping((d: unknown) => d)\n )\n .decorate(selection => {\n const s = selection.enter();\n if (s && !this.svgLayerElement) {\n s.style('grid-template-columns', '0 auto 1fr auto 0'); // removing build-in axes from chartCartesian\n s.style('grid-template-rows', '0 auto 1fr auto 0'); // removing build-in axes from chartCartesian\n this.svgLayerElement = s.select('.svg-plot-area.plot-area svg').node() as SVGElement;\n }\n s.select('.svg-plot-area.plot-area').attr('class', 'svg-plot-area plot-area miplots-scatterplot-plot-area')\n // eslint-disable-next-line @typescript-eslint/ban-ts-comment\n // @ts-ignore\n .call(z)\n .call(p);\n });\n\n this.tools = {\n webglChart,\n zoom: z,\n fillColor,\n pointSeries,\n };\n\n select(this.canvasNode)\n .datum(dots)\n .style('position', 'absolute')\n .style('width', this.chartSizes.chartWidth + 'px')\n .style('height', this.chartSizes.chartHeight + 'px')\n .style('top', this.margins.top + 'px')\n .style('left', this.margins.left + 'px');\n }\n\n updateAes(\n dataFrame: DataFrame,\n legendInfo: ScatterplotUmapLegendInfo,\n layers: ScatterplotUmapSettingsImpl['layers']\n ) {\n if (this.tools === null) {\n return;\n }\n this.aesGetters = getGettersFromLayers(dataFrame, legendInfo, layers);\n // eslint-disable-next-line @typescript-eslint/ban-ts-comment\n // @ts-ignore\n this.tools.fillColor.value((d: Dot) => {\n const colorGetter = this.aesGetters.dotFill ?? GET_BLACK;\n const rgba = stringToNumberRgba(colorGetter(d.idx));\n rgba[3] = !d.dimmed && isDotInsidePolygons(d.x, d.y, this.polygons) ? 1 : 0.4;\n return getColorWithFakeOpacity(rgba, rgba);\n });\n }\n\n updatePointSize() {\n if (this.tools === null) {\n return;\n }\n // TODO: try remove array copy\n select(this.canvasNode).datum([...this.allDots]);\n // eslint-disable-next-line @typescript-eslint/ban-ts-comment\n // @ts-ignore\n this.tools.pointSeries.size((d: Dot) => convertDotRToSymbolSize(this.aesGetters.dotSize(d.data)));\n }\n\n updateByLasso() {\n if (this.tools === null) {\n return;\n }\n // eslint-disable-next-line @typescript-eslint/ban-ts-comment\n // @ts-ignore\n this.tools?.fillColor.value((d: Dot) => {\n const colorGetter = this.aesGetters.dotFill ?? GET_BLACK;\n const rgba = stringToNumberRgba(colorGetter(d.idx));\n rgba[3] = !d.dimmed && isDotInsidePolygons(d.x, d.y, this.polygons) ? 1 : 0.4;\n return getColorWithFakeOpacity(rgba, rgba);\n });\n this.renderWebglLayer();\n }\n\n createQuadtree(dots: Dot[]): KDBush {\n const tree = new KDBush(dots.length, 512);\n\n for (let i = 0; i < dots.length; i++) {\n tree.add(dots[i].x, dots[i].y);\n } \n\n return tree.finish();\n }\n\n getClosestDot(_x: number, _y: number): Dot | null {\n const tree = this.tools?.qt;\n if (!tree) return null;\n const dots = this.allDots;\n const x = this.scales.x.invert(_x);\n const y = this.scales.y.invert(_y);\n const radius = 1 / (this.zoomTransform?.k || 1);\n const minX = x - radius;\n const maxX = x + radius;\n const minY = y - radius;\n const maxY = y + radius;\n\n const indexes = tree.range(minX, minY, maxX, maxY);\n const closest = indexes.reduce((closest, idx: number) => {\n const dot = dots[idx];\n const dX = this.scales.x(dot.x) - _x;\n const dY = this.scales.y(dot.y) - _y;\n const distance = Math.hypot(dX, dY);\n if (closest === null || distance < closest.distance) {\n closest.index = idx;\n closest.distance = distance;\n }\n return closest;\n }, {\n index: -1,\n distance: Infinity\n });\n return indexes.length === 0 || closest.index === -1 ? null : dots[closest.index];\n }\n\n updateDots(dots: Dot[]) {\n if (this.tools === null) {\n return;\n }\n select(this.canvasNode).datum(dots);\n // eslint-disable-next-line @typescript-eslint/ban-ts-comment\n // @ts-ignore\n this.tools.fillColor.data(dots);\n this.tools.qt = this.createQuadtree(dots);\n this.allDots = dots;\n }\n\n render(\n dataFrame: DataFrame,\n settingsId: string,\n chartSettings: ScatterplotUmapSettingsImpl['chartSettings'],\n keyColumn: ColumnName | null,\n dots: Dot[],\n dotExtents: DotsExtents,\n dotsByGrouping: Record<string, Dot[]>,\n layers: ScatterplotUmapSettingsImpl['layers'],\n legendInfo: ScatterplotUmapLegendInfo,\n grouping: ColumnName[],\n onPolygonUpdateOutside: ScatterplotEventHandlers['onPolygonUpdate'],\n onTooltipHintSwitch: (v:boolean) => void,\n onLassoControlsStateUpdate: (v:LassoControlsState) => void,\n ) { \n if (this.tools === null) {\n this.initSettings(\n dataFrame,\n dots,\n chartSettings,\n dotExtents,\n legendInfo,\n layers,\n grouping\n ); \n } else {\n const {title, legend, size} = chartSettings;\n this.updateChartSizes(size);\n this.updateLegendSize(legend, legendInfo, grouping, layers);\n this.createMainTitle(title);\n this.updateMargins();\n this.updateAes(dataFrame, legendInfo, layers);\n }\n\n this.onPolygonUpdateOutside = onPolygonUpdateOutside;\n this.onTooltipHintSwitch = onTooltipHintSwitch;\n this.onLassoControlsStateUpdate = onLassoControlsStateUpdate;\n\n if (this.allDots !== dots) {\n this.updateDots(dots);\n this.visibleLabels = this.computeLabels(dots);\n }\n\n this.notCalculatedProps = {\n settingsId,\n chartSettings,\n keyColumn,\n dotsByGrouping,\n layers\n };\n\n this.renderWebglLayer();\n this.renderSvgLayer(dataFrame);\n }\n\n renderWebglLayer() {\n if (this.tools?.webglChart) {\n select(this.canvasNode).call(this.tools?.webglChart);\n }\n }\n\n onPolygonUpdate = (p:Polygon[]) => {\n this.polygons = p;\n this.updateByLasso();\n const filteredDotsIndexes = this.allDots\n .filter(d => isDotInsidePolygons(d.x, d.y, this.polygons))\n .map(d => d.idx);\n this.onPolygonUpdateOutside(filteredDotsIndexes, p);\n };\n\n renderSvgLayer(dataFrame: DataFrame) {\n const props = {\n settingsId: this.notCalculatedProps.settingsId,\n chartSettings: this.notCalculatedProps.chartSettings,\n keyColumn: this.notCalculatedProps.keyColumn,\n dotsByGrouping: this.notCalculatedProps.dotsByGrouping,\n layers: this.notCalculatedProps.layers,\n chartSizes: this.chartSizes,\n scales: this.scales,\n margins: this.margins,\n mainTitle: this.mainTitle,\n captionsSizes: this.captionsSizes,\n container: this.svgLayerElement,\n zoomStateKey: this.zoomStateKey,\n selectedDot: this.selectedDot,\n aesGetters: this.aesGetters,\n legendData: this.legend,\n labels: this.visibleLabels,\n defaultPolygons: this.polygons,\n onPolygonUpdate: this.onPolygonUpdate,\n onTooltipHintSwitch: this.onTooltipHintSwitch,\n onLassoControlsStateUpdate: this.onLassoControlsStateUpdate,\n } as SVGLayerProps;\n this.svgLayerComponent = (\n <DataFrameProvider dataFrame={dataFrame}>\n <SVGLayer {...props} />\n </DataFrameProvider>\n );\n this.reactRoot?.render(this.svgLayerComponent);\n }\n\n renderError(message: string) {\n this.reactRoot?.render(<Error message={message} />);\n }\n\n private computeLabels(dots: Dot[]) {\n const textMeasurer = new TextMeasurer('16px Manrope');\n const getPosition = createLabelPositioner(this.chartSizes.chartWidth, this.chartSizes.chartHeight);\n const labels = [];\n\n for (let i = 0; i < dots.length; i++) {\n const dot = dots[i];\n if (dot.label == null) {\n continue;\n }\n const name = String(dot.label);\n const metrics = textMeasurer.getTextMetrics(name);\n const x = this.scales.x(dot.x);\n const y = this.scales.y(dot.y);\n const w = metrics.width;\n const h = (metrics.actualBoundingBoxAscent) + (metrics.actualBoundingBoxDescent);\n const p = 10;\n const position = getPosition(x, y, w, h, p);\n if (!position) {\n continue;\n }\n\n labels.push({\n x,\n y,\n dot,\n name,\n width: w,\n height: h,\n padding: p,\n xPosition: position[0],\n yPosition: position[1],\n } satisfies Label);\n }\n\n return labels;\n }\n\n private updateLabelsPosition(labels: Label[]) {\n for (let i = 0; i < labels.length; i++) {\n const label = labels[i];\n label.x = this.scales.x(label.dot.x as number);\n label.y = this.scales.y(label.dot.y as number);\n }\n }\n}\n\nexport default ChartRenderer;\n"],"names":["convertDotRToSymbolSize","r","isDotInsidePolygons","x","y","polygons","p","polygonContains","getGettersFromLayers","dataFrame","legendInfo","layers","dotLayer","l","curveLayer","createAesGetter","DEFAULT_DOT_AES","ChartRenderer","__publicField","jsx","Fragment","BLACK","MIN_MARGIN","DEFAULT_WIDTH","DEFAULT_HEIGHT","scaleLinear","filteredDotsIndexes","d","_a","_b","node","createRoot","size","xAxis","yAxis","dotsExtents","scaleX","scaleLog","minX","minY","maxX","maxY","middle","halfRange","rangeH","tempX","PADDINGS","scaleY","rangeV","tempY","textMeasurer","TextMeasurer","getMaxTickWidth","ticks","key","format","getTicksAndFormat","maxYTick","title","splitTextByWidth","titleTextHeight","TITLE_LINE_HEIGHT","titleHeight","TITLE_MARGIN","TITLE_LINE","select","legend","legendLabels","grouping","legendItems","emptySizes","column","info","aesData","category","scale","scaleOrdinal","value","layer","isContinuousAes","domain","range","columnName","type","colorScale","getContinuousColorScale","tickPositionScale","scaleSymlog","values","getContinuousLegendTicks","scaleSqrt","labels","res","v","items","arrangeLegendParts","lastItem","legendWidth","LEGEND_OFFSET","legendHeight","dots","chartSettings","dotExtents","fillColor","webglFillColor","rgba","stringToNumberRgba","getColorWithFakeOpacity","pointSeries","seriesWebglPoint","a","b","program","z","zoom","e","transform","pointer","coord","closestDatum","needRedraw","webglChart","chartCartesian","seriesSvgMulti","seriesWebglMulti","selection","s","colorGetter","GET_BLACK","tree","KDBush","i","_x","_y","radius","indexes","closest","idx","dot","dX","dY","distance","settingsId","keyColumn","dotsByGrouping","onPolygonUpdateOutside","onTooltipHintSwitch","onLassoControlsStateUpdate","props","DataFrameProvider","SVGLayer","message","Error","getPosition","createLabelPositioner","name","metrics","w","h","position","label"],"mappings":"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","x_google_ignoreList":[0]}
|
package/dist/node_modules/@milaboratories/miplots4/dist/scatterplot-umap/SettingsImpl.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"SettingsImpl.js","sources":["../../../../../../node_modules/@milaboratories/miplots4/src/scatterplot-umap/SettingsImpl.ts"],"sourcesContent":["import lodash from 'lodash';\nimport { BLACK, DEFAULT_HEIGHT, DEFAULT_WIDTH } from '../constants';\nimport type {
|
|
1
|
+
{"version":3,"file":"SettingsImpl.js","sources":["../../../../../../node_modules/@milaboratories/miplots4/src/scatterplot-umap/SettingsImpl.ts"],"sourcesContent":["import lodash from 'lodash';\nimport { BLACK, DEFAULT_HEIGHT, DEFAULT_WIDTH } from '../constants';\nimport type {\n AxisSettingsContinuous,\n ColumnName,\n ContinuousAesFromColumn,\n DataValue,\n FrameType,\n LegendPosition,\n LineShape,\n SettingsInterface,\n TitlePosition\n} from '../types';\nimport {type AesRecord, type InheritAesScatterplot, type PointShape} from '../types';\nimport type {\n CurveUmapLayer as OuterCurveLayer,\n DotsUmapLayer as OuterDotsLayer,\n ScatterplotUmapSettings\n} from '../types/scatterplot-umap';\nimport { ScatterplotUmapSettingsSchema } from '../types/scatterplot-umap';\n\nexport class DotsLayer {\n readonly type = 'dots';\n readonly aes: {\n dotFill: string | InheritAesScatterplot | ContinuousAesFromColumn<string>;\n dotShape: PointShape | InheritAesScatterplot;\n dotSize: number | ContinuousAesFromColumn<number>;\n opacity: number;\n } = {\n dotFill: BLACK,\n dotShape: '21',\n dotSize: 3,\n opacity: 1,\n };\n constructor(layer: OuterDotsLayer) {\n this.aes = {\n ...this.aes,\n ...layer.aes,\n };\n }\n}\nexport class CurveLayer {\n readonly type = 'curve';\n readonly smoothing: boolean;\n readonly aes: {\n lineColor: string | InheritAesScatterplot | ContinuousAesFromColumn<string>;\n lineWidth: number;\n lineShape: LineShape;\n opacity: number;\n } = {\n lineColor: BLACK,\n lineWidth: 1,\n lineShape: 'solid',\n opacity: 1,\n };\n\n constructor(layer: OuterCurveLayer) {\n this.smoothing = layer.smoothing ?? false;\n this.aes = {\n ...this.aes,\n ...layer.aes,\n };\n }\n}\n\nexport type ScatterplotUmapLayer = DotsLayer | CurveLayer;\n\nexport class ScatterplotUmapSettingsImpl implements SettingsInterface {\n readonly id: string;\n readonly type = 'scatterplot-umap';\n readonly keyColumn: ColumnName | null;\n readonly x: ColumnName;\n readonly y: ColumnName;\n readonly grouping: {\n columnName: ColumnName;\n order?: DataValue[];\n inheritedAes?: AesRecord;\n }[];\n readonly label: ColumnName | null;\n readonly highlight: ColumnName | null;\n readonly chartSettings: {\n readonly size: {width: number; height: number};\n readonly title: {name: string; show: boolean; position: TitlePosition};\n readonly yAxis: AxisSettingsContinuous & {title: string | ColumnName};\n readonly xAxis: AxisSettingsContinuous & {title: string | ColumnName};\n readonly frame: {type: FrameType};\n readonly legend: {show: boolean; position: LegendPosition};\n readonly tooltips: {show: boolean; content?: ColumnName[]};\n };\n readonly layers: ScatterplotUmapLayer[];\n\n constructor(settings: ScatterplotUmapSettings) {\n ScatterplotUmapSettingsSchema.parse(settings);\n this.id = lodash.uniqueId('settings');\n this.keyColumn = settings.keyColumn ?? null;\n this.x = settings.x;\n this.y = settings.y;\n this.grouping = settings.grouping ?? [];\n this.label = settings.label ?? null;\n this.highlight = settings.highlight ?? null;\n this.chartSettings = {\n size: {\n width: settings?.size?.width ?? DEFAULT_WIDTH,\n height: settings?.size?.height ?? DEFAULT_HEIGHT,\n },\n title: {\n position: 'center',\n show: true,\n ...settings.title,\n name: settings.title?.name ?? 'Chart',\n },\n yAxis: {\n title: settings.y.label ?? settings.y.value,\n scale: 'linear',\n showGrid: true,\n showTicks: true,\n ...settings.yAxis,\n },\n xAxis: {\n title: settings.x.label ?? settings.x.value,\n scale: 'linear',\n showGrid: true,\n showTicks: true,\n ...settings.xAxis,\n },\n frame: {type: settings.frame?.type ?? 'full'},\n legend: {\n show: true,\n position: 'right',\n ...settings.legend,\n },\n tooltips: {\n ...settings.tooltips,\n show: !(settings.tooltips?.show === false) && (settings.tooltips?.content ?? []).length > 0,\n },\n };\n\n this.layers = settings.layers\n .map(layer => {\n if (layer.type === 'dots') {\n return new DotsLayer(layer);\n } else if (layer.type === 'curve') {\n return new CurveLayer(layer);\n } else {\n throw new Error('Unknown layer type');\n }\n })\n .filter(Boolean) as ScatterplotUmapLayer[];\n }\n}\n"],"names":["DotsLayer","layer","__publicField","BLACK","CurveLayer","ScatterplotUmapSettingsImpl","settings","ScatterplotUmapSettingsSchema","lodash","_a","DEFAULT_WIDTH","_b","DEFAULT_HEIGHT","_c","_d","_e","_f"],"mappings":"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","x_google_ignoreList":[0]}
|
package/dist/node_modules/@milaboratories/miplots4/dist/scatterplot-umap/components/LowerSVG.js
CHANGED
|
@@ -7,7 +7,7 @@ import { Legend as N } from "../../common/Legend.js";
|
|
|
7
7
|
import { Tooltip as O } from "../../common/Tooltip.js";
|
|
8
8
|
import { useDataFrame as M } from "../../common/useDataFrame.js";
|
|
9
9
|
import { BLACK as U } from "../../constants.js";
|
|
10
|
-
import {
|
|
10
|
+
import { ContinuousAxis as D } from "../../common/ContinuousAxis.js";
|
|
11
11
|
import { formatColumnValue as V } from "../../scatterplot/utils/formatColumnValue.js";
|
|
12
12
|
import { DEFAULT_TICKS_SIZE as C, TITLE_LINE as u, LEGEND_OFFSET as Z } from "../constants.js";
|
|
13
13
|
import q from "../../node_modules/d3-shape/src/line.js";
|
|
@@ -41,7 +41,7 @@ function tt({
|
|
|
41
41
|
tooltipData: l
|
|
42
42
|
}) {
|
|
43
43
|
var $;
|
|
44
|
-
const P = M(), { title:
|
|
44
|
+
const P = M(), { title: w, xAxis: p, yAxis: x, frame: b, legend: A } = h, z = p.showTicks ? C : 0, B = x.showTicks ? C : 0, v = p.title, W = x.title, I = {
|
|
45
45
|
left: 0,
|
|
46
46
|
right: t.chartWidth,
|
|
47
47
|
top: 0,
|
|
@@ -78,20 +78,20 @@ function tt({
|
|
|
78
78
|
G,
|
|
79
79
|
{
|
|
80
80
|
title: m,
|
|
81
|
-
show:
|
|
82
|
-
position:
|
|
81
|
+
show: w.show,
|
|
82
|
+
position: w.position,
|
|
83
83
|
leftPadding: i.left,
|
|
84
84
|
rightPadding: i.right,
|
|
85
85
|
chartsWidth: t.chartWidth
|
|
86
86
|
}
|
|
87
87
|
),
|
|
88
88
|
/* @__PURE__ */ e.jsxs("g", { dominantBaseline: "central", textAnchor: "middle", fontWeight: "500", fontSize: "14px", fill: U, children: [
|
|
89
|
-
|
|
89
|
+
v && /* @__PURE__ */ e.jsx(
|
|
90
90
|
"text",
|
|
91
91
|
{
|
|
92
92
|
x: t.chartWidth / 2,
|
|
93
93
|
y: t.chartHeight + i.bottom - u / 2,
|
|
94
|
-
children: E(
|
|
94
|
+
children: E(v)
|
|
95
95
|
}
|
|
96
96
|
),
|
|
97
97
|
W && /* @__PURE__ */ e.jsx(
|