@milaboratories/miplots4 1.0.161 → 1.0.163

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (76) hide show
  1. package/dist/_virtual/index10.js +2 -5
  2. package/dist/_virtual/index10.js.map +1 -1
  3. package/dist/_virtual/index5.js +5 -2
  4. package/dist/_virtual/index5.js.map +1 -1
  5. package/dist/_virtual/index6.js +4 -4
  6. package/dist/_virtual/index7.js +1 -1
  7. package/dist/_virtual/index8.js +4 -4
  8. package/dist/_virtual/index9.js +3 -3
  9. package/dist/common/BandAxis.d.ts +2 -1
  10. package/dist/common/BandAxis.js +19 -18
  11. package/dist/common/BandAxis.js.map +1 -1
  12. package/dist/common/ContinuousAxis.js +20 -20
  13. package/dist/common/ContinuousAxis.js.map +1 -1
  14. package/dist/common/Legend.js +3 -3
  15. package/dist/common/Legend.js.map +1 -1
  16. package/dist/discrete/DiscreteSettingsImpl.d.ts +6 -4
  17. package/dist/discrete/DiscreteSettingsImpl.js +9 -9
  18. package/dist/discrete/DiscreteSettingsImpl.js.map +1 -1
  19. package/dist/discrete/constants.d.ts +1 -1
  20. package/dist/discrete/constants.js +1 -1
  21. package/dist/discrete/constants.js.map +1 -1
  22. package/dist/discrete/index.js +107 -106
  23. package/dist/discrete/index.js.map +1 -1
  24. package/dist/discrete/layers/bar.js +25 -22
  25. package/dist/discrete/layers/bar.js.map +1 -1
  26. package/dist/discrete/layers/errorbars.js +57 -48
  27. package/dist/discrete/layers/errorbars.js.map +1 -1
  28. package/dist/discrete/layers/lines.js +40 -31
  29. package/dist/discrete/layers/lines.js.map +1 -1
  30. package/dist/discrete/layers/stackedBar.js.map +1 -1
  31. package/dist/discrete/layers/stats/pValueCalculation.js +5 -5
  32. package/dist/heatmap/components/Captions/AxisCaptions.js +34 -34
  33. package/dist/heatmap/components/Captions/AxisCaptions.js.map +1 -1
  34. package/dist/heatmap/fillCellsData.js +49 -46
  35. package/dist/heatmap/fillCellsData.js.map +1 -1
  36. package/dist/heatmap/utils/calculateChartSideElementSizes.js +23 -23
  37. package/dist/heatmap/utils/calculateChartSideElementSizes.js.map +1 -1
  38. package/dist/histogram/ChartRenderer.js +57 -54
  39. package/dist/histogram/ChartRenderer.js.map +1 -1
  40. package/dist/histogram/constants.d.ts +1 -1
  41. package/dist/histogram/constants.js.map +1 -1
  42. package/dist/histogram/index.js +58 -51
  43. package/dist/histogram/index.js.map +1 -1
  44. package/dist/node_modules/.pnpm/scheduler@0.23.2/node_modules/scheduler/index.js +1 -1
  45. package/dist/scatterplot/ChartRenderer.js +89 -89
  46. package/dist/scatterplot/ChartRenderer.js.map +1 -1
  47. package/dist/scatterplot/components/ChartAxis.js +30 -30
  48. package/dist/scatterplot/components/ChartAxis.js.map +1 -1
  49. package/dist/scatterplot/components/ChartAxisTitles.js +22 -22
  50. package/dist/scatterplot/components/ChartAxisTitles.js.map +1 -1
  51. package/dist/scatterplot/constants.d.ts +1 -1
  52. package/dist/scatterplot/constants.js +1 -1
  53. package/dist/scatterplot/constants.js.map +1 -1
  54. package/dist/scatterplot/dots.d.ts +1 -1
  55. package/dist/scatterplot/dots.js +14 -14
  56. package/dist/scatterplot/dots.js.map +1 -1
  57. package/dist/scatterplot/index.js +94 -79
  58. package/dist/scatterplot/index.js.map +1 -1
  59. package/dist/scatterplot-umap/ChartRenderer.d.ts +1 -1
  60. package/dist/scatterplot-umap/ChartRenderer.js +14 -14
  61. package/dist/scatterplot-umap/ChartRenderer.js.map +1 -1
  62. package/dist/scatterplot-umap/components/LowerSVG.js +38 -38
  63. package/dist/scatterplot-umap/components/LowerSVG.js.map +1 -1
  64. package/dist/types/bubble.d.ts +5 -5
  65. package/dist/types/bubble.js +40 -40
  66. package/dist/types/bubble.js.map +1 -1
  67. package/dist/types/common.d.ts +25 -2
  68. package/dist/types/common.js +16 -15
  69. package/dist/types/common.js.map +1 -1
  70. package/dist/types/discrete.d.ts +66 -56
  71. package/dist/types/discrete.js +40 -38
  72. package/dist/types/discrete.js.map +1 -1
  73. package/dist/types/heatmap.d.ts +5 -6
  74. package/dist/types/heatmap.js +29 -29
  75. package/dist/types/heatmap.js.map +1 -1
  76. package/package.json +1 -1
@@ -1 +1 @@
1
- {"version":3,"file":"ChartRenderer.js","sources":["../../src/scatterplot/ChartRenderer.tsx"],"sourcesContent":["import type { ScaleLinear } from 'd3-scale';\nimport { scaleLinear, scaleLog, scaleOrdinal, scalePoint, scaleSqrt, scaleSymlog } from 'd3-scale';\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 { DataFrameProvider } from '../common/useDataFrame';\nimport {\n BLACK,\n DEFAULT_HEIGHT,\n DEFAULT_WIDTH,\n MAX_LEGEND_GRADIENT_HEIGHT,\n MAX_SHOWN_UNIQUE_VALUES_IN_LABELS,\n MIN_LEGEND_GRADIENT_HEIGHT,\n TITLE_LINE_HEIGHT,\n TITLE_MARGIN,\n} from '../constants';\nimport type { DataFrame } from '../DataFrame';\nimport { FACET_TITLE_LINE } from '../discrete/constants';\nimport { splitTextByWidth } from '../discrete/utils';\nimport type { AxisSettingsDiscrete, ColumnName, PointShape, ScatterplotLegendInfo } from '../types';\nimport { isContinuousAes } from '../types';\nimport { arrangeLegendParts } from '../utils/arrangeLegendParts';\nimport { getContinuousColorScale } from '../utils/getContinuousColorScale';\nimport { getContinuousLegendTicks } from '../utils/getContinuousLegendTicks';\nimport { TextMeasurer } from '../utils/TextMeasurer/TextMeasurer';\nimport { ChartsGroup } from './components/ChartsGroup';\nimport type { AesGetters, CaptionsSizes, ChartDimensionsData, ChartScales, ChartSizes, ChartsScales, DiscreteAxisData, DiscreteScale, Margins } from './components/types';\nimport {\n DEFAULT_DOT_AES,\n DEFAULT_TICKS_SIZE,\n FACET_AXIS_OFFSET,\n FACET_TITLE_OFFSET,\n LEGEND_OFFSET,\n MIN_MARGIN,\n MIN_PADDING,\n PADDINGS,\n TICK_OFFSET,\n TITLE_LINE,\n} from './constants';\nimport type { GroupedDots } from './dots';\nimport type { ScatterplotLayerData } from './getLayersData';\nimport type { TrendsData } from './linearRegression';\nimport type { CurveLayer, DotsLayer, ScatterplotLayer, ScatterplotSettingsImpl } from './ScatterplotSettingsImpl';\nimport { createAesGetter } from './utils/createAesGetter';\nimport { getTicksAndFormat } from './utils/getTicksAndFormat';\nimport { isContinuousAxis } from './utils/isNumericScale';\nimport { createMultilineDiscreteLabels } from '../utils/createMultilineDiscreteLabels';\nimport { measureMultilineDiscreteLabels } from '../utils/measureMultilineDiscreteLabels';\n\nfunction scalesAreDifferent(prevScale:ChartScales['x'|'y'], currentScale:ChartScales['x'|'y']):boolean {\n if (prevScale === undefined) {\n return true;\n } else {\n const domain = prevScale.domain();\n const range = prevScale.range();\n const newDomain = currentScale.domain();\n const newRange = currentScale.range();\n if (\n domain.length !== newDomain.length ||\n domain.some((v, idx) => v !== newDomain[idx]) ||\n range[0] !== newRange[0] || range[1] !== newRange[1]\n ) {\n return true;\n }\n }\n return false;\n}\nfunction getChartEdgeSides(index: number, facetsCount: number, columnsCount: number, rowsCount: number) {\n const chartSides: ('left' | 'right' | 'top' | 'bottom')[] = [];\n if (index % columnsCount === columnsCount - 1) {\n chartSides.push('right');\n }\n if (index % columnsCount === 0) {\n chartSides.push('left');\n }\n if (index < columnsCount) {\n chartSides.push('top');\n }\n if (\n Math.ceil((index + 1) / columnsCount) === rowsCount ||\n (Math.ceil((index + 1) / columnsCount) === rowsCount - 1 &&\n index % columnsCount > (facetsCount - 1) % columnsCount)\n ) {\n chartSides.push('bottom');\n }\n return chartSides;\n}\n\nfunction calculatePaddings(\n xAxis: ScatterplotSettingsImpl['chartSettings']['xAxis'],\n yAxis: ScatterplotSettingsImpl['chartSettings']['yAxis'],\n captionsSizes: CaptionsSizes,\n currentRowFacetKeys: string[],\n facetTitles: Record<string, string[]>,\n chartEdgeSides: ('left' | 'right' | 'top' | 'bottom')[],\n currentRow: number,\n currentColumn: number,\n lastInRow: boolean,\n facetSettings?: ScatterplotSettingsImpl['facetSettings'],\n) {\n const discreteX = xAxis.scale === 'discrete';\n const discreteY = yAxis.scale === 'discrete';\n\n const needLeftAxis = chartEdgeSides.includes('left') || !facetSettings?.sharedY;\n const needLeftAxisTitle = chartEdgeSides.includes('left') && yAxis.title !== '';\n const needBottomAxis = chartEdgeSides.includes('bottom') || !facetSettings?.sharedX;\n const needBottomAxisTitle = chartEdgeSides.includes('bottom') && xAxis.title !== '';\n\n const yCaptions = discreteY ? captionsSizes.leftAxisCaptionsWidthByColumns[currentColumn] : captionsSizes.yAxisCaptionsWidth + 2 * TICK_OFFSET;\n const yTicks = (yAxis.showTicks ? DEFAULT_TICKS_SIZE : 0) + TICK_OFFSET;\n const yAxisTitle = needLeftAxisTitle ? TITLE_LINE + MIN_PADDING : 0;\n\n const xCaptions = discreteX ? captionsSizes.bottomAxisCaptionsWidthByRows[currentRow] : captionsSizes.xAxisCaptionsWidth + 2 * TICK_OFFSET;\n const xTicks = xAxis.showTicks ? DEFAULT_TICKS_SIZE : 0;\n const xAxisTitle = needBottomAxisTitle ? TITLE_LINE + MIN_PADDING : 0;\n\n const leftAxisElements = yCaptions + yTicks + yAxisTitle + FACET_AXIS_OFFSET;\n const bottomAxisElements = xCaptions + xTicks + xAxisTitle + FACET_AXIS_OFFSET;\n\n const facetTitlesLinesCount = Math.max(...currentRowFacetKeys.map(key => facetTitles[key].length));\n return {\n left: needLeftAxis ? leftAxisElements : MIN_PADDING,\n top: facetTitlesLinesCount === 0 ? 0 : FACET_TITLE_OFFSET * 2 + facetTitlesLinesCount * FACET_TITLE_LINE,\n bottom: needBottomAxis ? bottomAxisElements + 8 : MIN_PADDING,\n right: lastInRow ? 0 : MIN_PADDING,\n };\n}\n\n// facet keys grouped by rows\nfunction getFacetRows(facetKeys: string[], nRows: number, nColumns: number): string[][] {\n const result: string[][] = [];\n for (let i = 0; i < nRows; i++) {\n result.push(facetKeys.slice(i * nColumns, i * nColumns + nColumns));\n }\n return result;\n}\n\nfunction getRowColumn(idx: number, columnsCount: number) {\n const row = Math.floor(idx / columnsCount);\n const column = idx - row * columnsCount;\n return [row, column];\n}\n\nfunction createAesGetters(\n dataFrame: DataFrame,\n legendInfo: ScatterplotLegendInfo,\n layers: ScatterplotLayer[],\n trend: ScatterplotSettingsImpl['trend']\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\n return {\n dotShape: createAesGetter(dataFrame, legendInfo, dotLayer?.aes.dotShape ?? DEFAULT_DOT_AES.shape,'dotShape'),\n dotColor: 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 lineShape: createAesGetter(dataFrame, legendInfo, curveLayer?.aes.lineShape ?? 'solid', 'lineShape'),\n lineColor: createAesGetter(dataFrame, legendInfo, curveLayer?.aes.lineColor ?? BLACK, 'lineColor'),\n trendColor: createAesGetter(dataFrame, legendInfo, trend?.color ?? DEFAULT_DOT_AES.color, 'fillColor')\n };\n}\n\nconst COS_PI_4 = Math.cos(Math.PI / 4);\nconst INCLINE_OFFSET = 5; // height of little triangle of text for captions inclined 45deg\n\nfunction getCaptionHeight (size: number, axis: ScatterplotSettingsImpl['chartSettings']['xAxis' | 'yAxis']) {\n if (axis.scale === 'discrete') {\n if (axis.labelsPosition === '90deg') {\n return size;\n }\n if (axis.labelsPosition === '45deg') {\n return size * COS_PI_4 + (size > 0 ? 2 * INCLINE_OFFSET : 0) ;\n }\n return TITLE_LINE;\n }\n return size;\n}\n\nclass ChartRenderer {\n reactRoot: Root | null = null;\n parentNode: HTMLElement | null = null;\n rootNode: HTMLElement | null = null;\n component: ReactElement = (<></>);\n margins: Margins = {\n top: MIN_MARGIN,\n bottom: MIN_MARGIN,\n left: MIN_MARGIN,\n right: MIN_MARGIN,\n };\n chartsDimensions: Record<string, ChartDimensionsData> = {};\n chartSizes: ChartSizes = {\n chartWidth: DEFAULT_WIDTH, // width of single chart\n chartHeight: DEFAULT_HEIGHT, // height of single chart\n chartsWidth: DEFAULT_WIDTH, // width of all charts in charts row\n chartsHeight: DEFAULT_HEIGHT, // width of all charts in charts column, without axes\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 columnsCount = 1;\n rowsCount = 1;\n scales: ChartsScales = {\n x: {null: scaleLinear().domain([0, 1]).range([0, DEFAULT_WIDTH])},\n y: {null: scaleLinear().domain([0, 1]).range([DEFAULT_HEIGHT, 0])},\n };\n captionsSizes: CaptionsSizes = {\n xAxisCaptionsWidth: 30,\n yAxisCaptionsWidth: 100,\n bottomAxisCaptionsWidthByRows: [],\n leftAxisCaptionsWidthByColumns: [],\n bottomCaptionsTail: 0,\n leftCaptionsTail: 0,\n };\n facetTitles: Record<string, string[]> = {}; // can be multiline\n mainTitle: string[] = []; // can be multiline\n discreteAxesLabels: {\n x: Record<string, Record<string, string[]>>,\n y: Record<string, Record<string, string[]>>\n } = {x: {}, y: {}}; // only for discrete axes, by facets, can be multiline\n\n legend: LegendData = {width: 0, height: 0, items: []};\n\n clear() {\n if (this.parentNode && this.rootNode) {\n this.parentNode?.removeChild(this.rootNode);\n this.parentNode = null;\n this.rootNode = 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.parentNode.appendChild(this.rootNode);\n this.reactRoot = createRoot(this.rootNode);\n }\n }\n\n updateChartSizes(size: ScatterplotSettingsImpl['chartSettings']['size']) {\n this.chartSizes.chartWidth = size.width;\n this.chartSizes.chartHeight = size.height;\n }\n\n updateChartDimensions(\n facetKeys: string[],\n facetSettings: ScatterplotSettingsImpl['facetSettings'],\n xAxis: ScatterplotSettingsImpl['chartSettings']['xAxis'],\n yAxis: ScatterplotSettingsImpl['chartSettings']['yAxis']\n ) {\n const {chartWidth, chartHeight} = this.chartSizes;\n let currentLeft = 0;\n let currentTop = 0;\n const facetRows = getFacetRows(facetKeys, this.rowsCount, this.columnsCount);\n this.chartsDimensions = facetKeys.reduce((res: Record<string, ChartDimensionsData>, key: string, index) => {\n const [currentRow, currentColumn] = getRowColumn(index, this.columnsCount);\n const chartEdgeSides = getChartEdgeSides(index, facetKeys.length, this.columnsCount, this.rowsCount);\n const padding = calculatePaddings(\n xAxis,\n yAxis,\n this.captionsSizes,\n facetRows[currentRow],\n this.facetTitles,\n chartEdgeSides,\n currentRow,\n currentColumn,\n currentColumn === this.columnsCount - 1,\n facetSettings\n );\n\n const outerWidth = chartWidth + padding.left + padding.right;\n const outerHeight = chartHeight + padding.top + padding.bottom;\n res[key] = {\n left: currentLeft,\n top: currentTop,\n chartEdgeSides,\n padding,\n inner: {width: chartWidth, height: chartHeight},\n outer: {width: outerWidth, height: outerHeight},\n };\n currentLeft += outerWidth;\n if (currentColumn === this.columnsCount - 1) {\n currentLeft = 0;\n currentTop += outerHeight;\n }\n return res;\n }, {});\n\n const chartsWidth = Math.max(\n ...facetKeys.map(key => this.chartsDimensions[key].outer.width + this.chartsDimensions[key].left)\n );\n const chartsHeight = Math.max(\n ...facetKeys.map(key => this.chartsDimensions[key].outer.height + this.chartsDimensions[key].top)\n );\n this.chartSizes.chartsWidth = chartsWidth;\n this.chartSizes.chartsHeight = chartsHeight;\n }\n\n updateViewport(\n facetKeys: string[],\n facetSettings: ScatterplotSettingsImpl['facetSettings'],\n xAxis: ScatterplotSettingsImpl['chartSettings']['xAxis'],\n yAxis: ScatterplotSettingsImpl['chartSettings']['yAxis'],\n discreteAxisDataX: DiscreteAxisData,\n discreteAxisDataY: DiscreteAxisData,\n groupedDots: GroupedDots,\n trendsData: TrendsData | null\n ) {\n const facetCount = facetKeys.length;\n const maxNRows = Math.min(facetSettings.nRows ?? facetCount, facetCount);\n const maxNCols = Math.min(facetSettings.nCols ?? facetCount, facetCount);\n // Use columns/rows count from settings if some of them defined, else make 1 column\n this.columnsCount = facetSettings.nRows ? Math.ceil(facetCount / maxNRows) : maxNCols;\n this.rowsCount = Math.ceil(facetCount / this.columnsCount);\n\n let [minXAll, maxXAll] = [Infinity, -Infinity];\n let [minYAll, maxYAll] = [Infinity, -Infinity];\n const dotExtentsByKeys = facetKeys.reduce((res: Record<string, Record<string, number>>, key) => {\n const dotsData = groupedDots[key];\n const {minX, minY, maxX, maxY} = dotsData;\n minXAll = Math.min(minXAll, minX);\n minYAll = Math.min(minYAll, minY);\n maxXAll = Math.max(maxXAll, maxX);\n maxYAll = Math.max(maxYAll, maxY);\n res[key] = {minX, maxX, minY, maxY};\n return res;\n }, {});\n\n const newScalesX:ChartsScales['x'] = {};\n const newScalesY:ChartsScales['y'] = {};\n\n let needsUpdateXScales = false;\n let needsUpdateYScales = false;\n facetKeys.forEach(key => {\n let scaleX: ChartsScales['x'][string];\n if (!isContinuousAxis(xAxis)) {\n scaleX = scalePoint<string | number>()\n .range([0, this.chartSizes.chartWidth])\n .domain(discreteAxisDataX.keys ?? []).padding(0.5);\n\n } else {\n scaleX = xAxis.scale === 'log' ? scaleLog() : scaleLinear();\n const extents = dotExtentsByKeys[key];\n let minX = xAxis.lowerValue ? Number(xAxis.lowerValue) : facetSettings.sharedX ? minXAll : extents.minX;\n let maxX = xAxis.upperValue ? Number(xAxis.upperValue) : facetSettings.sharedX ? maxXAll : extents.maxX;\n\n if (typeof 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\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\n }\n const prevScale = this.scales.x[key];\n newScalesX[key] = scaleX;\n needsUpdateXScales = needsUpdateXScales || scalesAreDifferent(prevScale, scaleX);\n });\n // for right Y viewport bounds we must know X bounds, to calculate trends area Y bounds\n const trendYBoundsByKeys = facetKeys.reduce((res: Record<string, Record<string, number>>, key) => {\n const trendsList = trendsData ? trendsData[key] : [];\n res[key] = trendsList.reduce(\n (res, trend) => {\n const xBounds = trend.bounded ? trend.xBounds : this.scales.x[key].domain(); // trends exist only with continuous scales\n const i1 = trend.getInterval(xBounds[0] as number);\n const i2 = trend.getInterval(xBounds[1] as number);\n res.minY = Math.min(res.minY, isNaN(i1.left) ? res.minY : i1.left, isNaN(i2.left) ? res.minY : i2.left);\n res.maxY = Math.max(res.maxY, isNaN(i1.right) ? res.maxY : i1.right, isNaN(i2.right) ? res.maxY : i2.right);\n return res;\n },\n {minY: Infinity, maxY: -Infinity}\n );\n minYAll = Math.min(minYAll, res[key].minY);\n maxYAll = Math.max(maxYAll, res[key].maxY);\n return res;\n }, {});\n facetKeys.forEach(key => {\n let scaleY: ChartsScales['y'][string];\n if (!isContinuousAxis(yAxis)) {\n scaleY = scalePoint<string | number>()\n .range([this.chartSizes.chartHeight, 0])\n .domain(discreteAxisDataY.keys ?? [])\n .padding(0.5);\n } else {\n scaleY = yAxis.scale === 'log' ? scaleLog() : scaleLinear();\n\n const dotExtents = dotExtentsByKeys[key];\n const trendExtents = trendYBoundsByKeys[key];\n let minY = yAxis.lowerValue ? Number(yAxis.lowerValue) : facetSettings.sharedY ? minYAll : Math.min(dotExtents.minY, trendExtents.minY);\n let maxY = yAxis.upperValue ? Number(yAxis.upperValue) : facetSettings.sharedY ? maxYAll : Math.max(dotExtents.maxY, trendExtents.maxY);\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 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 }\n const prevScale = this.scales.y[key];\n newScalesY[key] = scaleY;\n needsUpdateYScales = needsUpdateYScales || scalesAreDifferent(prevScale, scaleY);\n });\n\n if (needsUpdateXScales) {\n this.scales.x = newScalesX;\n }\n if (needsUpdateYScales) {\n this.scales.y = newScalesY;\n }\n }\n\n updateCaptionsSize(\n facetKeys: string[],\n xAxis: ScatterplotSettingsImpl['chartSettings']['xAxis'],\n yAxis: ScatterplotSettingsImpl['chartSettings']['yAxis'],\n onlyPositive: boolean\n ) {\n const textMeasurer = new TextMeasurer('600 14px Manrope');\n function getMaxTickWidth(ticks: string[]) {\n return Math.max(...ticks.map(key => textMeasurer.getTextWidth(key)));\n }\n\n let xTail = 0;\n let yTail = 0;\n let xAxisCaptionsWidthByRows:number[] = [];\n let yAxisCaptionsWidthByColumns:number[] = [];\n let maxXLabelSize = 0;\n let maxYLabelSize = 0;\n if (xAxis.scale === 'discrete') {\n const sizes = measureMultilineDiscreteLabels(\n facetKeys,\n this.rowsCount,\n this.columnsCount,\n xAxis.labelsPosition ?? 'center',\n this.discreteAxesLabels.x,\n 'vertical',\n this.scales.x as Record<string, DiscreteScale>,\n );\n xTail = sizes.xTail;\n xAxisCaptionsWidthByRows = sizes.axisCaptionsWidthByRows;\n } else {\n maxXLabelSize = 20;\n }\n\n if (yAxis.scale === 'discrete') {\n const sizes = measureMultilineDiscreteLabels(\n facetKeys,\n this.rowsCount,\n this.columnsCount,\n yAxis.labelsPosition ?? 'center',\n this.discreteAxesLabels.y,\n 'horizontal',\n this.scales.y as Record<string, DiscreteScale>,\n );\n yTail = sizes.yTail;\n yAxisCaptionsWidthByColumns = sizes.axisCaptionsWidthByColumns;\n } else {\n Object.values(this.scales.y).forEach(scale => {\n const {ticks, format} = getTicksAndFormat(scale, onlyPositive);\n maxYLabelSize = Math.max(maxYLabelSize, getMaxTickWidth(ticks.map(format)));\n });\n }\n\n this.captionsSizes = {\n xAxisCaptionsWidth: getCaptionHeight(maxXLabelSize, xAxis),\n yAxisCaptionsWidth: getCaptionHeight(maxYLabelSize, yAxis),\n bottomAxisCaptionsWidthByRows: xAxisCaptionsWidthByRows,\n leftAxisCaptionsWidthByColumns: yAxisCaptionsWidthByColumns,\n bottomCaptionsTail: xTail,\n leftCaptionsTail: yTail\n };\n }\n\n createMainTitle(facetKeys: string[], title: ScatterplotSettingsImpl['chartSettings']['title']) {\n const firstChart = this.chartsDimensions[facetKeys[0]];\n const lastChart = this.chartsDimensions[facetKeys[facetKeys.length - 1]];\n\n this.mainTitle = splitTextByWidth(\n title.name,\n this.chartSizes.chartsWidth - firstChart.padding.left - lastChart.padding.right,\n 20\n );\n }\n\n createFacetTitles(facetKeys: string[], facetLabels: string[][]) {\n this.facetTitles = facetKeys.reduce((res: Record<string, string[]>, key, idx) => {\n if (facetLabels[idx].length === 1 && facetLabels[idx][0] === 'null') {\n res[key] = [];\n } else {\n res[key] = splitTextByWidth(facetLabels[idx].join(', '), this.chartSizes.chartWidth, 14);\n }\n return res;\n }, {});\n }\n\n createAxisLabels(\n facetKeys: string[],\n xAxis: ScatterplotSettingsImpl['chartSettings']['xAxis'],\n yAxis: ScatterplotSettingsImpl['chartSettings']['xAxis'],\n discreteAxisDataX: DiscreteAxisData,\n discreteAxisDataY: DiscreteAxisData,\n ) {\n this.discreteAxesLabels = {\n x: xAxis.scale !== 'discrete' ? {} : createMultilineDiscreteLabels(\n facetKeys,\n (xAxis as AxisSettingsDiscrete)?.labelsPosition ?? 'center',\n discreteAxisDataX.labels,\n false,\n 'vertical',\n this.scales.x as Record<string, DiscreteScale>,\n ),\n y: yAxis.scale !== 'discrete' ? {} : createMultilineDiscreteLabels(\n facetKeys,\n (yAxis as AxisSettingsDiscrete).labelsPosition ?? 'center',\n discreteAxisDataY.labels,\n false,\n 'horizontal',\n this.scales.y as Record<string, DiscreteScale>,\n )\n };\n }\n\n updateMargins(facetKeys: string[]) {\n const titleTextHeight = TITLE_LINE_HEIGHT * this.mainTitle.length;\n const titleHeight = titleTextHeight > 0 ? titleTextHeight + TITLE_MARGIN * 2 : 0;\n const firstChart = this.chartsDimensions[facetKeys[0]];\n const lastChart = this.chartsDimensions[facetKeys[facetKeys.length - 1]];\n this.margins = {\n top: Math.max(titleHeight, MIN_MARGIN),\n bottom: Math.max(MIN_MARGIN, this.captionsSizes.leftCaptionsTail - lastChart.padding.bottom),\n left: Math.max(MIN_MARGIN, this.captionsSizes.bottomCaptionsTail - firstChart.padding.left),\n right: this.legend.width + MIN_MARGIN,\n }; \n this.chartSizes.totalWidth = this.margins.left + this.chartSizes.chartsWidth + this.margins.right;\n this.chartSizes.totalHeight =\n this.margins.top + Math.max(this.chartSizes.chartsHeight, this.legend.height) + this.margins.bottom;\n }\n\n updateLegendSize(\n legend: ScatterplotSettingsImpl['chartSettings']['legend'],\n legendInfo: ScatterplotLegendInfo,\n grouping: ColumnName[],\n layers: ScatterplotLayer[]\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 const continuousHeight = Math.min(\n Math.max(this.chartSizes.chartHeight, MIN_LEGEND_GRADIENT_HEIGHT),\n MAX_LEGEND_GRADIENT_HEIGHT\n );\n const legendHeight = Math.max(this.chartSizes.chartHeight, continuousHeight);\n grouping.forEach(column => {\n const info = legendInfo[column.value];\n if (info.usedAes.length === 0 || !info.aesMap) {\n return;\n }\n if (info.values.length > MAX_SHOWN_UNIQUE_VALUES_IN_LABELS) {\n console.warn(`Too many values for discrete legend (${info.values.length})`);\n return;\n }\n const aesData: Record<string, DotAesItem> = {};\n info.values.forEach(columnValue => {\n if (!aesData[columnValue]) {\n aesData[columnValue] = {...DEFAULT_DOT_AES} as DotAesItem;\n }\n info.usedAes.forEach(key => {\n if (key === 'dotFill' || key === 'lineColor') {\n aesData[columnValue].color = (info.aesMap(columnValue, key) ?? BLACK) as string;\n }\n if (key === 'dotShape') {\n aesData[columnValue].shape = (info.aesMap(columnValue,key) ?? '21') as PointShape;\n }\n if (key === 'dotSize') {\n aesData[columnValue].size = (info.aesMap(columnValue,key) ?? 3) as number;\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 .unknown(DEFAULT_DOT_AES);\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([continuousHeight, 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, legendHeight, continuousHeight);\n\n const lastItem = items[items.length - 1];\n const legendWidth = lastItem.left + lastItem.width + LEGEND_OFFSET;\n\n this.legend = {\n width: legendWidth,\n height: legendHeight,\n items,\n };\n }\n\n render(\n dataFrame: DataFrame,\n settingsId: string,\n chartSettings: ScatterplotSettingsImpl['chartSettings'],\n facetSettings: ScatterplotSettingsImpl['facetSettings'],\n facetKeys: string[],\n facetLabels: string[][],\n groupedDots: GroupedDots,\n trendsData: TrendsData | null,\n keyColumn: ColumnName,\n onlyPositive: {x: boolean; y: boolean},\n legendInfo: ScatterplotLegendInfo,\n layersData: Record<string, ScatterplotLayerData[]>,\n grouping: ColumnName[],\n layers: ScatterplotLayer[],\n trend: ScatterplotSettingsImpl['trend'],\n discreteAxisDataX: DiscreteAxisData,\n discreteAxisDataY: DiscreteAxisData,\n onTooltipHintSwitch: (v:boolean) => void\n ) {\n const {xAxis, yAxis, size, title, legend} = chartSettings;\n this.updateChartSizes(size);\n this.updateViewport(facetKeys, facetSettings, xAxis, yAxis, discreteAxisDataX, discreteAxisDataY, groupedDots, trendsData);\n this.createAxisLabels(facetKeys, xAxis, yAxis, discreteAxisDataX, discreteAxisDataY);\n this.updateCaptionsSize(facetKeys, xAxis, yAxis, onlyPositive.y);\n this.createFacetTitles(facetKeys, facetLabels);\n this.updateChartDimensions(facetKeys, facetSettings, xAxis, yAxis);\n this.updateLegendSize(legend, legendInfo, grouping, layers);\n this.createMainTitle(facetKeys, title);\n this.updateMargins(facetKeys);\n const component = (\n <DataFrameProvider dataFrame={dataFrame}>\n <ChartsGroup\n settingsId={settingsId}\n chartSettings={chartSettings}\n facetKeys={facetKeys}\n facetSettings={facetSettings}\n chartSizes={this.chartSizes}\n chartsDimensions={this.chartsDimensions}\n scales={this.scales}\n groupedDots={groupedDots}\n trendsData={trendsData}\n legendData={this.legend}\n columnsCount={this.columnsCount}\n margins={this.margins}\n keyColumn={keyColumn}\n mainTitle={this.mainTitle}\n facetTitles={this.facetTitles}\n captionsSizes={this.captionsSizes}\n onlyPositive={onlyPositive}\n layersData={layersData}\n aesGetters={createAesGetters(dataFrame, legendInfo, layers, trend)}\n onTooltipHintSwitch={onTooltipHintSwitch}\n discreteAxesLabels={this.discreteAxesLabels}\n />\n </DataFrameProvider>\n );\n this.component = component;\n this.reactRoot?.render(component);\n }\n\n renderError(message: string) {\n this.reactRoot?.render(<Error message={message} />);\n }\n}\n\nexport default ChartRenderer;\n"],"names":["scalesAreDifferent","prevScale","currentScale","domain","range","newDomain","newRange","v","idx","getChartEdgeSides","index","facetsCount","columnsCount","rowsCount","chartSides","calculatePaddings","xAxis","yAxis","captionsSizes","currentRowFacetKeys","facetTitles","chartEdgeSides","currentRow","currentColumn","lastInRow","facetSettings","discreteX","discreteY","needLeftAxis","needLeftAxisTitle","needBottomAxis","needBottomAxisTitle","yCaptions","TICK_OFFSET","yTicks","DEFAULT_TICKS_SIZE","yAxisTitle","TITLE_LINE","MIN_PADDING","xCaptions","xTicks","xAxisTitle","leftAxisElements","FACET_AXIS_OFFSET","bottomAxisElements","facetTitlesLinesCount","key","FACET_TITLE_OFFSET","FACET_TITLE_LINE","getFacetRows","facetKeys","nRows","nColumns","result","i","getRowColumn","row","column","createAesGetters","dataFrame","legendInfo","layers","trend","dotLayer","l","curveLayer","createAesGetter","DEFAULT_DOT_AES","BLACK","COS_PI_4","INCLINE_OFFSET","getCaptionHeight","size","axis","ChartRenderer","__publicField","jsx","Fragment","MIN_MARGIN","DEFAULT_WIDTH","DEFAULT_HEIGHT","scaleLinear","_a","node","createRoot","chartWidth","chartHeight","currentLeft","currentTop","facetRows","res","padding","outerWidth","outerHeight","chartsWidth","chartsHeight","discreteAxisDataX","discreteAxisDataY","groupedDots","trendsData","facetCount","maxNRows","maxNCols","minXAll","maxXAll","minYAll","maxYAll","dotExtentsByKeys","dotsData","minX","minY","maxX","maxY","newScalesX","newScalesY","needsUpdateXScales","needsUpdateYScales","scaleX","isContinuousAxis","scalePoint","scaleLog","extents","middle","halfRange","rangeH","tempX","PADDINGS","trendYBoundsByKeys","trendsList","xBounds","i1","i2","scaleY","dotExtents","trendExtents","rangeV","tempY","onlyPositive","textMeasurer","TextMeasurer","getMaxTickWidth","ticks","xTail","yTail","xAxisCaptionsWidthByRows","yAxisCaptionsWidthByColumns","maxXLabelSize","maxYLabelSize","sizes","measureMultilineDiscreteLabels","scale","format","getTicksAndFormat","title","firstChart","lastChart","splitTextByWidth","facetLabels","createMultilineDiscreteLabels","titleTextHeight","TITLE_LINE_HEIGHT","titleHeight","TITLE_MARGIN","legend","grouping","legendItems","emptySizes","continuousHeight","MIN_LEGEND_GRADIENT_HEIGHT","MAX_LEGEND_GRADIENT_HEIGHT","legendHeight","info","MAX_SHOWN_UNIQUE_VALUES_IN_LABELS","aesData","columnValue","scaleOrdinal","value","layer","isContinuousAes","columnName","type","colorScale","getContinuousColorScale","tickPositionScale","scaleSymlog","values","getContinuousLegendTicks","scaleSqrt","labels","items","arrangeLegendParts","lastItem","legendWidth","LEGEND_OFFSET","settingsId","chartSettings","keyColumn","layersData","onTooltipHintSwitch","component","DataFrameProvider","ChartsGroup","message","Error"],"mappings":"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"}
1
+ {"version":3,"file":"ChartRenderer.js","sources":["../../src/scatterplot/ChartRenderer.tsx"],"sourcesContent":["import type { ScaleLinear } from 'd3-scale';\nimport { scaleLinear, scaleLog, scaleOrdinal, scalePoint, scaleSqrt, scaleSymlog } from 'd3-scale';\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 { DataFrameProvider } from '../common/useDataFrame';\nimport {\n BLACK,\n DEFAULT_HEIGHT,\n DEFAULT_WIDTH,\n MAX_LEGEND_GRADIENT_HEIGHT,\n MAX_SHOWN_UNIQUE_VALUES_IN_LABELS,\n MIN_LEGEND_GRADIENT_HEIGHT,\n TITLE_LINE_HEIGHT,\n TITLE_MARGIN,\n} from '../constants';\nimport type { DataFrame } from '../DataFrame';\nimport { FACET_TITLE_LINE } from '../discrete/constants';\nimport { splitTextByWidth } from '../discrete/utils';\nimport type { AxisSettingsDiscrete, ColumnName, PointShape, ScatterplotLegendInfo } from '../types';\nimport { isContinuousAes } from '../types';\nimport { arrangeLegendParts } from '../utils/arrangeLegendParts';\nimport { getContinuousColorScale } from '../utils/getContinuousColorScale';\nimport { getContinuousLegendTicks } from '../utils/getContinuousLegendTicks';\nimport { TextMeasurer } from '../utils/TextMeasurer/TextMeasurer';\nimport { ChartsGroup } from './components/ChartsGroup';\nimport type { AesGetters, CaptionsSizes, ChartDimensionsData, ChartScales, ChartSizes, ChartsScales, DiscreteAxisData, DiscreteScale, Margins } from './components/types';\nimport {\n DEFAULT_DOT_AES,\n DEFAULT_TICKS_SIZE,\n FACET_AXIS_OFFSET,\n FACET_TITLE_OFFSET,\n LEGEND_OFFSET,\n MIN_MARGIN,\n MIN_PADDING,\n PADDINGS,\n TICK_OFFSET,\n TITLE_LINE,\n} from './constants';\nimport type { GroupedDots } from './dots';\nimport type { ScatterplotLayerData } from './getLayersData';\nimport type { TrendsData } from './linearRegression';\nimport type { CurveLayer, DotsLayer, ScatterplotLayer, ScatterplotSettingsImpl } from './ScatterplotSettingsImpl';\nimport { createAesGetter } from './utils/createAesGetter';\nimport { getTicksAndFormat } from './utils/getTicksAndFormat';\nimport { isContinuousAxis } from './utils/isNumericScale';\nimport { createMultilineDiscreteLabels } from '../utils/createMultilineDiscreteLabels';\nimport { measureMultilineDiscreteLabels } from '../utils/measureMultilineDiscreteLabels';\n\nfunction scalesAreDifferent(prevScale:ChartScales['x'|'y'], currentScale:ChartScales['x'|'y']):boolean {\n if (prevScale === undefined) {\n return true;\n } else {\n const domain = prevScale.domain();\n const range = prevScale.range();\n const newDomain = currentScale.domain();\n const newRange = currentScale.range();\n if (\n domain.length !== newDomain.length ||\n domain.some((v, idx) => v !== newDomain[idx]) ||\n range[0] !== newRange[0] || range[1] !== newRange[1]\n ) {\n return true;\n }\n }\n return false;\n}\nfunction getChartEdgeSides(index: number, facetsCount: number, columnsCount: number, rowsCount: number) {\n const chartSides: ('left' | 'right' | 'top' | 'bottom')[] = [];\n if (index % columnsCount === columnsCount - 1) {\n chartSides.push('right');\n }\n if (index % columnsCount === 0) {\n chartSides.push('left');\n }\n if (index < columnsCount) {\n chartSides.push('top');\n }\n if (\n Math.ceil((index + 1) / columnsCount) === rowsCount ||\n (Math.ceil((index + 1) / columnsCount) === rowsCount - 1 &&\n index % columnsCount > (facetsCount - 1) % columnsCount)\n ) {\n chartSides.push('bottom');\n }\n return chartSides;\n}\n\nfunction calculatePaddings(\n xAxis: ScatterplotSettingsImpl['chartSettings']['xAxis'],\n yAxis: ScatterplotSettingsImpl['chartSettings']['yAxis'],\n captionsSizes: CaptionsSizes,\n currentRowFacetKeys: string[],\n facetTitles: Record<string, string[]>,\n chartEdgeSides: ('left' | 'right' | 'top' | 'bottom')[],\n currentRow: number,\n currentColumn: number,\n lastInRow: boolean,\n facetSettings?: ScatterplotSettingsImpl['facetSettings'],\n) {\n const discreteX = xAxis.scale === 'discrete';\n const discreteY = yAxis.scale === 'discrete';\n\n const needLeftAxis = chartEdgeSides.includes('left') || !facetSettings?.sharedY;\n const needLeftAxisTitle = chartEdgeSides.includes('left') && yAxis.title !== '';\n const needBottomAxis = chartEdgeSides.includes('bottom') || !facetSettings?.sharedX;\n const needBottomAxisTitle = chartEdgeSides.includes('bottom') && xAxis.title !== '';\n\n const yCaptions = yAxis.hiddenLabels ? 0 : discreteY ? captionsSizes.leftAxisCaptionsWidthByColumns[currentColumn] + 2 * TICK_OFFSET : captionsSizes.yAxisCaptionsWidth + 2 * TICK_OFFSET;\n const yTicks = (yAxis.showTicks ? DEFAULT_TICKS_SIZE : 0) + TICK_OFFSET;\n const yAxisTitle = needLeftAxisTitle ? TITLE_LINE : 0;\n\n const xCaptions = xAxis.hiddenLabels ? 0 : discreteX ? captionsSizes.bottomAxisCaptionsWidthByRows[currentRow] + 2 * TICK_OFFSET: captionsSizes.xAxisCaptionsWidth + 2 * TICK_OFFSET;\n const xTicks = xAxis.showTicks ? DEFAULT_TICKS_SIZE : 0;\n const xAxisTitle = needBottomAxisTitle ? TITLE_LINE : 0;\n\n const leftAxisElements = yCaptions + yTicks + yAxisTitle + FACET_AXIS_OFFSET;\n const bottomAxisElements = xCaptions + xTicks + xAxisTitle + FACET_AXIS_OFFSET;\n\n const facetTitlesLinesCount = Math.max(...currentRowFacetKeys.map(key => facetTitles[key].length));\n return {\n left: needLeftAxis ? leftAxisElements : MIN_PADDING,\n top: facetTitlesLinesCount === 0 ? 0 : FACET_TITLE_OFFSET * 2 + facetTitlesLinesCount * FACET_TITLE_LINE,\n bottom: needBottomAxis ? bottomAxisElements + 8 : MIN_PADDING,\n right: lastInRow ? 0 : MIN_PADDING,\n };\n}\n\n// facet keys grouped by rows\nfunction getFacetRows(facetKeys: string[], nRows: number, nColumns: number): string[][] {\n const result: string[][] = [];\n for (let i = 0; i < nRows; i++) {\n result.push(facetKeys.slice(i * nColumns, i * nColumns + nColumns));\n }\n return result;\n}\n\nfunction getRowColumn(idx: number, columnsCount: number) {\n const row = Math.floor(idx / columnsCount);\n const column = idx - row * columnsCount;\n return [row, column];\n}\n\nfunction createAesGetters(\n dataFrame: DataFrame,\n legendInfo: ScatterplotLegendInfo,\n layers: ScatterplotLayer[],\n trend: ScatterplotSettingsImpl['trend']\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\n return {\n dotShape: createAesGetter(dataFrame, legendInfo, dotLayer?.aes.dotShape ?? DEFAULT_DOT_AES.shape,'dotShape'),\n dotColor: 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 lineShape: createAesGetter(dataFrame, legendInfo, curveLayer?.aes.lineShape ?? 'solid', 'lineShape'),\n lineColor: createAesGetter(dataFrame, legendInfo, curveLayer?.aes.lineColor ?? BLACK, 'lineColor'),\n trendColor: createAesGetter(dataFrame, legendInfo, trend?.color ?? DEFAULT_DOT_AES.color, 'fillColor')\n };\n}\n\nconst COS_PI_4 = Math.cos(Math.PI / 4);\nconst INCLINE_OFFSET = 5; // height of little triangle of text for captions inclined 45deg\n\nfunction getCaptionHeight (size: number, axis: ScatterplotSettingsImpl['chartSettings']['xAxis' | 'yAxis']) {\n if (axis.scale === 'discrete') {\n if (axis.labelsPosition === '90deg') {\n return size;\n }\n if (axis.labelsPosition === '45deg') {\n return size * COS_PI_4 + (size > 0 ? 2 * INCLINE_OFFSET : 0) ;\n }\n return TITLE_LINE;\n }\n return Math.max(size, TITLE_LINE);\n}\n\nclass ChartRenderer {\n reactRoot: Root | null = null;\n parentNode: HTMLElement | null = null;\n rootNode: HTMLElement | null = null;\n component: ReactElement = (<></>);\n margins: Margins = {\n top: MIN_MARGIN,\n bottom: MIN_MARGIN,\n left: MIN_MARGIN,\n right: MIN_MARGIN,\n };\n chartsDimensions: Record<string, ChartDimensionsData> = {};\n chartSizes: ChartSizes = {\n chartWidth: DEFAULT_WIDTH, // width of single chart\n chartHeight: DEFAULT_HEIGHT, // height of single chart\n chartsWidth: DEFAULT_WIDTH, // width of all charts in charts row\n chartsHeight: DEFAULT_HEIGHT, // width of all charts in charts column, without axes\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 columnsCount = 1;\n rowsCount = 1;\n scales: ChartsScales = {\n x: {null: scaleLinear().domain([0, 1]).range([0, DEFAULT_WIDTH])},\n y: {null: scaleLinear().domain([0, 1]).range([DEFAULT_HEIGHT, 0])},\n };\n captionsSizes: CaptionsSizes = {\n xAxisCaptionsWidth: 30,\n yAxisCaptionsWidth: 100,\n bottomAxisCaptionsWidthByRows: [],\n leftAxisCaptionsWidthByColumns: [],\n bottomCaptionsTail: 0,\n leftCaptionsTail: 0,\n };\n facetTitles: Record<string, string[]> = {}; // can be multiline\n mainTitle: string[] = []; // can be multiline\n discreteAxesLabels: {\n x: Record<string, Record<string, string[]>>,\n y: Record<string, Record<string, string[]>>\n } = {x: {}, y: {}}; // only for discrete axes, by facets, can be multiline\n\n legend: LegendData = {width: 0, height: 0, items: []};\n\n clear() {\n if (this.parentNode && this.rootNode) {\n this.parentNode?.removeChild(this.rootNode);\n this.parentNode = null;\n this.rootNode = 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.parentNode.appendChild(this.rootNode);\n this.reactRoot = createRoot(this.rootNode);\n }\n }\n\n updateChartSizes(size: ScatterplotSettingsImpl['chartSettings']['size']) {\n this.chartSizes.chartWidth = size.width;\n this.chartSizes.chartHeight = size.height;\n }\n\n updateChartDimensions(\n facetKeys: string[],\n facetSettings: ScatterplotSettingsImpl['facetSettings'],\n xAxis: ScatterplotSettingsImpl['chartSettings']['xAxis'],\n yAxis: ScatterplotSettingsImpl['chartSettings']['yAxis']\n ) {\n const {chartWidth, chartHeight} = this.chartSizes;\n let currentLeft = 0;\n let currentTop = 0;\n const facetRows = getFacetRows(facetKeys, this.rowsCount, this.columnsCount);\n this.chartsDimensions = facetKeys.reduce((res: Record<string, ChartDimensionsData>, key: string, index) => {\n const [currentRow, currentColumn] = getRowColumn(index, this.columnsCount);\n const chartEdgeSides = getChartEdgeSides(index, facetKeys.length, this.columnsCount, this.rowsCount);\n const padding = calculatePaddings(\n xAxis,\n yAxis,\n this.captionsSizes,\n facetRows[currentRow],\n this.facetTitles,\n chartEdgeSides,\n currentRow,\n currentColumn,\n currentColumn === this.columnsCount - 1,\n facetSettings\n );\n\n const outerWidth = chartWidth + padding.left + padding.right;\n const outerHeight = chartHeight + padding.top + padding.bottom;\n res[key] = {\n left: currentLeft,\n top: currentTop,\n chartEdgeSides,\n padding,\n inner: {width: chartWidth, height: chartHeight},\n outer: {width: outerWidth, height: outerHeight},\n };\n currentLeft += outerWidth;\n if (currentColumn === this.columnsCount - 1) {\n currentLeft = 0;\n currentTop += outerHeight;\n }\n return res;\n }, {});\n\n const chartsWidth = Math.max(\n ...facetKeys.map(key => this.chartsDimensions[key].outer.width + this.chartsDimensions[key].left)\n );\n const chartsHeight = Math.max(\n ...facetKeys.map(key => this.chartsDimensions[key].outer.height + this.chartsDimensions[key].top)\n );\n this.chartSizes.chartsWidth = chartsWidth;\n this.chartSizes.chartsHeight = chartsHeight;\n }\n\n updateViewport(\n facetKeys: string[],\n facetSettings: ScatterplotSettingsImpl['facetSettings'],\n xAxis: ScatterplotSettingsImpl['chartSettings']['xAxis'],\n yAxis: ScatterplotSettingsImpl['chartSettings']['yAxis'],\n discreteAxisDataX: DiscreteAxisData,\n discreteAxisDataY: DiscreteAxisData,\n groupedDots: GroupedDots,\n trendsData: TrendsData | null\n ) {\n const facetCount = facetKeys.length;\n const maxNRows = Math.min(facetSettings.nRows ?? facetCount, facetCount);\n const maxNCols = Math.min(facetSettings.nCols ?? facetCount, facetCount);\n // Use columns/rows count from settings if some of them defined, else make 1 column\n this.columnsCount = facetSettings.nRows ? Math.ceil(facetCount / maxNRows) : maxNCols;\n this.rowsCount = Math.ceil(facetCount / this.columnsCount);\n\n let [minXAll, maxXAll] = [Infinity, -Infinity];\n let [minYAll, maxYAll] = [Infinity, -Infinity];\n const dotExtentsByKeys = facetKeys.reduce((res: Record<string, Record<string, number>>, key) => {\n const dotsData = groupedDots[key];\n const {minX, minY, maxX, maxY} = dotsData;\n minXAll = Math.min(minXAll, minX);\n minYAll = Math.min(minYAll, minY);\n maxXAll = Math.max(maxXAll, maxX);\n maxYAll = Math.max(maxYAll, maxY);\n res[key] = {minX, maxX, minY, maxY};\n return res;\n }, {});\n\n const newScalesX:ChartsScales['x'] = {};\n const newScalesY:ChartsScales['y'] = {};\n\n let needsUpdateXScales = false;\n let needsUpdateYScales = false;\n facetKeys.forEach(key => {\n let scaleX: ChartsScales['x'][string];\n if (!isContinuousAxis(xAxis)) {\n scaleX = scalePoint<string | number>()\n .range([0, this.chartSizes.chartWidth])\n .domain(discreteAxisDataX.keys ?? []).padding(0.5);\n\n } else {\n scaleX = xAxis.scale === 'log' ? scaleLog() : scaleLinear();\n const extents = dotExtentsByKeys[key];\n let minX = xAxis.lowerValue ? Number(xAxis.lowerValue) : facetSettings.sharedX ? minXAll : extents.minX;\n let maxX = xAxis.upperValue ? Number(xAxis.upperValue) : facetSettings.sharedX ? maxXAll : extents.maxX;\n\n if (typeof 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\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\n }\n const prevScale = this.scales.x[key];\n newScalesX[key] = scaleX;\n needsUpdateXScales = needsUpdateXScales || scalesAreDifferent(prevScale, scaleX);\n });\n // for right Y viewport bounds we must know X bounds, to calculate trends area Y bounds\n const trendYBoundsByKeys = facetKeys.reduce((res: Record<string, Record<string, number>>, key) => {\n const trendsList = trendsData ? trendsData[key] : [];\n res[key] = trendsList.reduce(\n (res, trend) => {\n const xBounds = trend.bounded ? trend.xBounds : this.scales.x[key].domain(); // trends exist only with continuous scales\n const i1 = trend.getInterval(xBounds[0] as number);\n const i2 = trend.getInterval(xBounds[1] as number);\n res.minY = Math.min(res.minY, isNaN(i1.left) ? res.minY : i1.left, isNaN(i2.left) ? res.minY : i2.left);\n res.maxY = Math.max(res.maxY, isNaN(i1.right) ? res.maxY : i1.right, isNaN(i2.right) ? res.maxY : i2.right);\n return res;\n },\n {minY: Infinity, maxY: -Infinity}\n );\n minYAll = Math.min(minYAll, res[key].minY);\n maxYAll = Math.max(maxYAll, res[key].maxY);\n return res;\n }, {});\n facetKeys.forEach(key => {\n let scaleY: ChartsScales['y'][string];\n if (!isContinuousAxis(yAxis)) {\n scaleY = scalePoint<string | number>()\n .range([this.chartSizes.chartHeight, 0])\n .domain(discreteAxisDataY.keys ?? [])\n .padding(0.5);\n } else {\n scaleY = yAxis.scale === 'log' ? scaleLog() : scaleLinear();\n\n const dotExtents = dotExtentsByKeys[key];\n const trendExtents = trendYBoundsByKeys[key];\n let minY = yAxis.lowerValue ? Number(yAxis.lowerValue) : facetSettings.sharedY ? minYAll : Math.min(dotExtents.minY, trendExtents.minY);\n let maxY = yAxis.upperValue ? Number(yAxis.upperValue) : facetSettings.sharedY ? maxYAll : Math.max(dotExtents.maxY, trendExtents.maxY);\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 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 }\n const prevScale = this.scales.y[key];\n newScalesY[key] = scaleY;\n needsUpdateYScales = needsUpdateYScales || scalesAreDifferent(prevScale, scaleY);\n });\n\n if (needsUpdateXScales) {\n this.scales.x = newScalesX;\n }\n if (needsUpdateYScales) {\n this.scales.y = newScalesY;\n }\n }\n\n updateCaptionsSize(\n facetKeys: string[],\n xAxis: ScatterplotSettingsImpl['chartSettings']['xAxis'],\n yAxis: ScatterplotSettingsImpl['chartSettings']['yAxis'],\n onlyPositive: boolean\n ) {\n const textMeasurer = new TextMeasurer('600 14px Manrope');\n function getMaxTickWidth(ticks: string[]) {\n return Math.max(...ticks.map(key => textMeasurer.getTextWidth(key)));\n }\n\n let xTail = 0;\n let yTail = 0;\n let xAxisCaptionsWidthByRows:number[] = [];\n let yAxisCaptionsWidthByColumns:number[] = [];\n let maxXLabelSize = 0;\n let maxYLabelSize = 0;\n if (xAxis.scale === 'discrete') {\n const sizes = measureMultilineDiscreteLabels(\n facetKeys,\n this.rowsCount,\n this.columnsCount,\n xAxis.labelsPosition ?? 'center',\n this.discreteAxesLabels.x,\n 'vertical',\n this.scales.x as Record<string, DiscreteScale>,\n );\n xTail = sizes.xTail;\n xAxisCaptionsWidthByRows = sizes.axisCaptionsWidthByRows;\n } else {\n maxXLabelSize = 20;\n }\n\n if (yAxis.scale === 'discrete') {\n const sizes = measureMultilineDiscreteLabels(\n facetKeys,\n this.rowsCount,\n this.columnsCount,\n yAxis.labelsPosition ?? 'center',\n this.discreteAxesLabels.y,\n 'horizontal',\n this.scales.y as Record<string, DiscreteScale>,\n );\n yTail = sizes.yTail;\n yAxisCaptionsWidthByColumns = sizes.axisCaptionsWidthByColumns;\n } else {\n Object.values(this.scales.y).forEach(scale => {\n const {ticks, format} = getTicksAndFormat(scale, onlyPositive);\n maxYLabelSize = Math.max(maxYLabelSize, getMaxTickWidth(ticks.map(format)));\n });\n }\n\n this.captionsSizes = {\n xAxisCaptionsWidth: xAxis.hiddenLabels ? 0 : getCaptionHeight(maxXLabelSize, xAxis),\n yAxisCaptionsWidth: yAxis.hiddenLabels ? 0 : getCaptionHeight(maxYLabelSize, yAxis),\n bottomAxisCaptionsWidthByRows: xAxisCaptionsWidthByRows,\n leftAxisCaptionsWidthByColumns: yAxisCaptionsWidthByColumns,\n bottomCaptionsTail: xTail,\n leftCaptionsTail: yTail\n };\n }\n\n createMainTitle(facetKeys: string[], title: ScatterplotSettingsImpl['chartSettings']['title']) {\n const firstChart = this.chartsDimensions[facetKeys[0]];\n const lastChart = this.chartsDimensions[facetKeys[facetKeys.length - 1]];\n\n this.mainTitle = splitTextByWidth(\n title.name,\n this.chartSizes.chartsWidth - firstChart.padding.left - lastChart.padding.right,\n 20\n );\n }\n\n createFacetTitles(facetKeys: string[], facetLabels: string[][]) {\n this.facetTitles = facetKeys.reduce((res: Record<string, string[]>, key, idx) => {\n if (facetLabels[idx].length === 1 && facetLabels[idx][0] === 'null') {\n res[key] = [];\n } else {\n res[key] = splitTextByWidth(facetLabels[idx].join(', '), this.chartSizes.chartWidth, 14);\n }\n return res;\n }, {});\n }\n\n createAxisLabels(\n facetKeys: string[],\n xAxis: ScatterplotSettingsImpl['chartSettings']['xAxis'],\n yAxis: ScatterplotSettingsImpl['chartSettings']['xAxis'],\n discreteAxisDataX: DiscreteAxisData,\n discreteAxisDataY: DiscreteAxisData,\n ) {\n this.discreteAxesLabels = {\n x: xAxis.scale !== 'discrete' ? {} : createMultilineDiscreteLabels(\n facetKeys,\n (xAxis as AxisSettingsDiscrete)?.labelsPosition ?? 'center',\n discreteAxisDataX.labels,\n false,\n 'vertical',\n this.scales.x as Record<string, DiscreteScale>,\n ),\n y: yAxis.scale !== 'discrete' ? {} : createMultilineDiscreteLabels(\n facetKeys,\n (yAxis as AxisSettingsDiscrete).labelsPosition ?? 'center',\n discreteAxisDataY.labels,\n false,\n 'horizontal',\n this.scales.y as Record<string, DiscreteScale>,\n )\n };\n }\n\n updateMargins(facetKeys: string[]) {\n const titleTextHeight = TITLE_LINE_HEIGHT * this.mainTitle.length;\n const titleHeight = titleTextHeight > 0 ? titleTextHeight + TITLE_MARGIN * 2 : 0;\n const firstChart = this.chartsDimensions[facetKeys[0]];\n const lastChart = this.chartsDimensions[facetKeys[facetKeys.length - 1]];\n this.margins = {\n top: Math.max(titleHeight, MIN_MARGIN),\n bottom: Math.max(MIN_MARGIN, this.captionsSizes.leftCaptionsTail - lastChart.padding.bottom),\n left: Math.max(MIN_MARGIN, this.captionsSizes.bottomCaptionsTail - firstChart.padding.left),\n right: this.legend.width + MIN_MARGIN,\n }; \n this.chartSizes.totalWidth = this.margins.left + this.chartSizes.chartsWidth + this.margins.right;\n this.chartSizes.totalHeight =\n this.margins.top + Math.max(this.chartSizes.chartsHeight, this.legend.height) + this.margins.bottom;\n }\n\n updateLegendSize(\n legend: ScatterplotSettingsImpl['chartSettings']['legend'],\n legendInfo: ScatterplotLegendInfo,\n grouping: ColumnName[],\n layers: ScatterplotLayer[]\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 const continuousHeight = Math.min(\n Math.max(this.chartSizes.chartHeight, MIN_LEGEND_GRADIENT_HEIGHT),\n MAX_LEGEND_GRADIENT_HEIGHT\n );\n const legendHeight = Math.max(this.chartSizes.chartHeight, continuousHeight);\n grouping.forEach(column => {\n const info = legendInfo[column.value];\n if (info.usedAes.length === 0 || !info.aesMap) {\n return;\n }\n if (info.values.length > MAX_SHOWN_UNIQUE_VALUES_IN_LABELS) {\n console.warn(`Too many values for discrete legend (${info.values.length})`);\n return;\n }\n const aesData: Record<string, DotAesItem> = {};\n info.values.forEach(columnValue => {\n if (!aesData[columnValue]) {\n aesData[columnValue] = {...DEFAULT_DOT_AES} as DotAesItem;\n }\n info.usedAes.forEach(key => {\n if (key === 'dotFill' || key === 'lineColor') {\n aesData[columnValue].color = (info.aesMap(columnValue, key) ?? BLACK) as string;\n }\n if (key === 'dotShape') {\n aesData[columnValue].shape = (info.aesMap(columnValue,key) ?? '21') as PointShape;\n }\n if (key === 'dotSize') {\n aesData[columnValue].size = (info.aesMap(columnValue,key) ?? 3) as number;\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 .unknown(DEFAULT_DOT_AES);\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([continuousHeight, 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, legendHeight, continuousHeight);\n\n const lastItem = items[items.length - 1];\n const legendWidth = lastItem.left + lastItem.width + LEGEND_OFFSET;\n\n this.legend = {\n width: legendWidth,\n height: legendHeight,\n items,\n };\n }\n\n render(\n dataFrame: DataFrame,\n settingsId: string,\n chartSettings: ScatterplotSettingsImpl['chartSettings'],\n facetSettings: ScatterplotSettingsImpl['facetSettings'],\n facetKeys: string[],\n facetLabels: string[][],\n groupedDots: GroupedDots,\n trendsData: TrendsData | null,\n keyColumn: ColumnName,\n onlyPositive: {x: boolean; y: boolean},\n legendInfo: ScatterplotLegendInfo,\n layersData: Record<string, ScatterplotLayerData[]>,\n grouping: ColumnName[],\n layers: ScatterplotLayer[],\n trend: ScatterplotSettingsImpl['trend'],\n discreteAxisDataX: DiscreteAxisData,\n discreteAxisDataY: DiscreteAxisData,\n onTooltipHintSwitch: (v:boolean) => void\n ) {\n const {xAxis, yAxis, size, title, legend} = chartSettings;\n this.updateChartSizes(size);\n this.updateViewport(facetKeys, facetSettings, xAxis, yAxis, discreteAxisDataX, discreteAxisDataY, groupedDots, trendsData);\n this.createAxisLabels(facetKeys, xAxis, yAxis, discreteAxisDataX, discreteAxisDataY);\n this.updateCaptionsSize(facetKeys, xAxis, yAxis, onlyPositive.y);\n this.createFacetTitles(facetKeys, facetLabels);\n this.updateChartDimensions(facetKeys, facetSettings, xAxis, yAxis);\n this.updateLegendSize(legend, legendInfo, grouping, layers);\n this.createMainTitle(facetKeys, title);\n this.updateMargins(facetKeys);\n const component = (\n <DataFrameProvider dataFrame={dataFrame}>\n <ChartsGroup\n settingsId={settingsId}\n chartSettings={chartSettings}\n facetKeys={facetKeys}\n facetSettings={facetSettings}\n chartSizes={this.chartSizes}\n chartsDimensions={this.chartsDimensions}\n scales={this.scales}\n groupedDots={groupedDots}\n trendsData={trendsData}\n legendData={this.legend}\n columnsCount={this.columnsCount}\n margins={this.margins}\n keyColumn={keyColumn}\n mainTitle={this.mainTitle}\n facetTitles={this.facetTitles}\n captionsSizes={this.captionsSizes}\n onlyPositive={onlyPositive}\n layersData={layersData}\n aesGetters={createAesGetters(dataFrame, legendInfo, layers, trend)}\n onTooltipHintSwitch={onTooltipHintSwitch}\n discreteAxesLabels={this.discreteAxesLabels}\n />\n </DataFrameProvider>\n );\n this.component = component;\n this.reactRoot?.render(component);\n }\n\n renderError(message: string) {\n this.reactRoot?.render(<Error message={message} />);\n }\n}\n\nexport default ChartRenderer;\n"],"names":["scalesAreDifferent","prevScale","currentScale","domain","range","newDomain","newRange","v","idx","getChartEdgeSides","index","facetsCount","columnsCount","rowsCount","chartSides","calculatePaddings","xAxis","yAxis","captionsSizes","currentRowFacetKeys","facetTitles","chartEdgeSides","currentRow","currentColumn","lastInRow","facetSettings","discreteX","discreteY","needLeftAxis","needLeftAxisTitle","needBottomAxis","needBottomAxisTitle","yCaptions","TICK_OFFSET","yTicks","DEFAULT_TICKS_SIZE","yAxisTitle","TITLE_LINE","xCaptions","xTicks","xAxisTitle","leftAxisElements","FACET_AXIS_OFFSET","bottomAxisElements","facetTitlesLinesCount","key","MIN_PADDING","FACET_TITLE_OFFSET","FACET_TITLE_LINE","getFacetRows","facetKeys","nRows","nColumns","result","i","getRowColumn","row","column","createAesGetters","dataFrame","legendInfo","layers","trend","dotLayer","l","curveLayer","createAesGetter","DEFAULT_DOT_AES","BLACK","COS_PI_4","INCLINE_OFFSET","getCaptionHeight","size","axis","ChartRenderer","__publicField","jsx","Fragment","MIN_MARGIN","DEFAULT_WIDTH","DEFAULT_HEIGHT","scaleLinear","_a","node","createRoot","chartWidth","chartHeight","currentLeft","currentTop","facetRows","res","padding","outerWidth","outerHeight","chartsWidth","chartsHeight","discreteAxisDataX","discreteAxisDataY","groupedDots","trendsData","facetCount","maxNRows","maxNCols","minXAll","maxXAll","minYAll","maxYAll","dotExtentsByKeys","dotsData","minX","minY","maxX","maxY","newScalesX","newScalesY","needsUpdateXScales","needsUpdateYScales","scaleX","isContinuousAxis","scalePoint","scaleLog","extents","middle","halfRange","rangeH","tempX","PADDINGS","trendYBoundsByKeys","trendsList","xBounds","i1","i2","scaleY","dotExtents","trendExtents","rangeV","tempY","onlyPositive","textMeasurer","TextMeasurer","getMaxTickWidth","ticks","xTail","yTail","xAxisCaptionsWidthByRows","yAxisCaptionsWidthByColumns","maxXLabelSize","maxYLabelSize","sizes","measureMultilineDiscreteLabels","scale","format","getTicksAndFormat","title","firstChart","lastChart","splitTextByWidth","facetLabels","createMultilineDiscreteLabels","titleTextHeight","TITLE_LINE_HEIGHT","titleHeight","TITLE_MARGIN","legend","grouping","legendItems","emptySizes","continuousHeight","MIN_LEGEND_GRADIENT_HEIGHT","MAX_LEGEND_GRADIENT_HEIGHT","legendHeight","info","MAX_SHOWN_UNIQUE_VALUES_IN_LABELS","aesData","columnValue","scaleOrdinal","value","layer","isContinuousAes","columnName","type","colorScale","getContinuousColorScale","tickPositionScale","scaleSymlog","values","getContinuousLegendTicks","scaleSqrt","labels","items","arrangeLegendParts","lastItem","legendWidth","LEGEND_OFFSET","settingsId","chartSettings","keyColumn","layersData","onTooltipHintSwitch","component","DataFrameProvider","ChartsGroup","message","Error"],"mappings":"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"}
@@ -1,48 +1,48 @@
1
1
  import { j as o } from "../../_virtual/jsx-runtime.js";
2
- import { r as A } from "../../_virtual/index.js";
3
- import { DEFAULT_TICKS_SIZE as a, TITLE_LINE as C, TICK_OFFSET as h } from "../constants.js";
4
- import { ContinuousAxis as k } from "../../common/ContinuousAxis.js";
5
- import { BandAxis as j } from "../../common/BandAxis.js";
6
- import { isNumericScale as b } from "../utils/isNumericScale.js";
7
- const _ = A.memo(({
8
- debug: t,
9
- width: p,
10
- height: e,
11
- dimensions: l,
2
+ import { r as y } from "../../_virtual/index.js";
3
+ import { DEFAULT_TICKS_SIZE as b, TITLE_LINE as C, TICK_OFFSET as x } from "../constants.js";
4
+ import { ContinuousAxis as c } from "../../common/ContinuousAxis.js";
5
+ import { BandAxis as k } from "../../common/BandAxis.js";
6
+ import { isNumericScale as L } from "../utils/isNumericScale.js";
7
+ const w = y.memo(({
8
+ debug: d,
9
+ width: j,
10
+ height: n,
11
+ dimensions: a,
12
12
  scales: i,
13
- xAxis: x,
14
- yAxis: n,
15
- facetSettings: r,
16
- captionsSizes: m,
17
- discreteLabelsX: E,
18
- discreteLabelsY: T,
19
- onlyPositive: c
13
+ xAxis: s,
14
+ yAxis: r,
15
+ facetSettings: e,
16
+ captionsSizes: h,
17
+ discreteLabelsX: p,
18
+ discreteLabelsY: E,
19
+ onlyPositive: m
20
20
  }) => {
21
- const s = x.showTicks ? a : 0, d = n.showTicks ? a : 0, y = l.chartEdgeSides.includes("left") || !(r != null && r.sharedY), u = l.chartEdgeSides.includes("bottom") || !(r != null && r.sharedX);
21
+ const l = s.showTicks ? b : 0, t = r.showTicks ? b : 0, T = a.chartEdgeSides.includes("left") || !(e != null && e.sharedY), u = a.chartEdgeSides.includes("bottom") || !(e != null && e.sharedX);
22
22
  return /* @__PURE__ */ o.jsxs(o.Fragment, { children: [
23
- u && /* @__PURE__ */ o.jsxs("g", { transform: `translate(0,${e})`, children: [
24
- b(i.x) ? /* @__PURE__ */ o.jsx(k, { scale: i.x, orient: "bottom", tickSize: s, onlyPositive: c.x }) : /* @__PURE__ */ o.jsx(j, { scale: i.x, orient: "bottom", labels: E, labelsPosition: x.labelsPosition, tickSize: s }),
25
- t && /* @__PURE__ */ o.jsx(
23
+ u && /* @__PURE__ */ o.jsxs("g", { transform: `translate(0,${n})`, children: [
24
+ L(i.x) ? /* @__PURE__ */ o.jsx(c, { scale: i.x, orient: "bottom", tickSize: l, onlyPositive: m.x, hiddenLabels: s.hiddenLabels }) : /* @__PURE__ */ o.jsx(k, { scale: i.x, orient: "bottom", labels: p, labelsPosition: s.labelsPosition, tickSize: l, hiddenLabels: s.hiddenLabels }),
25
+ d && /* @__PURE__ */ o.jsx(
26
26
  "rect",
27
27
  {
28
28
  x: "0",
29
- y: s + h,
30
- width: p,
29
+ y: l + x,
30
+ width: j,
31
31
  height: C,
32
32
  fill: "none",
33
33
  stroke: "black"
34
34
  }
35
35
  )
36
36
  ] }),
37
- y && /* @__PURE__ */ o.jsxs("g", { children: [
38
- b(i.y) ? /* @__PURE__ */ o.jsx(k, { scale: i.y, orient: "left", tickSize: s, onlyPositive: c.x }) : /* @__PURE__ */ o.jsx(j, { scale: i.y, orient: "left", labels: T, labelsPosition: n.labelsPosition, tickSize: d }),
39
- t && /* @__PURE__ */ o.jsx(
37
+ T && /* @__PURE__ */ o.jsxs("g", { children: [
38
+ L(i.y) ? /* @__PURE__ */ o.jsx(c, { scale: i.y, orient: "left", tickSize: t, onlyPositive: m.y, hiddenLabels: r.hiddenLabels }) : /* @__PURE__ */ o.jsx(k, { scale: i.y, orient: "left", labels: E, labelsPosition: r.labelsPosition, tickSize: t, hiddenLabels: r.hiddenLabels }),
39
+ d && /* @__PURE__ */ o.jsx(
40
40
  "rect",
41
41
  {
42
- x: -d - h - m.yAxisCaptionsWidth,
42
+ x: -t - x - h.yAxisCaptionsWidth,
43
43
  y: "0",
44
- width: m.yAxisCaptionsWidth,
45
- height: e,
44
+ width: h.yAxisCaptionsWidth,
45
+ height: n,
46
46
  fill: "none",
47
47
  stroke: "black"
48
48
  }
@@ -51,6 +51,6 @@ const _ = A.memo(({
51
51
  ] });
52
52
  });
53
53
  export {
54
- _ as ChartAxis
54
+ w as ChartAxis
55
55
  };
56
56
  //# sourceMappingURL=ChartAxis.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"ChartAxis.js","sources":["../../../src/scatterplot/components/ChartAxis.tsx"],"sourcesContent":["import { memo } from 'react';\nimport { DEFAULT_TICKS_SIZE, TICK_OFFSET, TITLE_LINE } from '../constants';\nimport type { ScatterplotSettingsImpl } from '../ScatterplotSettingsImpl';\nimport type {\n CaptionsSizes,\n ChartDimensionsData,\n ChartScales\n} from './types';\nimport { ContinuousAxis } from '../../common/ContinuousAxis';\nimport { BandAxis } from '../../common/BandAxis';\nimport { isNumericScale } from '../utils/isNumericScale';\nimport type { AxisSettingsDiscrete } from '../../types';\n\ninterface Props {\n debug?: boolean;\n width: number;\n height: number;\n dimensions: ChartDimensionsData;\n scales: ChartScales;\n xAxis: ScatterplotSettingsImpl['chartSettings']['xAxis'];\n yAxis: ScatterplotSettingsImpl['chartSettings']['yAxis'];\n facetSettings: ScatterplotSettingsImpl['facetSettings'];\n captionsSizes: CaptionsSizes;\n discreteLabelsX: Record<string, string[]>;\n discreteLabelsY: Record<string, string[]>;\n onlyPositive: {x: boolean; y: boolean};\n}\n\nexport const ChartAxis = memo(({\n debug,\n width,\n height,\n dimensions,\n scales,\n xAxis,\n yAxis,\n facetSettings,\n captionsSizes,\n discreteLabelsX,\n discreteLabelsY,\n onlyPositive,\n}: Props) => {\n const tickSizeX = xAxis.showTicks ? DEFAULT_TICKS_SIZE : 0;\n const tickSizeY = yAxis.showTicks ? DEFAULT_TICKS_SIZE : 0;\n const needLeftAxis = dimensions.chartEdgeSides.includes('left') || !facetSettings?.sharedY;\n const needBottomAxis = dimensions.chartEdgeSides.includes('bottom') || !facetSettings?.sharedX;\n\n return (\n <>\n {needBottomAxis && (\n <g transform={`translate(0,${height})`}>\n {isNumericScale(scales.x) ? (\n <ContinuousAxis scale={scales.x} orient=\"bottom\" tickSize={tickSizeX} onlyPositive={onlyPositive.x} />\n ): (\n <BandAxis scale={scales.x} orient=\"bottom\" labels={discreteLabelsX} labelsPosition={(xAxis as AxisSettingsDiscrete).labelsPosition} tickSize={tickSizeX} />\n )}\n {debug && (\n <rect\n x=\"0\"\n y={tickSizeX + TICK_OFFSET}\n width={width}\n height={TITLE_LINE}\n fill=\"none\"\n stroke=\"black\"\n />\n )}\n </g>\n )}\n\n {needLeftAxis && (\n <g>\n {isNumericScale(scales.y) ? (\n <ContinuousAxis scale={scales.y} orient=\"left\" tickSize={tickSizeX} onlyPositive={onlyPositive.x} />\n ): (\n <BandAxis scale={scales.y} orient=\"left\" labels={discreteLabelsY} labelsPosition={(yAxis as AxisSettingsDiscrete).labelsPosition} tickSize={tickSizeY} />\n )}\n {debug && (\n <rect\n x={-tickSizeY - TICK_OFFSET - captionsSizes.yAxisCaptionsWidth}\n y=\"0\"\n width={captionsSizes.yAxisCaptionsWidth}\n height={height}\n fill=\"none\"\n stroke=\"black\"\n />\n )}\n </g>\n )}\n </>\n );\n});\n"],"names":["ChartAxis","memo","debug","width","height","dimensions","scales","xAxis","yAxis","facetSettings","captionsSizes","discreteLabelsX","discreteLabelsY","onlyPositive","tickSizeX","DEFAULT_TICKS_SIZE","tickSizeY","needLeftAxis","needBottomAxis","jsxs","Fragment","isNumericScale","jsx","ContinuousAxis","BandAxis","TICK_OFFSET","TITLE_LINE"],"mappings":";;;;;;AA4BO,MAAMA,IAAYC,EAAAA,KAAK,CAAC;AAAA,EAC3B,OAAAC;AAAA,EACA,OAAAC;AAAA,EACA,QAAAC;AAAA,EACA,YAAAC;AAAA,EACA,QAAAC;AAAA,EACA,OAAAC;AAAA,EACA,OAAAC;AAAA,EACA,eAAAC;AAAA,EACA,eAAAC;AAAA,EACA,iBAAAC;AAAA,EACA,iBAAAC;AAAA,EACA,cAAAC;AACJ,MAAa;AACT,QAAMC,IAAYP,EAAM,YAAYQ,IAAqB,GACnDC,IAAYR,EAAM,YAAYO,IAAqB,GACnDE,IAAeZ,EAAW,eAAe,SAAS,MAAM,KAAK,EAACI,KAAA,QAAAA,EAAe,UAC7ES,IAAiBb,EAAW,eAAe,SAAS,QAAQ,KAAK,EAACI,KAAA,QAAAA,EAAe;AAEvF,SACIU,gBAAAA,EAAAA,KAAAC,YAAA,EACK,UAAA;AAAA,IAAAF,KACGC,gBAAAA,EAAAA,KAAC,KAAA,EAAE,WAAW,eAAef,CAAM,KAC9B,UAAA;AAAA,MAAAiB,EAAef,EAAO,CAAC,IACpBgB,gBAAAA,EAAAA,IAACC,GAAA,EAAe,OAAOjB,EAAO,GAAG,QAAO,UAAS,UAAUQ,GAAW,cAAcD,EAAa,EAAA,CAAG,IAEpGS,gBAAAA,EAAAA,IAACE,GAAA,EAAS,OAAOlB,EAAO,GAAG,QAAO,UAAS,QAAQK,GAAiB,gBAAiBJ,EAA+B,gBAAgB,UAAUO,GAAW;AAAA,MAE5JZ,KACGoB,gBAAAA,EAAAA;AAAAA,QAAC;AAAA,QAAA;AAAA,UACG,GAAE;AAAA,UACF,GAAGR,IAAYW;AAAA,UACf,OAAAtB;AAAA,UACA,QAAQuB;AAAA,UACR,MAAK;AAAA,UACL,QAAO;AAAA,QAAA;AAAA,MAAA;AAAA,IACX,GAER;AAAA,IAGHT,4BACI,KAAA,EACI,UAAA;AAAA,MAAAI,EAAef,EAAO,CAAC,IACpBgB,gBAAAA,EAAAA,IAACC,GAAA,EAAe,OAAOjB,EAAO,GAAG,QAAO,QAAO,UAAUQ,GAAW,cAAcD,EAAa,EAAA,CAAG,IAElGS,gBAAAA,EAAAA,IAACE,GAAA,EAAS,OAAOlB,EAAO,GAAG,QAAO,QAAO,QAAQM,GAAiB,gBAAiBJ,EAA+B,gBAAgB,UAAUQ,GAAW;AAAA,MAE1Jd,KACGoB,gBAAAA,EAAAA;AAAAA,QAAC;AAAA,QAAA;AAAA,UACG,GAAG,CAACN,IAAYS,IAAcf,EAAc;AAAA,UAC5C,GAAE;AAAA,UACF,OAAOA,EAAc;AAAA,UACrB,QAAAN;AAAA,UACA,MAAK;AAAA,UACL,QAAO;AAAA,QAAA;AAAA,MAAA;AAAA,IACX,EAAA,CAER;AAAA,EAAA,GAER;AAER,CAAC;"}
1
+ {"version":3,"file":"ChartAxis.js","sources":["../../../src/scatterplot/components/ChartAxis.tsx"],"sourcesContent":["import { memo } from 'react';\nimport { DEFAULT_TICKS_SIZE, TICK_OFFSET, TITLE_LINE } from '../constants';\nimport type { ScatterplotSettingsImpl } from '../ScatterplotSettingsImpl';\nimport type {\n CaptionsSizes,\n ChartDimensionsData,\n ChartScales\n} from './types';\nimport { ContinuousAxis } from '../../common/ContinuousAxis';\nimport { BandAxis } from '../../common/BandAxis';\nimport { isNumericScale } from '../utils/isNumericScale';\nimport type { AxisSettingsDiscrete } from '../../types';\n\ninterface Props {\n debug?: boolean;\n width: number;\n height: number;\n dimensions: ChartDimensionsData;\n scales: ChartScales;\n xAxis: ScatterplotSettingsImpl['chartSettings']['xAxis'];\n yAxis: ScatterplotSettingsImpl['chartSettings']['yAxis'];\n facetSettings: ScatterplotSettingsImpl['facetSettings'];\n captionsSizes: CaptionsSizes;\n discreteLabelsX: Record<string, string[]>;\n discreteLabelsY: Record<string, string[]>;\n onlyPositive: {x: boolean; y: boolean};\n}\n\nexport const ChartAxis = memo(({\n debug,\n width,\n height,\n dimensions,\n scales,\n xAxis,\n yAxis,\n facetSettings,\n captionsSizes,\n discreteLabelsX,\n discreteLabelsY,\n onlyPositive,\n}: Props) => {\n const tickSizeX = xAxis.showTicks ? DEFAULT_TICKS_SIZE : 0;\n const tickSizeY = yAxis.showTicks ? DEFAULT_TICKS_SIZE : 0;\n const needLeftAxis = dimensions.chartEdgeSides.includes('left') || !facetSettings?.sharedY;\n const needBottomAxis = dimensions.chartEdgeSides.includes('bottom') || !facetSettings?.sharedX;\n\n return (\n <>\n {needBottomAxis && (\n <g transform={`translate(0,${height})`}>\n {isNumericScale(scales.x) ? (\n <ContinuousAxis scale={scales.x} orient=\"bottom\" tickSize={tickSizeX} onlyPositive={onlyPositive.x} hiddenLabels={xAxis.hiddenLabels} />\n ): (\n <BandAxis scale={scales.x} orient=\"bottom\" labels={discreteLabelsX} labelsPosition={(xAxis as AxisSettingsDiscrete).labelsPosition} tickSize={tickSizeX} hiddenLabels={xAxis.hiddenLabels} />\n )}\n {debug && (\n <rect\n x=\"0\"\n y={tickSizeX + TICK_OFFSET}\n width={width}\n height={TITLE_LINE}\n fill=\"none\"\n stroke=\"black\"\n />\n )}\n </g>\n )}\n\n {needLeftAxis && (\n <g>\n {isNumericScale(scales.y) ? (\n <ContinuousAxis scale={scales.y} orient=\"left\" tickSize={tickSizeY} onlyPositive={onlyPositive.y} hiddenLabels={yAxis.hiddenLabels} />\n ): (\n <BandAxis scale={scales.y} orient=\"left\" labels={discreteLabelsY} labelsPosition={(yAxis as AxisSettingsDiscrete).labelsPosition} tickSize={tickSizeY} hiddenLabels={yAxis.hiddenLabels} />\n )}\n {debug && (\n <rect\n x={-tickSizeY - TICK_OFFSET - captionsSizes.yAxisCaptionsWidth}\n y=\"0\"\n width={captionsSizes.yAxisCaptionsWidth}\n height={height}\n fill=\"none\"\n stroke=\"black\"\n />\n )}\n </g>\n )}\n </>\n );\n});\n"],"names":["ChartAxis","memo","debug","width","height","dimensions","scales","xAxis","yAxis","facetSettings","captionsSizes","discreteLabelsX","discreteLabelsY","onlyPositive","tickSizeX","DEFAULT_TICKS_SIZE","tickSizeY","needLeftAxis","needBottomAxis","jsxs","Fragment","isNumericScale","jsx","ContinuousAxis","BandAxis","TICK_OFFSET","TITLE_LINE"],"mappings":";;;;;;AA4BO,MAAMA,IAAYC,EAAAA,KAAK,CAAC;AAAA,EAC3B,OAAAC;AAAA,EACA,OAAAC;AAAA,EACA,QAAAC;AAAA,EACA,YAAAC;AAAA,EACA,QAAAC;AAAA,EACA,OAAAC;AAAA,EACA,OAAAC;AAAA,EACA,eAAAC;AAAA,EACA,eAAAC;AAAA,EACA,iBAAAC;AAAA,EACA,iBAAAC;AAAA,EACA,cAAAC;AACJ,MAAa;AACT,QAAMC,IAAYP,EAAM,YAAYQ,IAAqB,GACnDC,IAAYR,EAAM,YAAYO,IAAqB,GACnDE,IAAeZ,EAAW,eAAe,SAAS,MAAM,KAAK,EAACI,KAAA,QAAAA,EAAe,UAC7ES,IAAiBb,EAAW,eAAe,SAAS,QAAQ,KAAK,EAACI,KAAA,QAAAA,EAAe;AAEvF,SACIU,gBAAAA,EAAAA,KAAAC,YAAA,EACK,UAAA;AAAA,IAAAF,KACGC,gBAAAA,EAAAA,KAAC,KAAA,EAAE,WAAW,eAAef,CAAM,KAC9B,UAAA;AAAA,MAAAiB,EAAef,EAAO,CAAC,IACpBgB,gBAAAA,EAAAA,IAACC,KAAe,OAAOjB,EAAO,GAAG,QAAO,UAAS,UAAUQ,GAAW,cAAcD,EAAa,GAAG,cAAcN,EAAM,aAAA,CAAc,0BAErIiB,GAAA,EAAS,OAAOlB,EAAO,GAAG,QAAO,UAAS,QAAQK,GAAiB,gBAAiBJ,EAA+B,gBAAgB,UAAUO,GAAW,cAAcP,EAAM,cAAc;AAAA,MAE9LL,KACGoB,gBAAAA,EAAAA;AAAAA,QAAC;AAAA,QAAA;AAAA,UACG,GAAE;AAAA,UACF,GAAGR,IAAYW;AAAA,UACf,OAAAtB;AAAA,UACA,QAAQuB;AAAA,UACR,MAAK;AAAA,UACL,QAAO;AAAA,QAAA;AAAA,MAAA;AAAA,IACX,GAER;AAAA,IAGHT,4BACI,KAAA,EACI,UAAA;AAAA,MAAAI,EAAef,EAAO,CAAC,IACpBgB,gBAAAA,EAAAA,IAACC,KAAe,OAAOjB,EAAO,GAAG,QAAO,QAAO,UAAUU,GAAW,cAAcH,EAAa,GAAG,cAAcL,EAAM,aAAA,CAAc,0BAEnIgB,GAAA,EAAS,OAAOlB,EAAO,GAAG,QAAO,QAAO,QAAQM,GAAiB,gBAAiBJ,EAA+B,gBAAgB,UAAUQ,GAAW,cAAcR,EAAM,cAAc;AAAA,MAE5LN,KACGoB,gBAAAA,EAAAA;AAAAA,QAAC;AAAA,QAAA;AAAA,UACG,GAAG,CAACN,IAAYS,IAAcf,EAAc;AAAA,UAC5C,GAAE;AAAA,UACF,OAAOA,EAAc;AAAA,UACrB,QAAAN;AAAA,UACA,MAAK;AAAA,UACL,QAAO;AAAA,QAAA;AAAA,MAAA;AAAA,IACX,EAAA,CAER;AAAA,EAAA,GAER;AAER,CAAC;"}
@@ -2,56 +2,56 @@ import { j as n } from "../../_virtual/jsx-runtime.js";
2
2
  import { r as y } from "../../_virtual/index.js";
3
3
  import { useDataFrame as A } from "../../common/useDataFrame.js";
4
4
  import { BLACK as E } from "../../constants.js";
5
- import { MIN_PADDING as l, TITLE_LINE as o } from "../constants.js";
6
- function f(i, e, t) {
7
- return typeof e == "string" ? e : t.length ? i.getColumnValue(e.value, t[0].idx) : "";
5
+ import { MIN_PADDING as i, TITLE_LINE as r } from "../constants.js";
6
+ function f(l, e, t) {
7
+ return typeof e == "string" ? e : t.length ? l.getColumnValue(e.value, t[0].idx) : "";
8
8
  }
9
- const h = y.memo(({
10
- debug: i,
9
+ const B = y.memo(({
10
+ debug: l,
11
11
  width: e,
12
12
  height: t,
13
13
  dimensions: s,
14
14
  xAxis: d,
15
- yAxis: p,
16
- dotsData: u
15
+ yAxis: u,
16
+ dotsData: p
17
17
  }) => {
18
- const x = A(), { padding: r } = s, { dots: m } = u, T = f(x, d.title, m), j = f(x, p.title, m), c = s.chartEdgeSides.includes("left"), a = s.chartEdgeSides.includes("bottom");
19
- return (a || c) && /* @__PURE__ */ n.jsxs("g", { dominantBaseline: "central", textAnchor: "middle", fontWeight: "500", fontSize: "14px", fill: E, children: [
20
- a && /* @__PURE__ */ n.jsx("text", { x: e / 2, y: t + r.bottom - l - o / 2, children: T }),
21
- i && a && /* @__PURE__ */ n.jsx(
18
+ const m = A(), { padding: o } = s, { dots: a } = p, T = f(m, d.title, a), j = f(m, u.title, a), x = s.chartEdgeSides.includes("left"), c = s.chartEdgeSides.includes("bottom");
19
+ return (c || x) && /* @__PURE__ */ n.jsxs("g", { dominantBaseline: "central", textAnchor: "middle", fontWeight: "500", fontSize: "14px", fill: E, children: [
20
+ c && /* @__PURE__ */ n.jsx("text", { x: e / 2, y: t + o.bottom - i - r / 2, children: T }),
21
+ l && c && /* @__PURE__ */ n.jsx(
22
22
  "rect",
23
23
  {
24
24
  x: "0",
25
- y: t + r.bottom - l - o,
25
+ y: t + o.bottom - i - r,
26
26
  width: e,
27
- height: o,
27
+ height: r,
28
28
  fill: "none",
29
- stroke: "black"
29
+ stroke: "red"
30
30
  }
31
31
  ),
32
- c && /* @__PURE__ */ n.jsx(
32
+ x && /* @__PURE__ */ n.jsx(
33
33
  "text",
34
34
  {
35
- x: -r.left + l + o / 2,
35
+ x: -o.left + i + r / 2,
36
36
  y: t / 2,
37
- transform: `rotate(-90,${-r.left + l + o / 2},${t / 2})`,
37
+ transform: `rotate(-90,${-o.left + i + r / 2},${t / 2})`,
38
38
  children: j
39
39
  }
40
40
  ),
41
- i && c && /* @__PURE__ */ n.jsx(
41
+ l && x && /* @__PURE__ */ n.jsx(
42
42
  "rect",
43
43
  {
44
- x: -r.left + l,
44
+ x: -o.left + i,
45
45
  y: "0",
46
- width: o,
46
+ width: r,
47
47
  height: t,
48
48
  fill: "none",
49
- stroke: "black"
49
+ stroke: "blue"
50
50
  }
51
51
  )
52
52
  ] });
53
53
  });
54
54
  export {
55
- h as ChartAxisTitles
55
+ B as ChartAxisTitles
56
56
  };
57
57
  //# sourceMappingURL=ChartAxisTitles.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"ChartAxisTitles.js","sources":["../../../src/scatterplot/components/ChartAxisTitles.tsx"],"sourcesContent":["import { memo } from 'react';\nimport { useDataFrame } from '../../common/useDataFrame';\nimport { BLACK } from '../../constants';\nimport type { DataFrame } from '../../DataFrame';\nimport type { ColumnName } from '../../types';\nimport { MIN_PADDING, TITLE_LINE } from '../constants';\nimport type { Dot, GroupedDots } from '../dots';\nimport type { ScatterplotSettingsImpl } from '../ScatterplotSettingsImpl';\nimport type {\n ChartDimensionsData\n} from './types';\n\ninterface Props {\n debug?: boolean;\n width: number;\n height: number;\n dimensions: ChartDimensionsData;\n xAxis: ScatterplotSettingsImpl['chartSettings']['xAxis'];\n yAxis: ScatterplotSettingsImpl['chartSettings']['yAxis'];\n dotsData: GroupedDots[keyof GroupedDots];\n}\n\nfunction getTitle(dataFrame: DataFrame, title: string | ColumnName, dots: Dot[]): string {\n if (typeof title === 'string') {\n return title;\n }\n if (!dots.length) {\n return '';\n }\n return dataFrame.getColumnValue(title.value, dots[0].idx) as string;\n}\n\nexport const ChartAxisTitles = memo(({\n debug,\n width,\n height,\n dimensions,\n xAxis,\n yAxis,\n dotsData,\n}: Props) =>{\n const dataFrame = useDataFrame();\n const {padding} = dimensions;\n const {dots} = dotsData;\n const xTitle = getTitle(dataFrame, xAxis.title, dots);\n const yTitle = getTitle(dataFrame, yAxis.title, dots);\n\n const needLeftAxisTitle = dimensions.chartEdgeSides.includes('left');\n const needBottomAxisTitle = dimensions.chartEdgeSides.includes('bottom');\n\n return (needBottomAxisTitle || needLeftAxisTitle) && (\n <g dominantBaseline=\"central\" textAnchor=\"middle\" fontWeight=\"500\" fontSize=\"14px\" fill={BLACK}>\n {needBottomAxisTitle && (\n <text x={width / 2} y={height + padding.bottom - MIN_PADDING - TITLE_LINE / 2}>\n {xTitle}\n </text>\n )}\n {debug && needBottomAxisTitle && (\n <rect\n x=\"0\"\n y={height + padding.bottom - MIN_PADDING - TITLE_LINE}\n width={width}\n height={TITLE_LINE}\n fill=\"none\"\n stroke=\"black\"\n />\n )}\n {needLeftAxisTitle && (\n <text\n x={-padding.left + MIN_PADDING + TITLE_LINE / 2}\n y={height / 2}\n transform={`rotate(-90,${-padding.left + MIN_PADDING + TITLE_LINE / 2},${height / 2})`}\n >\n {yTitle}\n </text>\n )}\n {debug && needLeftAxisTitle && (\n <rect\n x={-padding.left + MIN_PADDING}\n y=\"0\"\n width={TITLE_LINE}\n height={height}\n fill=\"none\"\n stroke=\"black\"\n />\n )}\n </g>\n );\n});"],"names":["getTitle","dataFrame","title","dots","ChartAxisTitles","memo","debug","width","height","dimensions","xAxis","yAxis","dotsData","useDataFrame","padding","xTitle","yTitle","needLeftAxisTitle","needBottomAxisTitle","jsxs","BLACK","jsx","MIN_PADDING","TITLE_LINE"],"mappings":";;;;;AAsBA,SAASA,EAASC,GAAsBC,GAA4BC,GAAqB;AACrF,SAAI,OAAOD,KAAU,WACVA,IAENC,EAAK,SAGHF,EAAU,eAAeC,EAAM,OAAOC,EAAK,CAAC,EAAE,GAAG,IAF7C;AAGf;AAEO,MAAMC,IAAkBC,EAAAA,KAAK,CAAC;AAAA,EACjC,OAAAC;AAAA,EACA,OAAAC;AAAA,EACA,QAAAC;AAAA,EACA,YAAAC;AAAA,EACA,OAAAC;AAAA,EACA,OAAAC;AAAA,EACA,UAAAC;AACJ,MAAY;AACR,QAAMX,IAAYY,EAAA,GACZ,EAAC,SAAAC,MAAWL,GACZ,EAAC,MAAAN,MAAQS,GACTG,IAASf,EAASC,GAAWS,EAAM,OAAOP,CAAI,GAC9Ca,IAAShB,EAASC,GAAWU,EAAM,OAAOR,CAAI,GAE9Cc,IAAoBR,EAAW,eAAe,SAAS,MAAM,GAC7DS,IAAsBT,EAAW,eAAe,SAAS,QAAQ;AAEvE,UAAQS,KAAuBD,MAC1BE,gBAAAA,EAAAA,KAAC,KAAA,EAAE,kBAAiB,WAAU,YAAW,UAAS,YAAW,OAAM,UAAS,QAAO,MAAMC,GACrF,UAAA;AAAA,IAAAF,KACGG,gBAAAA,EAAAA,IAAC,QAAA,EAAK,GAAGd,IAAQ,GAAG,GAAGC,IAASM,EAAQ,SAASQ,IAAcC,IAAa,GACvE,UAAAR,GACL;AAAA,IAEHT,KAASY,KACNG,gBAAAA,EAAAA;AAAAA,MAAC;AAAA,MAAA;AAAA,QACG,GAAE;AAAA,QACF,GAAGb,IAASM,EAAQ,SAASQ,IAAcC;AAAA,QAC3C,OAAAhB;AAAA,QACA,QAAQgB;AAAA,QACR,MAAK;AAAA,QACL,QAAO;AAAA,MAAA;AAAA,IAAA;AAAA,IAGdN,KACGI,gBAAAA,EAAAA;AAAAA,MAAC;AAAA,MAAA;AAAA,QACG,GAAG,CAACP,EAAQ,OAAOQ,IAAcC,IAAa;AAAA,QAC9C,GAAGf,IAAS;AAAA,QACZ,WAAW,cAAc,CAACM,EAAQ,OAAOQ,IAAcC,IAAa,CAAC,IAAIf,IAAS,CAAC;AAAA,QAElF,UAAAQ;AAAA,MAAA;AAAA,IAAA;AAAA,IAGRV,KAASW,KACNI,gBAAAA,EAAAA;AAAAA,MAAC;AAAA,MAAA;AAAA,QACG,GAAG,CAACP,EAAQ,OAAOQ;AAAA,QACnB,GAAE;AAAA,QACF,OAAOC;AAAA,QACP,QAAAf;AAAA,QACA,MAAK;AAAA,QACL,QAAO;AAAA,MAAA;AAAA,IAAA;AAAA,EACX,GAER;AAER,CAAC;"}
1
+ {"version":3,"file":"ChartAxisTitles.js","sources":["../../../src/scatterplot/components/ChartAxisTitles.tsx"],"sourcesContent":["import { memo } from 'react';\nimport { useDataFrame } from '../../common/useDataFrame';\nimport { BLACK } from '../../constants';\nimport type { DataFrame } from '../../DataFrame';\nimport type { ColumnName } from '../../types';\nimport { MIN_PADDING, TITLE_LINE } from '../constants';\nimport type { Dot, GroupedDots } from '../dots';\nimport type { ScatterplotSettingsImpl } from '../ScatterplotSettingsImpl';\nimport type {\n ChartDimensionsData\n} from './types';\n\ninterface Props {\n debug?: boolean;\n width: number;\n height: number;\n dimensions: ChartDimensionsData;\n xAxis: ScatterplotSettingsImpl['chartSettings']['xAxis'];\n yAxis: ScatterplotSettingsImpl['chartSettings']['yAxis'];\n dotsData: GroupedDots[keyof GroupedDots];\n}\n\nfunction getTitle(dataFrame: DataFrame, title: string | ColumnName, dots: Dot[]): string {\n if (typeof title === 'string') {\n return title;\n }\n if (!dots.length) {\n return '';\n }\n return dataFrame.getColumnValue(title.value, dots[0].idx) as string;\n}\n\nexport const ChartAxisTitles = memo(({\n debug,\n width,\n height,\n dimensions,\n xAxis,\n yAxis,\n dotsData,\n}: Props) =>{\n const dataFrame = useDataFrame();\n const {padding} = dimensions;\n const {dots} = dotsData;\n const xTitle = getTitle(dataFrame, xAxis.title, dots);\n const yTitle = getTitle(dataFrame, yAxis.title, dots);\n\n const needLeftAxisTitle = dimensions.chartEdgeSides.includes('left');\n const needBottomAxisTitle = dimensions.chartEdgeSides.includes('bottom');\n\n return (needBottomAxisTitle || needLeftAxisTitle) && (\n <g dominantBaseline=\"central\" textAnchor=\"middle\" fontWeight=\"500\" fontSize=\"14px\" fill={BLACK}>\n {needBottomAxisTitle && (\n <text x={width / 2} y={height + padding.bottom - MIN_PADDING - TITLE_LINE / 2}>\n {xTitle}\n </text>\n )}\n {debug && needBottomAxisTitle && (\n <rect\n x=\"0\"\n y={height + padding.bottom - MIN_PADDING - TITLE_LINE}\n width={width}\n height={TITLE_LINE}\n fill=\"none\"\n stroke=\"red\"\n />\n )}\n {needLeftAxisTitle && (\n <text\n x={-padding.left + MIN_PADDING + TITLE_LINE / 2}\n y={height / 2}\n transform={`rotate(-90,${-padding.left + MIN_PADDING + TITLE_LINE / 2},${height / 2})`}\n >\n {yTitle}\n </text>\n )}\n {debug && needLeftAxisTitle && (\n <rect\n x={-padding.left + MIN_PADDING}\n y=\"0\"\n width={TITLE_LINE}\n height={height}\n fill=\"none\"\n stroke=\"blue\"\n />\n )}\n </g>\n );\n});"],"names":["getTitle","dataFrame","title","dots","ChartAxisTitles","memo","debug","width","height","dimensions","xAxis","yAxis","dotsData","useDataFrame","padding","xTitle","yTitle","needLeftAxisTitle","needBottomAxisTitle","jsxs","BLACK","jsx","MIN_PADDING","TITLE_LINE"],"mappings":";;;;;AAsBA,SAASA,EAASC,GAAsBC,GAA4BC,GAAqB;AACrF,SAAI,OAAOD,KAAU,WACVA,IAENC,EAAK,SAGHF,EAAU,eAAeC,EAAM,OAAOC,EAAK,CAAC,EAAE,GAAG,IAF7C;AAGf;AAEO,MAAMC,IAAkBC,EAAAA,KAAK,CAAC;AAAA,EACjC,OAAAC;AAAA,EACA,OAAAC;AAAA,EACA,QAAAC;AAAA,EACA,YAAAC;AAAA,EACA,OAAAC;AAAA,EACA,OAAAC;AAAA,EACA,UAAAC;AACJ,MAAY;AACR,QAAMX,IAAYY,EAAA,GACZ,EAAC,SAAAC,MAAWL,GACZ,EAAC,MAAAN,MAAQS,GACTG,IAASf,EAASC,GAAWS,EAAM,OAAOP,CAAI,GAC9Ca,IAAShB,EAASC,GAAWU,EAAM,OAAOR,CAAI,GAE9Cc,IAAoBR,EAAW,eAAe,SAAS,MAAM,GAC7DS,IAAsBT,EAAW,eAAe,SAAS,QAAQ;AAEvE,UAAQS,KAAuBD,MAC1BE,gBAAAA,EAAAA,KAAC,KAAA,EAAE,kBAAiB,WAAU,YAAW,UAAS,YAAW,OAAM,UAAS,QAAO,MAAMC,GACrF,UAAA;AAAA,IAAAF,KACGG,gBAAAA,EAAAA,IAAC,QAAA,EAAK,GAAGd,IAAQ,GAAG,GAAGC,IAASM,EAAQ,SAASQ,IAAcC,IAAa,GACvE,UAAAR,GACL;AAAA,IAEHT,KAASY,KACNG,gBAAAA,EAAAA;AAAAA,MAAC;AAAA,MAAA;AAAA,QACG,GAAE;AAAA,QACF,GAAGb,IAASM,EAAQ,SAASQ,IAAcC;AAAA,QAC3C,OAAAhB;AAAA,QACA,QAAQgB;AAAA,QACR,MAAK;AAAA,QACL,QAAO;AAAA,MAAA;AAAA,IAAA;AAAA,IAGdN,KACGI,gBAAAA,EAAAA;AAAAA,MAAC;AAAA,MAAA;AAAA,QACG,GAAG,CAACP,EAAQ,OAAOQ,IAAcC,IAAa;AAAA,QAC9C,GAAGf,IAAS;AAAA,QACZ,WAAW,cAAc,CAACM,EAAQ,OAAOQ,IAAcC,IAAa,CAAC,IAAIf,IAAS,CAAC;AAAA,QAElF,UAAAQ;AAAA,MAAA;AAAA,IAAA;AAAA,IAGRV,KAASW,KACNI,gBAAAA,EAAAA;AAAAA,MAAC;AAAA,MAAA;AAAA,QACG,GAAG,CAACP,EAAQ,OAAOQ;AAAA,QACnB,GAAE;AAAA,QACF,OAAOC;AAAA,QACP,QAAAf;AAAA,QACA,MAAK;AAAA,QACL,QAAO;AAAA,MAAA;AAAA,IAAA;AAAA,EACX,GAER;AAER,CAAC;"}
@@ -16,4 +16,4 @@ export declare const MIN_PADDING = 12;
16
16
  export declare const TITLE_LINE = 20;
17
17
  export declare const DEFAULT_TICKS_SIZE = 4;
18
18
  export declare const TICK_OFFSET = 6;
19
- export declare const LEGEND_OFFSET = 10;
19
+ export declare const LEGEND_OFFSET = 20;
@@ -16,7 +16,7 @@ const E = {
16
16
  color: "#929BAD",
17
17
  size: 6,
18
18
  shape: "21"
19
- }, F = 20, n = 6, s = 8, I = 24, A = 12, c = 20, S = 4, i = 6, l = 10;
19
+ }, F = 20, n = 6, s = 8, I = 24, A = 12, c = 20, S = 4, i = 6, l = 20;
20
20
  export {
21
21
  t as DEFAULT_COMMON_AES,
22
22
  _ as DEFAULT_DOT_AES,
@@ -1 +1 @@
1
- {"version":3,"file":"constants.js","sources":["../../src/scatterplot/constants.ts"],"sourcesContent":["import type { DotAesItem } from '../common/types';\nimport { BLACK } from '../constants';\nimport type { AesItem } from '../types';\n\n// inner paddings in chart area\nexport const PADDINGS = {\n TOP: 30,\n BOTTOM: 30,\n LEFT: 30,\n RIGHT: 30\n};\n\nexport const DEFAULT_COMMON_AES: Required<AesItem> = {\n fillColor: 'white',\n lineColor: BLACK,\n lineWidth: 1,\n lineShape: 'solid',\n dotSize: 3,\n dotFill: BLACK,\n dotShape: '21',\n};\nexport const DEFAULT_DOT_AES:DotAesItem = {\n color: '#929BAD',\n size: 6,\n shape: '21',\n};\n\nexport const FACET_TITLE_LINE = 20;\nexport const FACET_TITLE_OFFSET = 6;\nexport const FACET_AXIS_OFFSET = 8;\nexport const MIN_MARGIN = 24;\nexport const MIN_PADDING = 12;\n\nexport const TITLE_LINE = 20;\nexport const DEFAULT_TICKS_SIZE = 4;\nexport const TICK_OFFSET = 6;\n\nexport const LEGEND_OFFSET = 10;\n"],"names":["PADDINGS","DEFAULT_COMMON_AES","BLACK","DEFAULT_DOT_AES","FACET_TITLE_LINE","FACET_TITLE_OFFSET","FACET_AXIS_OFFSET","MIN_MARGIN","MIN_PADDING","TITLE_LINE","DEFAULT_TICKS_SIZE","TICK_OFFSET","LEGEND_OFFSET"],"mappings":";AAKO,MAAMA,IAAW;AAAA,EACpB,KAAK;AAAA,EACL,QAAQ;AAAA,EACR,MAAM;AAAA,EACN,OAAO;AACX,GAEaC,IAAwC;AAAA,EACjD,WAAW;AAAA,EACX,WAAWC;AAAA,EACX,WAAW;AAAA,EACX,WAAW;AAAA,EACX,SAAS;AAAA,EACT,SAASA;AAAA,EACT,UAAU;AACd,GACaC,IAA6B;AAAA,EACtC,OAAO;AAAA,EACP,MAAM;AAAA,EACN,OAAO;AACX,GAEaC,IAAmB,IACnBC,IAAqB,GACrBC,IAAoB,GACpBC,IAAa,IACbC,IAAc,IAEdC,IAAa,IACbC,IAAqB,GACrBC,IAAc,GAEdC,IAAgB;"}
1
+ {"version":3,"file":"constants.js","sources":["../../src/scatterplot/constants.ts"],"sourcesContent":["import type { DotAesItem } from '../common/types';\nimport { BLACK } from '../constants';\nimport type { AesItem } from '../types';\n\n// inner paddings in chart area\nexport const PADDINGS = {\n TOP: 30,\n BOTTOM: 30,\n LEFT: 30,\n RIGHT: 30\n};\n\nexport const DEFAULT_COMMON_AES: Required<AesItem> = {\n fillColor: 'white',\n lineColor: BLACK,\n lineWidth: 1,\n lineShape: 'solid',\n dotSize: 3,\n dotFill: BLACK,\n dotShape: '21',\n};\nexport const DEFAULT_DOT_AES:DotAesItem = {\n color: '#929BAD',\n size: 6,\n shape: '21',\n};\n\nexport const FACET_TITLE_LINE = 20;\nexport const FACET_TITLE_OFFSET = 6;\nexport const FACET_AXIS_OFFSET = 8;\nexport const MIN_MARGIN = 24;\nexport const MIN_PADDING = 12;\n\nexport const TITLE_LINE = 20;\nexport const DEFAULT_TICKS_SIZE = 4;\nexport const TICK_OFFSET = 6;\n\nexport const LEGEND_OFFSET = 20;\n"],"names":["PADDINGS","DEFAULT_COMMON_AES","BLACK","DEFAULT_DOT_AES","FACET_TITLE_LINE","FACET_TITLE_OFFSET","FACET_AXIS_OFFSET","MIN_MARGIN","MIN_PADDING","TITLE_LINE","DEFAULT_TICKS_SIZE","TICK_OFFSET","LEGEND_OFFSET"],"mappings":";AAKO,MAAMA,IAAW;AAAA,EACpB,KAAK;AAAA,EACL,QAAQ;AAAA,EACR,MAAM;AAAA,EACN,OAAO;AACX,GAEaC,IAAwC;AAAA,EACjD,WAAW;AAAA,EACX,WAAWC;AAAA,EACX,WAAW;AAAA,EACX,WAAW;AAAA,EACX,SAAS;AAAA,EACT,SAASA;AAAA,EACT,UAAU;AACd,GACaC,IAA6B;AAAA,EACtC,OAAO;AAAA,EACP,MAAM;AAAA,EACN,OAAO;AACX,GAEaC,IAAmB,IACnBC,IAAqB,GACrBC,IAAoB,GACpBC,IAAa,IACbC,IAAc,IAEdC,IAAa,IACbC,IAAqB,GACrBC,IAAc,GAEdC,IAAgB;"}
@@ -15,4 +15,4 @@ export type GroupedDots = Record<string, {
15
15
  maxY: number;
16
16
  dots: Dot[];
17
17
  }>;
18
- export declare function getDots(data: DataFrame, facetKeysCombinations: string[][], x: ColumnName, y: ColumnName, label: ColumnName | null, highlight: ColumnName | null, grouping: ScatterplotSettingsImpl['grouping']): GroupedDots;
18
+ export declare function getDots(data: DataFrame, facetKeysCombinations: string[][], x: ColumnName, y: ColumnName, label: ColumnName | null, highlight: ColumnName | null, grouping: ScatterplotSettingsImpl['grouping'], xAxis: ScatterplotSettingsImpl['chartSettings']['xAxis'], yAxis: ScatterplotSettingsImpl['chartSettings']['yAxis']): GroupedDots;
@@ -1,26 +1,26 @@
1
- import { formatColumnValue as V } from "./utils/formatColumnValue.js";
2
- import { sortDotsByGrouping as w } from "./utils/sortDotsByGrouping.js";
3
- import { format as F } from "../node_modules/.pnpm/d3-format@3.1.0/node_modules/d3-format/src/defaultLocale.js";
4
- function B(t, x, v, I, o, m, g) {
5
- const l = {}, C = o != null && o.format ? F(o.format) : void 0;
1
+ import { formatColumnValue as w } from "./utils/formatColumnValue.js";
2
+ import { sortDotsByGrouping as F } from "./utils/sortDotsByGrouping.js";
3
+ import { format as G } from "../node_modules/.pnpm/d3-format@3.1.0/node_modules/d3-format/src/defaultLocale.js";
4
+ function D(t, x, v, I, o, m, g, C, M) {
5
+ const l = {}, V = o != null && o.format ? G(o.format) : void 0;
6
6
  for (const p of x) {
7
7
  const r = [];
8
- let u = 1 / 0, f = 1 / 0, s = -1 / 0, c = -1 / 0;
9
- const M = p.concat([""]), y = t.getRowsByGrouping(M);
8
+ let s = 1 / 0, u = 1 / 0, f = -1 / 0, c = -1 / 0;
9
+ const d = p.concat([""]), y = t.getRowsByGrouping(d);
10
10
  for (let a = 0; a < y.length; a++) {
11
11
  const n = y[a], e = t.getColumnValue(v.value, n), i = t.getColumnValue(I.value, n);
12
- typeof e != "number" || typeof i != "number" || !isFinite(e) || !isFinite(i) || (u = Math.min(u, e), f = Math.min(f, i), s = Math.max(s, e), c = Math.max(c, i), r.push({
12
+ C.scale !== "discrete" && (typeof e != "number" || !isFinite(e)) || M.scale !== "discrete" && (typeof i != "number" || !isFinite(i)) || (s = Math.min(s, e), u = Math.min(u, i), f = Math.max(f, e), c = Math.max(c, i), r.push({
13
13
  x: e,
14
14
  y: i,
15
- label: V(t, n, o, C),
15
+ label: w(t, n, o, V),
16
16
  dimmed: m ? !t.getColumnValue(m.value, n) : !1,
17
17
  idx: n
18
18
  }));
19
19
  }
20
- w(t, r, g, m), l[p.join("_")] = {
21
- minX: u,
22
- maxX: s,
23
- minY: f,
20
+ F(t, r, g, m), l[p.join("_")] = {
21
+ minX: s,
22
+ maxX: f,
23
+ minY: u,
24
24
  maxY: c,
25
25
  dots: r
26
26
  };
@@ -28,6 +28,6 @@ function B(t, x, v, I, o, m, g) {
28
28
  return l;
29
29
  }
30
30
  export {
31
- B as getDots
31
+ D as getDots
32
32
  };
33
33
  //# sourceMappingURL=dots.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"dots.js","sources":["../../src/scatterplot/dots.ts"],"sourcesContent":["import {format} from 'd3-format';\nimport type { DataFrame } from '../DataFrame';\nimport type { ColumnName, DataValue } from '../types';\nimport type { ScatterplotSettingsImpl } from './ScatterplotSettingsImpl';\nimport {formatColumnValue} from './utils/formatColumnValue';\nimport {sortDotsByGrouping} from './utils/sortDotsByGrouping';\n\nexport type Dot = {\n idx: number;\n x: string | number;\n y: string | number;\n label: DataValue | null;\n dimmed: boolean;\n};\n\nexport type GroupedDots = Record<\n string,\n {\n minX: number;\n maxX: number;\n minY: number;\n maxY: number;\n dots: Dot[];\n }\n>;\n\nexport function getDots(\n data: DataFrame,\n facetKeysCombinations: string[][],\n x: ColumnName,\n y: ColumnName,\n label: ColumnName | null,\n highlight: ColumnName | null,\n grouping: ScatterplotSettingsImpl['grouping']\n): GroupedDots {\n const result: GroupedDots = {};\n\n const labelFormatter = label?.format ? format(label.format) : undefined;\n\n for (const facetKeys of facetKeysCombinations) {\n const dots: Dot[] = [];\n let minX = Infinity;\n let minY = Infinity;\n let maxX = -Infinity;\n let maxY = -Infinity;\n\n const templateGroupPath = facetKeys.concat(['']);\n const rows = data.getRowsByGrouping(templateGroupPath);\n\n for (let i = 0; i < rows.length; i++) {\n const rowIdx = rows[i];\n const valueX = data.getColumnValue(x.value, rowIdx) as number;\n const valueY = data.getColumnValue(y.value, rowIdx) as number;\n\n if (typeof valueX !== 'number' || typeof valueY !== 'number') {\n continue;\n }\n if (!isFinite(valueX) || !isFinite(valueY)) {\n continue;\n }\n\n minX = Math.min(minX, valueX);\n minY = Math.min(minY, valueY);\n maxX = Math.max(maxX, valueX);\n maxY = Math.max(maxY, valueY);\n\n dots.push({\n x: valueX,\n y: valueY,\n label: formatColumnValue(data, rowIdx, label, labelFormatter),\n dimmed: highlight ? !data.getColumnValue(highlight.value, rowIdx) : false,\n idx: rowIdx\n });\n }\n\n sortDotsByGrouping(data, dots, grouping, highlight);\n\n result[facetKeys.join('_')] = {\n minX,\n maxX,\n minY,\n maxY,\n dots,\n };\n }\n\n return result;\n}\n"],"names":["getDots","data","facetKeysCombinations","x","y","label","highlight","grouping","result","labelFormatter","format","facetKeys","dots","minX","minY","maxX","maxY","templateGroupPath","rows","i","rowIdx","valueX","valueY","formatColumnValue","sortDotsByGrouping"],"mappings":";;;AA0BO,SAASA,EACZC,GACAC,GACAC,GACAC,GACAC,GACAC,GACAC,GACW;AACX,QAAMC,IAAsB,CAAA,GAEtBC,IAAiBJ,KAAA,QAAAA,EAAO,SAASK,EAAOL,EAAM,MAAM,IAAI;AAE9D,aAAWM,KAAaT,GAAuB;AAC3C,UAAMU,IAAc,CAAA;AACpB,QAAIC,IAAO,OACPC,IAAO,OACPC,IAAO,QACPC,IAAO;AAEX,UAAMC,IAAoBN,EAAU,OAAO,CAAC,EAAE,CAAC,GACzCO,IAAOjB,EAAK,kBAAkBgB,CAAiB;AAErD,aAASE,IAAI,GAAGA,IAAID,EAAK,QAAQC,KAAK;AAClC,YAAMC,IAASF,EAAKC,CAAC,GACfE,IAASpB,EAAK,eAAeE,EAAE,OAAOiB,CAAM,GAC5CE,IAASrB,EAAK,eAAeG,EAAE,OAAOgB,CAAM;AAElD,MAAI,OAAOC,KAAW,YAAY,OAAOC,KAAW,YAGhD,CAAC,SAASD,CAAM,KAAK,CAAC,SAASC,CAAM,MAIzCT,IAAO,KAAK,IAAIA,GAAMQ,CAAM,GAC5BP,IAAO,KAAK,IAAIA,GAAMQ,CAAM,GAC5BP,IAAO,KAAK,IAAIA,GAAMM,CAAM,GAC5BL,IAAO,KAAK,IAAIA,GAAMM,CAAM,GAE5BV,EAAK,KAAK;AAAA,QACN,GAAGS;AAAA,QACH,GAAGC;AAAA,QACH,OAAOC,EAAkBtB,GAAMmB,GAAQf,GAAOI,CAAc;AAAA,QAC5D,QAAQH,IAAY,CAACL,EAAK,eAAeK,EAAU,OAAOc,CAAM,IAAI;AAAA,QACpE,KAAKA;AAAA,MAAA,CACR;AAAA,IACL;AAEA,IAAAI,EAAmBvB,GAAMW,GAAML,GAAUD,CAAS,GAElDE,EAAOG,EAAU,KAAK,GAAG,CAAC,IAAI;AAAA,MAC1B,MAAAE;AAAA,MACA,MAAAE;AAAA,MACA,MAAAD;AAAA,MACA,MAAAE;AAAA,MACA,MAAAJ;AAAA,IAAA;AAAA,EAER;AAEA,SAAOJ;AACX;"}
1
+ {"version":3,"file":"dots.js","sources":["../../src/scatterplot/dots.ts"],"sourcesContent":["import {format} from 'd3-format';\nimport type { DataFrame } from '../DataFrame';\nimport type { ColumnName, DataValue } from '../types';\nimport type { ScatterplotSettingsImpl } from './ScatterplotSettingsImpl';\nimport {formatColumnValue} from './utils/formatColumnValue';\nimport {sortDotsByGrouping} from './utils/sortDotsByGrouping';\n\nexport type Dot = {\n idx: number;\n x: string | number;\n y: string | number;\n label: DataValue | null;\n dimmed: boolean;\n};\n\nexport type GroupedDots = Record<\n string,\n {\n minX: number;\n maxX: number;\n minY: number;\n maxY: number;\n dots: Dot[];\n }\n>;\n\nexport function getDots(\n data: DataFrame,\n facetKeysCombinations: string[][],\n x: ColumnName,\n y: ColumnName,\n label: ColumnName | null,\n highlight: ColumnName | null,\n grouping: ScatterplotSettingsImpl['grouping'],\n xAxis: ScatterplotSettingsImpl['chartSettings']['xAxis'],\n yAxis: ScatterplotSettingsImpl['chartSettings']['yAxis']\n): GroupedDots {\n const result: GroupedDots = {};\n\n const labelFormatter = label?.format ? format(label.format) : undefined;\n\n for (const facetKeys of facetKeysCombinations) {\n const dots: Dot[] = [];\n let minX = Infinity;\n let minY = Infinity;\n let maxX = -Infinity;\n let maxY = -Infinity;\n\n const templateGroupPath = facetKeys.concat(['']);\n const rows = data.getRowsByGrouping(templateGroupPath);\n\n for (let i = 0; i < rows.length; i++) {\n const rowIdx = rows[i];\n const valueX = data.getColumnValue(x.value, rowIdx) as number;\n const valueY = data.getColumnValue(y.value, rowIdx) as number;\n\n if (xAxis.scale !== 'discrete' && (typeof valueX !== 'number' || !isFinite(valueX))) {\n continue;\n }\n if (yAxis.scale !== 'discrete' && (typeof valueY !== 'number' || !isFinite(valueY))) {\n continue;\n }\n\n minX = Math.min(minX, valueX);\n minY = Math.min(minY, valueY);\n maxX = Math.max(maxX, valueX);\n maxY = Math.max(maxY, valueY);\n\n dots.push({\n x: valueX,\n y: valueY,\n label: formatColumnValue(data, rowIdx, label, labelFormatter),\n dimmed: highlight ? !data.getColumnValue(highlight.value, rowIdx) : false,\n idx: rowIdx\n });\n }\n\n sortDotsByGrouping(data, dots, grouping, highlight);\n\n result[facetKeys.join('_')] = {\n minX,\n maxX,\n minY,\n maxY,\n dots,\n };\n }\n\n return result;\n}\n"],"names":["getDots","data","facetKeysCombinations","x","y","label","highlight","grouping","xAxis","yAxis","result","labelFormatter","format","facetKeys","dots","minX","minY","maxX","maxY","templateGroupPath","rows","i","rowIdx","valueX","valueY","formatColumnValue","sortDotsByGrouping"],"mappings":";;;AA0BO,SAASA,EACZC,GACAC,GACAC,GACAC,GACAC,GACAC,GACAC,GACAC,GACAC,GACW;AACX,QAAMC,IAAsB,CAAA,GAEtBC,IAAiBN,KAAA,QAAAA,EAAO,SAASO,EAAOP,EAAM,MAAM,IAAI;AAE9D,aAAWQ,KAAaX,GAAuB;AAC3C,UAAMY,IAAc,CAAA;AACpB,QAAIC,IAAO,OACPC,IAAO,OACPC,IAAO,QACPC,IAAO;AAEX,UAAMC,IAAoBN,EAAU,OAAO,CAAC,EAAE,CAAC,GACzCO,IAAOnB,EAAK,kBAAkBkB,CAAiB;AAErD,aAASE,IAAI,GAAGA,IAAID,EAAK,QAAQC,KAAK;AAClC,YAAMC,IAASF,EAAKC,CAAC,GACfE,IAAStB,EAAK,eAAeE,EAAE,OAAOmB,CAAM,GAC5CE,IAASvB,EAAK,eAAeG,EAAE,OAAOkB,CAAM;AAElD,MAAId,EAAM,UAAU,eAAe,OAAOe,KAAW,YAAY,CAAC,SAASA,CAAM,MAG7Ed,EAAM,UAAU,eAAe,OAAOe,KAAW,YAAY,CAAC,SAASA,CAAM,OAIjFT,IAAO,KAAK,IAAIA,GAAMQ,CAAM,GAC5BP,IAAO,KAAK,IAAIA,GAAMQ,CAAM,GAC5BP,IAAO,KAAK,IAAIA,GAAMM,CAAM,GAC5BL,IAAO,KAAK,IAAIA,GAAMM,CAAM,GAE5BV,EAAK,KAAK;AAAA,QACN,GAAGS;AAAA,QACH,GAAGC;AAAA,QACH,OAAOC,EAAkBxB,GAAMqB,GAAQjB,GAAOM,CAAc;AAAA,QAC5D,QAAQL,IAAY,CAACL,EAAK,eAAeK,EAAU,OAAOgB,CAAM,IAAI;AAAA,QACpE,KAAKA;AAAA,MAAA,CACR;AAAA,IACL;AAEA,IAAAI,EAAmBzB,GAAMa,GAAMP,GAAUD,CAAS,GAElDI,EAAOG,EAAU,KAAK,GAAG,CAAC,IAAI;AAAA,MAC1B,MAAAE;AAAA,MACA,MAAAE;AAAA,MACA,MAAAD;AAAA,MACA,MAAAE;AAAA,MACA,MAAAJ;AAAA,IAAA;AAAA,EAER;AAEA,SAAOJ;AACX;"}