@milaboratories/miplots4 1.0.177 → 1.0.179

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 (45) hide show
  1. package/dist/DataFrame.d.ts +1 -0
  2. package/dist/DataFrame.d.ts.map +1 -1
  3. package/dist/DataFrame.js.map +1 -1
  4. package/dist/bubble/BubbleSettingsImpl.d.ts +2 -0
  5. package/dist/bubble/BubbleSettingsImpl.d.ts.map +1 -1
  6. package/dist/bubble/BubbleSettingsImpl.js +3 -1
  7. package/dist/bubble/BubbleSettingsImpl.js.map +1 -1
  8. package/dist/bubble/getGroupedCellsData.d.ts +1 -1
  9. package/dist/bubble/getGroupedCellsData.d.ts.map +1 -1
  10. package/dist/bubble/getGroupedCellsData.js +30 -10
  11. package/dist/bubble/getGroupedCellsData.js.map +1 -1
  12. package/dist/bubble/index.d.ts.map +1 -1
  13. package/dist/bubble/index.js +3 -3
  14. package/dist/bubble/index.js.map +1 -1
  15. package/dist/heatmap/ChartRenderer.d.ts.map +1 -1
  16. package/dist/heatmap/ChartRenderer.js +26 -20
  17. package/dist/heatmap/ChartRenderer.js.map +1 -1
  18. package/dist/heatmap/HeatmapSettingsImpl.d.ts +2 -0
  19. package/dist/heatmap/HeatmapSettingsImpl.d.ts.map +1 -1
  20. package/dist/heatmap/HeatmapSettingsImpl.js +3 -1
  21. package/dist/heatmap/HeatmapSettingsImpl.js.map +1 -1
  22. package/dist/heatmap/fillCellsData.d.ts +22 -2
  23. package/dist/heatmap/fillCellsData.d.ts.map +1 -1
  24. package/dist/heatmap/fillCellsData.js +60 -47
  25. package/dist/heatmap/fillCellsData.js.map +1 -1
  26. package/dist/heatmap/getCells.d.ts +22 -1
  27. package/dist/heatmap/getCells.d.ts.map +1 -1
  28. package/dist/heatmap/getCells.js +23 -3
  29. package/dist/heatmap/getCells.js.map +1 -1
  30. package/dist/heatmap/getDendrograms.d.ts +5 -1
  31. package/dist/heatmap/getDendrograms.d.ts.map +1 -1
  32. package/dist/heatmap/getDendrograms.js +33 -11
  33. package/dist/heatmap/getDendrograms.js.map +1 -1
  34. package/dist/heatmap/index.d.ts.map +1 -1
  35. package/dist/heatmap/index.js +30 -6
  36. package/dist/heatmap/index.js.map +1 -1
  37. package/dist/types/bubble.d.ts +6 -0
  38. package/dist/types/bubble.d.ts.map +1 -1
  39. package/dist/types/bubble.js +3 -1
  40. package/dist/types/bubble.js.map +1 -1
  41. package/dist/types/heatmap.d.ts +6 -0
  42. package/dist/types/heatmap.d.ts.map +1 -1
  43. package/dist/types/heatmap.js +2 -0
  44. package/dist/types/heatmap.js.map +1 -1
  45. package/package.json +1 -1
@@ -1 +1 @@
1
- {"version":3,"file":"fillCellsData.js","names":[],"sources":["../../src/heatmap/fillCellsData.ts"],"sourcesContent":["import { deviation, extent, mean, quantileSorted, sum } from 'd3-array';\nimport lodash from 'lodash';\nimport type { DataFrame } from '../DataFrame';\nimport type { AggregationMethod, ColumnName, DataValue, NormalizationMethod } from '../types';\nimport type { HeatmapSettingsImpl } from './HeatmapSettingsImpl';\nimport { exhaustive } from '../utils';\nimport { getFacetOrGroupKey } from '../utils/getFacetOrGroupKey';\nimport type { BubbleSettingsImpl } from '../bubble/BubbleSettingsImpl';\nimport { getFacetLabels } from '../discrete/utils/getFacetLabels';\nimport { getFacetStringKey } from '../discrete/utils/getFacetStringKey';\n\nexport type Cell<T extends string> = {\n isCell: true;\n idx: number;\n id: string;\n value: Record<T, DataValue>;\n normalizedValue: Record<T, DataValue>;\n x: DataValue;\n y: DataValue;\n};\n\nexport type GroupedCellsData<T extends string> = {\n meta: {\n valueSources: T[]; // dataSource for heatmap, color and size for bubble - main data for every cell\n\n facetKeys: string[];\n xGroupKeys: string[];\n yGroupKeys: string[];\n\n xKeys: string[];\n yKeys: string[];\n xKeysByGroups: Record<string, string[]>;\n yKeysByGroups: Record<string, string[]>;\n\n // for titles, if facet by more 1 columns title has several values separated by commas\n facetKeyValues: Record<string, string[]>;\n xGroupKeyValues: Record<string, string[]>;\n yGroupKeyValues: Record<string, string[]>;\n\n xLabels: Record<string, string>;\n yLabels: Record<string, string>;\n xGroupLabels: Record<string, string>;\n yGroupLabels: Record<string, string>;\n\n valueExtent: Record<T, [number, number]>; // for color/size scales\n // data for labels, annotations and dendrograms\n xDataByKeys: Record<string, Record<string, DataValue>>;\n yDataByKeys: Record<string, Record<string, DataValue>>;\n };\n //facet groups\n facets: Record<\n string,\n {\n // axis keys\n xKeys: string[];\n yKeys: string[];\n // axis keys grouped by group keys from meta\n xKeysByGroups: Record<string, string[]>;\n yKeysByGroups: Record<string, string[]>;\n // cells grouped by X, then by Y\n cells: Record<string, Record<string, Cell<T>>>;\n }\n >;\n};\n\nfunction normalizeByStd(values: number[]) {\n const stdValue = deviation(values);\n const meanValue = mean(values);\n\n if (stdValue === undefined || meanValue === undefined || stdValue === 0) {\n return (v: number) => v;\n }\n return (v: number) => (v - meanValue) / stdValue;\n}\nfunction normalizeByMinMax(values: number[]) {\n const meanValue = mean(values);\n const [min, max] = extent(values);\n if (meanValue === undefined || min === undefined || max === undefined || max === min) {\n return (v: number) => v;\n }\n return (v: number) => (v - meanValue) / (max - min);\n}\n\nfunction getNormalizationFn(method: NormalizationMethod, values: number[]) {\n if (method === 'standardScaling') {\n return normalizeByStd(values);\n }\n if (method === 'meanNormalization') {\n return normalizeByMinMax(values);\n }\n return (v: number) => v;\n}\n\nfunction aggregateNumeric(method: AggregationMethod, values: number[]) {\n switch (method) {\n case 'max': {\n let res = values[0];\n for (const v of values) {\n res = Math.max(res, v);\n }\n return res;\n }\n case 'min': {\n let res = values[0];\n for (const v of values) {\n res = Math.min(res, v);\n }\n return res;\n }\n case 'median': {\n const valuesSorted = values.sort((a, b) => a - b);\n return quantileSorted(valuesSorted, 0.5) as number;\n }\n case 'mean': {\n return mean(values) ?? values[0];\n }\n case 'sum': {\n return sum(values) as number;\n }\n default: exhaustive(method, `Unknown aggregation function ${method}`);\n }\n}\nfunction aggregateString(values: string[]) {\n const list = [...new Set(values)].sort();\n if (list.length > 3) {\n return [...list.slice(0, 3), '...'].join(', ');\n }\n return list.join(', ');\n}\n\n// all combinations with 1 key from each list\nfunction getKeysCombinations(keysLists: string[][]) {\n if (!keysLists.length) {\n return [];\n }\n let result: string[][] = [[]];\n keysLists.forEach(keys => {\n const nextResult: string[][] = [];\n keys.forEach(key => {\n nextResult.push(...result.map(resultItem => [...resultItem, key]));\n });\n result = nextResult;\n });\n return result;\n}\nconst sortByLabels = (arr: string[], direction: 'asc' | 'desc', labels: Record<string, string> = {}) => {\n return arr.sort((a, b) => direction === 'asc'\n ? (labels[a] ?? a).localeCompare((labels[b] ?? b), 'en', { numeric: true })\n : (labels[b] ?? b).localeCompare((labels[a] ?? a), 'en', { numeric: true })\n );\n};\nfunction applyAggregation<T extends string>(\n result: GroupedCellsData<T>,\n aggregation: HeatmapSettingsImpl['aggregation'],\n additionalDataColumnsX: string[],\n additionalDataColumnsY: string[],\n annotations: HeatmapSettingsImpl['annotations']\n) {\n if (aggregation.x || aggregation.y) {\n const valueExtent: GroupedCellsData<T>['meta']['valueExtent'] = result.meta.valueSources.reduce((r, key) => {\n r[key] = [Infinity, -Infinity] as [number, number];\n return r;\n }, {} as GroupedCellsData<T>['meta']['valueExtent']);\n result.meta.facetKeys.forEach(facetKey => {\n const { xKeys, yKeys, cells, xKeysByGroups, yKeysByGroups } = result.facets[facetKey];\n const xGroups = aggregation.x ? xKeysByGroups : xKeys.reduce((res, xKey) => { res[xKey] = [xKey]; return res; }, {} as Record<string, string[]>);\n const yGroups = aggregation.y ? yKeysByGroups : yKeys.reduce((res, yKey) => { res[yKey] = [yKey]; return res; }, {} as Record<string, string[]>);\n const xNewKeys = Object.keys(xGroups);\n const yNewKeys = Object.keys(yGroups);\n\n for (const xGroupKey of xNewKeys) {\n for (const yGroupKey of yNewKeys) {\n // collect values for aggregation to arrays\n const valuesBySources: Record<T, number[]> = result.meta.valueSources.reduce((r, v) => {\n r[v] = [];\n return r;\n }, {} as Record<T, number[]>);\n xGroups[xGroupKey].forEach((xKey) => {\n yGroups[yGroupKey].forEach((yKey) => {\n for (const valueSource of result.meta.valueSources) {\n const cellValue = cells[xKey]?.[yKey]?.value?.[valueSource];\n if (cellValue !== undefined) {\n valuesBySources[valueSource].push(cellValue as number);\n }\n }\n delete cells[xKey]?.[yKey];\n });\n });\n // create new cells with aggregated values\n for (const valueSource of result.meta.valueSources) {\n const values = valuesBySources[valueSource];\n if (values.length > 0) {\n const value = aggregateNumeric(aggregation.method, values);\n if (!result.facets[facetKey].cells[xGroupKey]) {\n result.facets[facetKey].cells[xGroupKey] = {};\n }\n if (!result.facets[facetKey].cells[xGroupKey][yGroupKey]) {\n result.facets[facetKey].cells[xGroupKey][yGroupKey] = {\n isCell: true,\n idx: 0,\n id: `${xGroupKey}_${yGroupKey}`,\n x: xGroupKey,\n y: yGroupKey,\n value: result.meta.valueSources.reduce((r, v) => { r[v] = null; return r; }, {} as Record<T, DataValue>),\n normalizedValue: result.meta.valueSources.reduce((r, v) => { r[v] = null; return r; }, {} as Record<T, DataValue>),\n };\n }\n const cell = result.facets[facetKey].cells[xGroupKey][yGroupKey];\n cell.value[valueSource] = value;\n cell.normalizedValue[valueSource] = value;\n\n valueExtent[valueSource][0] = Math.min(cell.normalizedValue?.[valueSource], valueExtent[valueSource][0]);\n valueExtent[valueSource][1] = Math.max(cell.normalizedValue?.[valueSource], valueExtent[valueSource][1]);\n }\n }\n }\n }\n // add aggregated values for X annotations\n if (aggregation.x) {\n xNewKeys.forEach(xGroupKey => {\n additionalDataColumnsX.forEach(columnKey => {\n const annotation = annotations.find((v) => v.valueColumn.value === columnKey || v.valueColumn.valueLabels === columnKey);\n if (!annotation) {\n return;\n }\n const values: DataValue[] = [];\n xGroups[xGroupKey].forEach((xKey) => {\n values.push(result.meta.xDataByKeys[columnKey][xKey]);\n delete result.meta.xDataByKeys[columnKey][xKey];\n });\n const value = annotation.type === 'continuous' ? aggregateNumeric(aggregation.method, values as number[]) : aggregateString(values as string[]);\n result.meta.xDataByKeys[columnKey][xGroupKey] = value;\n });\n });\n }\n // add aggregated values for Y annotations\n if (aggregation.y) {\n additionalDataColumnsY.forEach(columnKey => {\n result.meta.yDataByKeys[columnKey] = {};\n });\n yNewKeys.forEach(yGroupKey => {\n additionalDataColumnsY.forEach(columnKey => {\n const annotation = annotations.find((v) => v.valueColumn.value === columnKey || v.valueColumn.valueLabels === columnKey);\n if (!annotation) {\n return;\n }\n const values: DataValue[] = [];\n yGroups[yGroupKey].forEach((yKey) => {\n values.push(result.meta.yDataByKeys[columnKey][yKey]);\n delete result.meta.yDataByKeys[columnKey][yKey];\n });\n const value = annotation.type === 'continuous' ? aggregateNumeric(aggregation.method, values as number[]) : aggregateString(values as string[]);\n result.meta.yDataByKeys[columnKey][yGroupKey] = value;\n });\n });\n }\n // erase grouping - we aggregated by them and now there is no grouping in the chart;\n // replace axis keys with group keys - now group keys are new axis keys\n if (aggregation.x) {\n result.facets[facetKey].xKeys = Object.keys(xKeysByGroups);\n result.facets[facetKey].xKeysByGroups = { 'null': result.facets[facetKey].xKeys };\n result.meta.xLabels = result.meta.xGroupLabels;\n result.meta.xGroupKeys = ['null'];\n result.meta.xGroupKeyValues = { null: ['null'] };\n }\n if (aggregation.y) {\n result.facets[facetKey].yKeys = Object.keys(yKeysByGroups);\n result.facets[facetKey].yKeysByGroups = { 'null': result.facets[facetKey].yKeys };\n result.meta.yLabels = result.meta.yGroupLabels;\n result.meta.yGroupKeys = ['null'];\n result.meta.yGroupKeyValues = { null: ['null'] };\n }\n });\n result.meta.valueExtent = valueExtent;\n }\n}\n\nfunction updateValueExtent<T extends string>(result: GroupedCellsData<T>, cell: Cell<T>) {\n for (const valueSource of result.meta.valueSources) {\n result.meta.valueExtent[valueSource][0] = Math.min(cell.normalizedValue?.[valueSource] as number, result.meta.valueExtent[valueSource][0]);\n result.meta.valueExtent[valueSource][1] = Math.max(cell.normalizedValue?.[valueSource] as number, result.meta.valueExtent[valueSource][1]);\n }\n\n}\nfunction applyNormalization<T extends string>(\n result: GroupedCellsData<T>,\n normalizationBySources: Record<T, HeatmapSettingsImpl['normalization']>,\n) {\n if (Object.values(normalizationBySources).length) {\n const valueExtent: GroupedCellsData<T>['meta']['valueExtent'] = result.meta.valueSources.reduce((r, key) => {\n if (normalizationBySources[key]) {\n r[key] = [Infinity, -Infinity] as [number, number];\n }\n return r;\n }, {} as GroupedCellsData<T>['meta']['valueExtent']);\n result.meta.facetKeys.forEach(facetKey => {\n const { xKeys, yKeys, cells } = result.facets[facetKey];\n\n for (const valueSource of result.meta.valueSources) {\n const normalization = normalizationBySources[valueSource];\n if (!normalization) {\n continue;\n }\n const cellKeys = normalization.direction === 'row' ? xKeys : yKeys;\n const groupKeys = normalization.direction === 'row' ? yKeys : xKeys;\n const cellGetter = normalization.direction === 'row'\n ? (cellKey: string, groupKey: string) => cells[cellKey]?.[groupKey]\n : (cellKey: string, groupKey: string) => cells[groupKey]?.[cellKey];\n groupKeys.forEach((groupKey) => {\n const values: number[] = [];\n cellKeys.forEach((cellKey) => {\n const v = cellGetter(cellKey, groupKey)?.value?.[valueSource];\n if (v !== undefined) {\n values.push(v as number);\n }\n });\n const normalize = getNormalizationFn(normalization.method, values);\n cellKeys.forEach((cellKey) => {\n const cell = cellGetter(cellKey, groupKey);\n if (cell !== undefined) {\n cell.normalizedValue[valueSource] = normalize(cell.value?.[valueSource] as number);\n valueExtent[valueSource][0] = Math.min(cell.normalizedValue?.[valueSource], valueExtent[valueSource][0]);\n valueExtent[valueSource][1] = Math.max(cell.normalizedValue?.[valueSource], valueExtent[valueSource][1]);\n }\n });\n });\n }\n\n });\n result.meta.valueExtent = {...result.meta.valueExtent, valueExtent};\n }\n}\n\nexport function fillCellsData<T extends string>(\n result: GroupedCellsData<T>,\n data: DataFrame,\n xColumn: ColumnName,\n yColumn: ColumnName,\n valueColumns: Record<string, ColumnName>,\n facetBy: ColumnName[],\n xGroupBy: ColumnName[],\n yGroupBy: ColumnName[],\n facetSettings: HeatmapSettingsImpl['facetSettings'],\n annotations: HeatmapSettingsImpl['annotations'],\n dendrogramX: HeatmapSettingsImpl['dendrogramX'],\n dendrogramY: HeatmapSettingsImpl['dendrogramY'],\n normalizationBySource: Record<T, HeatmapSettingsImpl['normalization']>, // separated for color and size for example\n NAValueAs: HeatmapSettingsImpl['NAValueAs'],\n keysOrder: HeatmapSettingsImpl['keysOrder'],\n xAxis: HeatmapSettingsImpl['chartSettings']['xAxis'] | BubbleSettingsImpl['chartSettings']['xAxis'],\n yAxis: HeatmapSettingsImpl['chartSettings']['yAxis'] | BubbleSettingsImpl['chartSettings']['yAxis'],\n aggregation: HeatmapSettingsImpl['aggregation'],\n) {\n const facetKeysLists = facetBy.length\n ? facetBy.map(column => keysOrder[column.value] ?? data.getColumnCategories(column.value))\n : [['null']];\n\n const xGroupKeysLists = xGroupBy.length\n ? xGroupBy.map(column => keysOrder[column.value] ?? data.getColumnCategories(column.value))\n : [['null']];\n const yGroupKeysLists = yGroupBy.length\n ? yGroupBy.map(column => keysOrder[column.value] ?? data.getColumnCategories(column.value))\n : [['null']];\n let facetKeysCombinations = getKeysCombinations(facetKeysLists);\n const xGroupKeysCombinations = getKeysCombinations(xGroupKeysLists);\n const yGroupKeysCombinations = getKeysCombinations(yGroupKeysLists);\n\n if (facetSettings?.order?.length) {\n facetKeysCombinations = facetKeysCombinations.filter(keys => facetSettings.order?.includes(getFacetStringKey(keys)));\n }\n const facetKeys = facetKeysCombinations.map(getFacetOrGroupKey);\n const facetKeysSet = new Set(facetKeys);\n const xGroupKeys = xGroupKeysCombinations.map(getFacetOrGroupKey);\n const yGroupKeys = yGroupKeysCombinations.map(getFacetOrGroupKey);\n\n result.meta.facetKeys = facetKeys;\n result.meta.xGroupKeys = xGroupKeys;\n result.meta.yGroupKeys = yGroupKeys;\n\n const facetLabels = getFacetLabels(data, facetBy, facetKeys, facetKeysCombinations);\n result.meta.facetKeyValues = facetKeys.reduce((res: Record<string, string[]>, key) => {\n res[key] = facetLabels[key];\n return res;\n }, {});\n\n result.meta.xGroupKeyValues = xGroupKeys.reduce((res: Record<string, string[]>, key, index) => {\n res[key] = xGroupKeysCombinations[index];\n return res;\n }, {});\n result.meta.yGroupKeyValues = yGroupKeys.reduce((res: Record<string, string[]>, key, index) => {\n res[key] = yGroupKeysCombinations[index];\n return res;\n }, {});\n\n const xLabelsSource = xColumn.valueLabels ?? xColumn.value;\n const yLabelsSource = yColumn.valueLabels ?? yColumn.value;\n const annotationColumnsX = annotations.filter(item => item.axis === 'x').map(item => item.valueColumn.valueLabels ?? item.valueColumn.value);\n const annotationColumnsY = annotations.filter(item => item.axis === 'y').map(item => item.valueColumn.valueLabels ?? item.valueColumn.value);\n const dendrogramXColumns = Object.values(dendrogramX ?? {}).map(column => column.value);\n const dendrogramYColumns = Object.values(dendrogramY ?? {}).map(column => column.value);\n const additionalDataColumnsX = lodash.uniq([...annotationColumnsX, ...dendrogramXColumns, xLabelsSource]);\n const additionalDataColumnsY = lodash.uniq([...annotationColumnsY, ...dendrogramYColumns, yLabelsSource]);\n\n for (let i = 0; i < data.rowsCount; i++) {\n const facetKey = getFacetOrGroupKey(facetBy.map(column => data.getColumnValue(column.value, i)));\n if (!facetKeysSet.has(facetKey)) {\n continue;\n }\n const xGroupKey = getFacetOrGroupKey(xGroupBy.map(column => data.getColumnValue(column.value, i)));\n const yGroupKey = getFacetOrGroupKey(yGroupBy.map(column => data.getColumnValue(column.value, i)));\n const xGroupLabel = xGroupBy.map(column => data.getColumnValue(column.valueLabels ?? column.value, i)).join(', ');\n const yGroupLabel = yGroupBy.map(column => data.getColumnValue(column.valueLabels ?? column.value, i)).join(', ');\n result.meta.xGroupLabels[xGroupKey] = xGroupLabel;\n result.meta.yGroupLabels[yGroupKey] = yGroupLabel;\n const x = String(data.getColumnValue(xColumn.value, i));\n const y = String(data.getColumnValue(yColumn.value, i));\n\n const values = result.meta.valueSources.reduce((r, key) => {\n r[key] = (data.getColumnValue(valueColumns[key].value, i) ?? NAValueAs) as number | null;\n return r;\n }, {} as Record<string, DataValue>);\n\n if (x === 'null' || y === 'null' || Object.values(values).every(v => v === null)) {\n continue;\n }\n\n if (!result.facets[facetKey]) {\n result.facets[facetKey] = {\n xKeys: [],\n yKeys: [],\n xKeysByGroups: {},\n yKeysByGroups: {},\n cells: {},\n };\n }\n if (!result.facets[facetKey].xKeysByGroups[xGroupKey]) {\n result.facets[facetKey].xKeysByGroups[xGroupKey] = [];\n }\n if (!result.facets[facetKey].yKeysByGroups[yGroupKey]) {\n result.facets[facetKey].yKeysByGroups[yGroupKey] = [];\n }\n result.facets[facetKey].xKeys.push(x);\n result.facets[facetKey].yKeys.push(y);\n result.facets[facetKey].xKeysByGroups[xGroupKey].push(x);\n result.facets[facetKey].yKeysByGroups[yGroupKey].push(y);\n\n if (!result.facets[facetKey].cells[x]) {\n result.facets[facetKey].cells[x] = {};\n }\n\n for (const valueSource of result.meta.valueSources) {\n if (result.facets[facetKey].cells[x][y] && result.facets[facetKey].cells[x][y].value[valueSource] !== values[valueSource]) {\n throw Error(`More than 1 value for x=${x}, y=${y}`);\n }\n }\n\n const xLabelsSourceValue = data.getColumnValue(xLabelsSource, i);\n if (result.meta.xLabels[x] && String(xLabelsSourceValue) !== result.meta.xLabels[x]) {\n throw Error(`More than 1 x-label value for x=${x}`);\n }\n const yLabelsSourceValue = data.getColumnValue(yLabelsSource, i);\n if (result.meta.yLabels[y] && String(yLabelsSourceValue) !== result.meta.yLabels[y]) {\n throw Error(`More than 1 y-label value for y=${y}`);\n }\n result.meta.xLabels[x] = String(xLabelsSourceValue);\n result.meta.yLabels[y] = String(yLabelsSourceValue);\n // data for labels, annotations and dendrograms by X\n additionalDataColumnsX.forEach(columnKey => {\n const isAddedColumn = typeof result.meta.xDataByKeys[columnKey] !== 'undefined';\n const isAddedValue = isAddedColumn && typeof result.meta.xDataByKeys[columnKey][x] !== 'undefined';\n if (!isAddedColumn) {\n result.meta.xDataByKeys[columnKey] = {};\n }\n if (isAddedValue && result.meta.xDataByKeys[columnKey][x] !== data.getColumnValue(columnKey, i)) {\n throw Error(`More than 1 value for x = ${x} and column = ${columnKey}`);\n }\n if (!isAddedValue) {\n result.meta.xDataByKeys[columnKey][x] = data.getColumnValue(columnKey, i);\n }\n });\n // data for labels, annotations and dendrograms by Y\n additionalDataColumnsY.forEach(columnKey => {\n const isAddedColumn = typeof result.meta.yDataByKeys[columnKey] !== 'undefined';\n const isAddedValue = isAddedColumn && typeof result.meta.yDataByKeys[columnKey][y] !== 'undefined';\n if (!isAddedColumn) {\n result.meta.yDataByKeys[columnKey] = {};\n }\n if (isAddedValue && result.meta.yDataByKeys[columnKey][y] !== data.getColumnValue(columnKey, i)) {\n throw Error(`More than 1 value for y = ${y} and column = ${columnKey}`);\n }\n if (!isAddedValue) {\n result.meta.yDataByKeys[columnKey][y] = data.getColumnValue(columnKey, i);\n }\n });\n result.facets[facetKey].cells[x][y] = {\n isCell: true,\n idx: i,\n id: `${x}_${y}`,\n x,\n y,\n value: values,\n normalizedValue: values,\n };\n\n updateValueExtent(result, result.facets[facetKey].cells[x][y]);\n }\n\n result.meta.facetKeys = result.meta.facetKeys.filter((key) => result.facets[key]); // filter only used;\n\n // make uniq x, y, x-group and y-group keys\n result.meta.facetKeys.forEach(facetKey => {\n const facet = result.facets[facetKey];\n const uniqueXKeys = lodash.uniq(facet.xKeys);\n const uniqueYKeys = lodash.uniq(facet.yKeys);\n facet.xKeys = keysOrder[xColumn.value] ? lodash.intersection(keysOrder[xColumn.value], uniqueXKeys) : uniqueXKeys;\n facet.yKeys = keysOrder[yColumn.value] ? lodash.intersection(keysOrder[yColumn.value], uniqueYKeys) : uniqueYKeys;\n xGroupKeys.forEach(xGroupKey => {\n result.facets[facetKey].xKeysByGroups[xGroupKey] = lodash.intersection(\n facet.xKeys,\n result.facets[facetKey].xKeysByGroups[xGroupKey]\n );\n });\n yGroupKeys.forEach(yGroupKey => {\n result.facets[facetKey].yKeysByGroups[yGroupKey] = lodash.intersection(\n facet.yKeys,\n result.facets[facetKey].yKeysByGroups[yGroupKey]\n );\n });\n });\n\n applyAggregation(result, aggregation, additionalDataColumnsX, additionalDataColumnsY, annotations);\n applyNormalization(result, normalizationBySource);\n\n // every facet may contain not all of available keys, but for shared axes it is necessary to have all of them\n result.meta.xKeysByGroups = result.meta.xGroupKeys.reduce((res: Record<string, string[]>, xGroupKey) => {\n const existingXKeys = sortByLabels(lodash.uniq(\n lodash.flatten(result.meta.facetKeys.map(facetKey => result.facets[facetKey].xKeysByGroups[xGroupKey]))\n ), xAxis.sorting, result.meta.xLabels);\n res[xGroupKey] = keysOrder[xColumn.value] ? lodash.intersection(keysOrder[xColumn.value], existingXKeys) : existingXKeys;\n return res;\n }, {});\n result.meta.xKeys = result.meta.xGroupKeys.reduce((res: string[], xGroupKey: string) => {\n res = res.concat(result.meta.xKeysByGroups[xGroupKey]);\n return res;\n }, []);\n\n result.meta.yKeysByGroups = result.meta.yGroupKeys.reduce((res: Record<string, string[]>, yGroupKey) => {\n const existingYKeys = sortByLabels(lodash.uniq(\n lodash.flatten(result.meta.facetKeys.map(facetKey => result.facets[facetKey].yKeysByGroups[yGroupKey]))\n ), yAxis.sorting, result.meta.yLabels);\n res[yGroupKey] = keysOrder[yColumn.value] ? lodash.intersection(keysOrder[yColumn.value], existingYKeys) : existingYKeys;\n return res;\n }, {});\n result.meta.yKeys = result.meta.yGroupKeys.reduce((res: string[], yGroupKey: string) => {\n res = res.concat(result.meta.yKeysByGroups[yGroupKey]);\n return res;\n }, []);\n\n for (const valueSource of result.meta.valueSources) {\n // avoid render errors on empty data\n if (result.meta.valueExtent[valueSource][0] === Infinity) {\n result.meta.valueExtent[valueSource][0] = 0;\n }\n if (result.meta.valueExtent[valueSource][1] === -Infinity) {\n result.meta.valueExtent[valueSource][1] = 0;\n }\n }\n\n result.meta.xLabels['null'] = xColumn.nullValueLabel ?? 'NA';\n result.meta.yLabels['null'] = yColumn.nullValueLabel ?? 'NA';\n result.meta.xGroupLabels['null'] = xGroupBy.map(column => column.nullValueLabel ?? 'NA').join(', ');\n result.meta.yGroupLabels['null'] = yGroupBy.map(column => column.nullValueLabel ?? 'NA').join(', ');\n return result;\n}"],"mappings":"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"}
1
+ {"version":3,"file":"fillCellsData.js","names":[],"sources":["../../src/heatmap/fillCellsData.ts"],"sourcesContent":["import { deviation, extent, mean, quantileSorted, sum } from 'd3-array';\nimport lodash from 'lodash';\nimport type { DataFrame } from '../DataFrame';\nimport type { AggregationMethod, ColumnName, DataValue, NormalizationMethod } from '../types';\nimport type { HeatmapSettingsImpl } from './HeatmapSettingsImpl';\nimport { exhaustive } from '../utils';\nimport { getFacetOrGroupKey } from '../utils/getFacetOrGroupKey';\nimport type { BubbleSettingsImpl } from '../bubble/BubbleSettingsImpl';\nimport { getFacetLabels } from '../discrete/utils/getFacetLabels';\nimport { getFacetStringKey } from '../discrete/utils/getFacetStringKey';\n\nexport type Cell<T extends string> = {\n isCell: true;\n idx: number;\n id: string;\n value: Record<T, DataValue>;\n normalizedValue: Record<T, DataValue>;\n x: DataValue;\n y: DataValue;\n};\n\nexport type GroupedCellsData<T extends string> = {\n meta: {\n valueSources: T[]; // dataSource for heatmap, color and size for bubble - main data for every cell\n\n facetKeys: string[];\n xGroupKeys: string[];\n yGroupKeys: string[];\n\n xKeys: string[];\n yKeys: string[];\n xKeysByGroups: Record<string, string[]>;\n yKeysByGroups: Record<string, string[]>;\n\n // for titles, if facet by more 1 columns title has several values separated by commas\n facetKeyValues: Record<string, string[]>;\n xGroupKeyValues: Record<string, string[]>;\n yGroupKeyValues: Record<string, string[]>;\n\n xLabels: Record<string, string>;\n yLabels: Record<string, string>;\n xGroupLabels: Record<string, string>;\n yGroupLabels: Record<string, string>;\n\n valueExtent: Record<T, [number, number]>; // for color/size scales\n // data for labels, annotations and dendrograms\n xDataByKeys: Record<string, Record<string, DataValue>>;\n yDataByKeys: Record<string, Record<string, DataValue>>;\n };\n //facet groups\n facets: Record<\n string,\n {\n // axis keys\n xKeys: string[];\n yKeys: string[];\n // axis keys grouped by group keys from meta\n xKeysByGroups: Record<string, string[]>;\n yKeysByGroups: Record<string, string[]>;\n // cells grouped by X, then by Y\n cells: Record<string, Record<string, Cell<T>>>;\n }\n >;\n};\n\nfunction normalizeByStd(values: number[]) {\n const stdValue = deviation(values);\n const meanValue = mean(values);\n\n if (stdValue === undefined || meanValue === undefined || stdValue === 0) {\n return (v: number) => v;\n }\n return (v: number) => (v - meanValue) / stdValue;\n}\nfunction normalizeByMinMax(values: number[]) {\n const meanValue = mean(values);\n const [min, max] = extent(values);\n if (meanValue === undefined || min === undefined || max === undefined || max === min) {\n return (v: number) => v;\n }\n return (v: number) => (v - meanValue) / (max - min);\n}\n\nfunction getNormalizationFn(method: NormalizationMethod, values: number[]) {\n if (method === 'standardScaling') {\n return normalizeByStd(values);\n }\n if (method === 'meanNormalization') {\n return normalizeByMinMax(values);\n }\n return (v: number) => v;\n}\n\nfunction aggregateNumeric(method: AggregationMethod, values: number[]) {\n switch (method) {\n case 'max': {\n let res = values[0];\n for (const v of values) {\n res = Math.max(res, v);\n }\n return res;\n }\n case 'min': {\n let res = values[0];\n for (const v of values) {\n res = Math.min(res, v);\n }\n return res;\n }\n case 'median': {\n const valuesSorted = values.sort((a, b) => a - b);\n return quantileSorted(valuesSorted, 0.5) as number;\n }\n case 'mean': {\n return mean(values) ?? values[0];\n }\n case 'sum': {\n return sum(values) as number;\n }\n default: exhaustive(method, `Unknown aggregation function ${method}`);\n }\n}\nfunction aggregateString(values: string[]) {\n const list = [...new Set(values)].sort();\n if (list.length > 3) {\n return [...list.slice(0, 3), '...'].join(', ');\n }\n return list.join(', ');\n}\n\n// all combinations with 1 key from each list\nfunction getKeysCombinations(keysLists: string[][]) {\n if (!keysLists.length) {\n return [];\n }\n let result: string[][] = [[]];\n keysLists.forEach(keys => {\n const nextResult: string[][] = [];\n keys.forEach(key => {\n nextResult.push(...result.map(resultItem => [...resultItem, key]));\n });\n result = nextResult;\n });\n return result;\n}\nconst sortByLabels = (arr: string[], direction: 'asc' | 'desc', labels: Record<string, string> = {}) => {\n return arr.sort((a, b) => direction === 'asc'\n ? (labels[a] ?? a).localeCompare((labels[b] ?? b), 'en', { numeric: true })\n : (labels[b] ?? b).localeCompare((labels[a] ?? a), 'en', { numeric: true })\n );\n};\nfunction applyAggregation<T extends string>(\n result: GroupedCellsData<T>,\n aggregation: HeatmapSettingsImpl['aggregation'],\n additionalDataColumnsX: string[],\n additionalDataColumnsY: string[],\n annotations: HeatmapSettingsImpl['annotations']\n) {\n if (aggregation.x || aggregation.y) {\n const valueExtent: GroupedCellsData<T>['meta']['valueExtent'] = result.meta.valueSources.reduce((r, key) => {\n r[key] = [Infinity, -Infinity] as [number, number];\n return r;\n }, {} as GroupedCellsData<T>['meta']['valueExtent']);\n result.meta.facetKeys.forEach(facetKey => {\n const { xKeys, yKeys, cells, xKeysByGroups, yKeysByGroups } = result.facets[facetKey];\n const xGroups = aggregation.x ? xKeysByGroups : xKeys.reduce((res, xKey) => { res[xKey] = [xKey]; return res; }, {} as Record<string, string[]>);\n const yGroups = aggregation.y ? yKeysByGroups : yKeys.reduce((res, yKey) => { res[yKey] = [yKey]; return res; }, {} as Record<string, string[]>);\n const xNewKeys = Object.keys(xGroups);\n const yNewKeys = Object.keys(yGroups);\n\n for (const xGroupKey of xNewKeys) {\n for (const yGroupKey of yNewKeys) {\n // collect values for aggregation to arrays\n const valuesBySources: Record<T, number[]> = result.meta.valueSources.reduce((r, v) => {\n r[v] = [];\n return r;\n }, {} as Record<T, number[]>);\n xGroups[xGroupKey].forEach((xKey) => {\n yGroups[yGroupKey].forEach((yKey) => {\n for (const valueSource of result.meta.valueSources) {\n const cellValue = cells[xKey]?.[yKey]?.value?.[valueSource];\n if (cellValue !== undefined) {\n valuesBySources[valueSource].push(cellValue as number);\n }\n }\n delete cells[xKey]?.[yKey];\n });\n });\n // create new cells with aggregated values\n for (const valueSource of result.meta.valueSources) {\n const values = valuesBySources[valueSource];\n if (values.length > 0) {\n const value = aggregateNumeric(aggregation.method, values);\n if (!result.facets[facetKey].cells[xGroupKey]) {\n result.facets[facetKey].cells[xGroupKey] = {};\n }\n if (!result.facets[facetKey].cells[xGroupKey][yGroupKey]) {\n result.facets[facetKey].cells[xGroupKey][yGroupKey] = {\n isCell: true,\n idx: 0,\n id: `${xGroupKey}_${yGroupKey}`,\n x: xGroupKey,\n y: yGroupKey,\n value: result.meta.valueSources.reduce((r, v) => { r[v] = null; return r; }, {} as Record<T, DataValue>),\n normalizedValue: result.meta.valueSources.reduce((r, v) => { r[v] = null; return r; }, {} as Record<T, DataValue>),\n };\n }\n const cell = result.facets[facetKey].cells[xGroupKey][yGroupKey];\n cell.value[valueSource] = value;\n cell.normalizedValue[valueSource] = value;\n\n valueExtent[valueSource][0] = Math.min(cell.normalizedValue?.[valueSource], valueExtent[valueSource][0]);\n valueExtent[valueSource][1] = Math.max(cell.normalizedValue?.[valueSource], valueExtent[valueSource][1]);\n }\n }\n }\n }\n // add aggregated values for X annotations\n if (aggregation.x) {\n xNewKeys.forEach(xGroupKey => {\n additionalDataColumnsX.forEach(columnKey => {\n const annotation = annotations.find((v) => v.valueColumn.value === columnKey || v.valueColumn.valueLabels === columnKey);\n if (!annotation) {\n return;\n }\n const values: DataValue[] = [];\n xGroups[xGroupKey].forEach((xKey) => {\n values.push(result.meta.xDataByKeys[columnKey][xKey]);\n delete result.meta.xDataByKeys[columnKey][xKey];\n });\n const value = annotation.type === 'continuous' ? aggregateNumeric(aggregation.method, values as number[]) : aggregateString(values as string[]);\n result.meta.xDataByKeys[columnKey][xGroupKey] = value;\n });\n });\n }\n // add aggregated values for Y annotations\n if (aggregation.y) {\n additionalDataColumnsY.forEach(columnKey => {\n result.meta.yDataByKeys[columnKey] = {};\n });\n yNewKeys.forEach(yGroupKey => {\n additionalDataColumnsY.forEach(columnKey => {\n const annotation = annotations.find((v) => v.valueColumn.value === columnKey || v.valueColumn.valueLabels === columnKey);\n if (!annotation) {\n return;\n }\n const values: DataValue[] = [];\n yGroups[yGroupKey].forEach((yKey) => {\n values.push(result.meta.yDataByKeys[columnKey][yKey]);\n delete result.meta.yDataByKeys[columnKey][yKey];\n });\n const value = annotation.type === 'continuous' ? aggregateNumeric(aggregation.method, values as number[]) : aggregateString(values as string[]);\n result.meta.yDataByKeys[columnKey][yGroupKey] = value;\n });\n });\n }\n // erase grouping - we aggregated by them and now there is no grouping in the chart;\n // replace axis keys with group keys - now group keys are new axis keys\n if (aggregation.x) {\n result.facets[facetKey].xKeys = Object.keys(xKeysByGroups);\n result.facets[facetKey].xKeysByGroups = { 'null': result.facets[facetKey].xKeys };\n result.meta.xLabels = result.meta.xGroupLabels;\n result.meta.xGroupKeys = ['null'];\n result.meta.xGroupKeyValues = { null: ['null'] };\n }\n if (aggregation.y) {\n result.facets[facetKey].yKeys = Object.keys(yKeysByGroups);\n result.facets[facetKey].yKeysByGroups = { 'null': result.facets[facetKey].yKeys };\n result.meta.yLabels = result.meta.yGroupLabels;\n result.meta.yGroupKeys = ['null'];\n result.meta.yGroupKeyValues = { null: ['null'] };\n }\n });\n result.meta.valueExtent = valueExtent;\n }\n}\n\nfunction updateValueExtent<T extends string>(result: GroupedCellsData<T>, cell: Cell<T>) {\n for (const valueSource of result.meta.valueSources) {\n result.meta.valueExtent[valueSource][0] = Math.min(cell.normalizedValue?.[valueSource] as number, result.meta.valueExtent[valueSource][0]);\n result.meta.valueExtent[valueSource][1] = Math.max(cell.normalizedValue?.[valueSource] as number, result.meta.valueExtent[valueSource][1]);\n }\n\n}\nfunction applyNormalization<T extends string>(\n result: GroupedCellsData<T>,\n normalizationBySources: Record<T, HeatmapSettingsImpl['normalization']>,\n) {\n if (Object.values(normalizationBySources).length) {\n const valueExtent: GroupedCellsData<T>['meta']['valueExtent'] = result.meta.valueSources.reduce((r, key) => {\n if (normalizationBySources[key]) {\n r[key] = [Infinity, -Infinity] as [number, number];\n }\n return r;\n }, {} as GroupedCellsData<T>['meta']['valueExtent']);\n result.meta.facetKeys.forEach(facetKey => {\n const { xKeys, yKeys, cells } = result.facets[facetKey];\n\n for (const valueSource of result.meta.valueSources) {\n const normalization = normalizationBySources[valueSource];\n if (!normalization) {\n continue;\n }\n const cellKeys = normalization.direction === 'row' ? xKeys : yKeys;\n const groupKeys = normalization.direction === 'row' ? yKeys : xKeys;\n const cellGetter = normalization.direction === 'row'\n ? (cellKey: string, groupKey: string) => cells[cellKey]?.[groupKey]\n : (cellKey: string, groupKey: string) => cells[groupKey]?.[cellKey];\n groupKeys.forEach((groupKey) => {\n const values: number[] = [];\n cellKeys.forEach((cellKey) => {\n const v = cellGetter(cellKey, groupKey)?.value?.[valueSource];\n if (v !== undefined) {\n values.push(v as number);\n }\n });\n const normalize = getNormalizationFn(normalization.method, values);\n cellKeys.forEach((cellKey) => {\n const cell = cellGetter(cellKey, groupKey);\n if (cell !== undefined) {\n cell.normalizedValue[valueSource] = normalize(cell.value?.[valueSource] as number);\n valueExtent[valueSource][0] = Math.min(cell.normalizedValue?.[valueSource], valueExtent[valueSource][0]);\n valueExtent[valueSource][1] = Math.max(cell.normalizedValue?.[valueSource], valueExtent[valueSource][1]);\n }\n });\n });\n }\n\n });\n result.meta.valueExtent = {...result.meta.valueExtent, valueExtent};\n }\n}\n\nexport function fillCellsData<T extends string>(\n result: GroupedCellsData<T>,\n {\n data,\n xColumn,\n yColumn,\n valueColumns,\n facetBy,\n xGroupBy,\n yGroupBy,\n facetSettings,\n annotations,\n dendrogramX,\n dendrogramY,\n normalizationBySource, // separated for color and size for example\n NAValueAs,\n keysOrder,\n xAxis,\n yAxis,\n aggregation,\n showEmptyRows = false,\n showEmptyColumns = false,\n }: {\n data: DataFrame;\n xColumn: ColumnName;\n yColumn: ColumnName;\n valueColumns: Record<string, ColumnName>;\n facetBy: ColumnName[];\n xGroupBy: ColumnName[];\n yGroupBy: ColumnName[];\n facetSettings: HeatmapSettingsImpl['facetSettings'];\n annotations: HeatmapSettingsImpl['annotations'];\n dendrogramX: HeatmapSettingsImpl['dendrogramX'];\n dendrogramY: HeatmapSettingsImpl['dendrogramY'];\n normalizationBySource: Record<T, HeatmapSettingsImpl['normalization']>;\n NAValueAs: HeatmapSettingsImpl['NAValueAs'];\n keysOrder: HeatmapSettingsImpl['keysOrder'];\n xAxis: HeatmapSettingsImpl['chartSettings']['xAxis'] | BubbleSettingsImpl['chartSettings']['xAxis'];\n yAxis: HeatmapSettingsImpl['chartSettings']['yAxis'] | BubbleSettingsImpl['chartSettings']['yAxis'];\n aggregation: HeatmapSettingsImpl['aggregation'];\n showEmptyRows?: boolean;\n showEmptyColumns?: boolean;\n }\n) {\n const facetKeysLists = facetBy.length\n ? facetBy.map(column => keysOrder[column.value] ?? data.getColumnCategories(column.value))\n : [['null']];\n\n const xGroupKeysLists = xGroupBy.length\n ? xGroupBy.map(column => keysOrder[column.value] ?? data.getColumnCategories(column.value))\n : [['null']];\n const yGroupKeysLists = yGroupBy.length\n ? yGroupBy.map(column => keysOrder[column.value] ?? data.getColumnCategories(column.value))\n : [['null']];\n let facetKeysCombinations = getKeysCombinations(facetKeysLists);\n const xGroupKeysCombinations = getKeysCombinations(xGroupKeysLists);\n const yGroupKeysCombinations = getKeysCombinations(yGroupKeysLists);\n\n if (facetSettings?.order?.length) {\n facetKeysCombinations = facetKeysCombinations.filter(keys => facetSettings.order?.includes(getFacetStringKey(keys)));\n }\n const facetKeys = facetKeysCombinations.map(getFacetOrGroupKey);\n const facetKeysSet = new Set(facetKeys);\n const xGroupKeys = xGroupKeysCombinations.map(getFacetOrGroupKey);\n const yGroupKeys = yGroupKeysCombinations.map(getFacetOrGroupKey);\n\n result.meta.facetKeys = facetKeys;\n result.meta.xGroupKeys = xGroupKeys;\n result.meta.yGroupKeys = yGroupKeys;\n\n const facetLabels = getFacetLabels(data, facetBy, facetKeys, facetKeysCombinations);\n result.meta.facetKeyValues = facetKeys.reduce((res: Record<string, string[]>, key) => {\n res[key] = facetLabels[key];\n return res;\n }, {});\n\n result.meta.xGroupKeyValues = xGroupKeys.reduce((res: Record<string, string[]>, key, index) => {\n res[key] = xGroupKeysCombinations[index];\n return res;\n }, {});\n result.meta.yGroupKeyValues = yGroupKeys.reduce((res: Record<string, string[]>, key, index) => {\n res[key] = yGroupKeysCombinations[index];\n return res;\n }, {});\n\n const xLabelsSource = xColumn.valueLabels ?? xColumn.value;\n const yLabelsSource = yColumn.valueLabels ?? yColumn.value;\n const annotationColumnsX = annotations.filter(item => item.axis === 'x').map(item => item.valueColumn.valueLabels ?? item.valueColumn.value);\n const annotationColumnsY = annotations.filter(item => item.axis === 'y').map(item => item.valueColumn.valueLabels ?? item.valueColumn.value);\n const dendrogramXColumns = Object.values(dendrogramX ?? {}).map(column => column.value);\n const dendrogramYColumns = Object.values(dendrogramY ?? {}).map(column => column.value);\n const additionalDataColumnsX = lodash.uniq([...annotationColumnsX, ...dendrogramXColumns, xLabelsSource]);\n const additionalDataColumnsY = lodash.uniq([...annotationColumnsY, ...dendrogramYColumns, yLabelsSource]);\n\n for (let i = 0; i < data.rowsCount; i++) {\n const facetKey = getFacetOrGroupKey(facetBy.map(column => data.getColumnValue(column.value, i)));\n if (!facetKeysSet.has(facetKey)) {\n continue;\n }\n const xGroupKey = getFacetOrGroupKey(xGroupBy.map(column => data.getColumnValue(column.value, i)));\n const yGroupKey = getFacetOrGroupKey(yGroupBy.map(column => data.getColumnValue(column.value, i)));\n const xGroupLabel = xGroupBy.map(column => data.getColumnValue(column.valueLabels ?? column.value, i)).join(', ');\n const yGroupLabel = yGroupBy.map(column => data.getColumnValue(column.valueLabels ?? column.value, i)).join(', ');\n result.meta.xGroupLabels[xGroupKey] = xGroupLabel;\n result.meta.yGroupLabels[yGroupKey] = yGroupLabel;\n const x = String(data.getColumnValue(xColumn.value, i));\n const y = String(data.getColumnValue(yColumn.value, i));\n\n const values = result.meta.valueSources.reduce((r, key) => {\n r[key] = (data.getColumnValue(valueColumns[key].value, i) ?? NAValueAs) as number | null;\n return r;\n }, {} as Record<string, DataValue>);\n\n if (x === 'null' || y === 'null') {\n continue;\n }\n\n const allValuesNull = Object.values(values).every(v => v === null);\n\n if (allValuesNull && !showEmptyRows && !showEmptyColumns) {\n continue;\n }\n\n if (!result.facets[facetKey]) {\n result.facets[facetKey] = {\n xKeys: [],\n yKeys: [],\n xKeysByGroups: {},\n yKeysByGroups: {},\n cells: {},\n };\n }\n if (!result.facets[facetKey].xKeysByGroups[xGroupKey]) {\n result.facets[facetKey].xKeysByGroups[xGroupKey] = [];\n }\n if (!result.facets[facetKey].yKeysByGroups[yGroupKey]) {\n result.facets[facetKey].yKeysByGroups[yGroupKey] = [];\n }\n\n if (!allValuesNull || showEmptyColumns) {\n result.facets[facetKey].xKeys.push(x);\n result.facets[facetKey].xKeysByGroups[xGroupKey].push(x);\n const xLabelsSourceValue = data.getColumnValue(xLabelsSource, i);\n if (result.meta.xLabels[x] && String(xLabelsSourceValue) !== result.meta.xLabels[x]) {\n throw Error(`More than 1 x-label value for x=${x}`);\n }\n result.meta.xLabels[x] = String(xLabelsSourceValue);\n additionalDataColumnsX.forEach(columnKey => {\n const isAddedColumn = typeof result.meta.xDataByKeys[columnKey] !== 'undefined';\n const isAddedValue = isAddedColumn && typeof result.meta.xDataByKeys[columnKey][x] !== 'undefined';\n if (!isAddedColumn) {\n result.meta.xDataByKeys[columnKey] = {};\n }\n if (isAddedValue && result.meta.xDataByKeys[columnKey][x] !== data.getColumnValue(columnKey, i)) {\n throw Error(`More than 1 value for x = ${x} and column = ${columnKey}`);\n }\n if (!isAddedValue) {\n result.meta.xDataByKeys[columnKey][x] = data.getColumnValue(columnKey, i);\n }\n });\n }\n\n if (!allValuesNull || showEmptyRows) {\n result.facets[facetKey].yKeys.push(y);\n result.facets[facetKey].yKeysByGroups[yGroupKey].push(y);\n const yLabelsSourceValue = data.getColumnValue(yLabelsSource, i);\n if (result.meta.yLabels[y] && String(yLabelsSourceValue) !== result.meta.yLabels[y]) {\n throw Error(`More than 1 y-label value for y=${y}`);\n }\n result.meta.yLabels[y] = String(yLabelsSourceValue);\n additionalDataColumnsY.forEach(columnKey => {\n const isAddedColumn = typeof result.meta.yDataByKeys[columnKey] !== 'undefined';\n const isAddedValue = isAddedColumn && typeof result.meta.yDataByKeys[columnKey][y] !== 'undefined';\n if (!isAddedColumn) {\n result.meta.yDataByKeys[columnKey] = {};\n }\n if (isAddedValue && result.meta.yDataByKeys[columnKey][y] !== data.getColumnValue(columnKey, i)) {\n throw Error(`More than 1 value for y = ${y} and column = ${columnKey}`);\n }\n if (!isAddedValue) {\n result.meta.yDataByKeys[columnKey][y] = data.getColumnValue(columnKey, i);\n }\n });\n }\n\n if (allValuesNull) {\n continue;\n }\n\n if (!result.facets[facetKey].cells[x]) {\n result.facets[facetKey].cells[x] = {};\n }\n\n for (const valueSource of result.meta.valueSources) {\n if (result.facets[facetKey].cells[x][y] && result.facets[facetKey].cells[x][y].value[valueSource] !== values[valueSource]) {\n throw Error(`More than 1 value for x=${x}, y=${y}`);\n }\n }\n\n result.facets[facetKey].cells[x][y] = {\n isCell: true,\n idx: i,\n id: `${x}_${y}`,\n x,\n y,\n value: values,\n normalizedValue: values,\n };\n\n updateValueExtent(result, result.facets[facetKey].cells[x][y]);\n }\n\n result.meta.facetKeys = result.meta.facetKeys.filter((key) => result.facets[key]); // filter only used;\n\n // make uniq x, y, x-group and y-group keys\n result.meta.facetKeys.forEach(facetKey => {\n const facet = result.facets[facetKey];\n const uniqueXKeys = lodash.uniq(facet.xKeys);\n const uniqueYKeys = lodash.uniq(facet.yKeys);\n facet.xKeys = keysOrder[xColumn.value] ? lodash.intersection(keysOrder[xColumn.value], uniqueXKeys) : uniqueXKeys;\n facet.yKeys = keysOrder[yColumn.value] ? lodash.intersection(keysOrder[yColumn.value], uniqueYKeys) : uniqueYKeys;\n xGroupKeys.forEach(xGroupKey => {\n result.facets[facetKey].xKeysByGroups[xGroupKey] = lodash.intersection(\n facet.xKeys,\n result.facets[facetKey].xKeysByGroups[xGroupKey]\n );\n });\n yGroupKeys.forEach(yGroupKey => {\n result.facets[facetKey].yKeysByGroups[yGroupKey] = lodash.intersection(\n facet.yKeys,\n result.facets[facetKey].yKeysByGroups[yGroupKey]\n );\n });\n });\n\n applyAggregation(result, aggregation, additionalDataColumnsX, additionalDataColumnsY, annotations);\n applyNormalization(result, normalizationBySource);\n\n // every facet may contain not all of available keys, but for shared axes it is necessary to have all of them\n result.meta.xKeysByGroups = result.meta.xGroupKeys.reduce((res: Record<string, string[]>, xGroupKey) => {\n const existingXKeys = sortByLabels(lodash.uniq(\n lodash.flatten(result.meta.facetKeys.map(facetKey => result.facets[facetKey].xKeysByGroups[xGroupKey]))\n ), xAxis.sorting, result.meta.xLabels);\n res[xGroupKey] = keysOrder[xColumn.value] ? lodash.intersection(keysOrder[xColumn.value], existingXKeys) : existingXKeys;\n return res;\n }, {});\n result.meta.xKeys = result.meta.xGroupKeys.reduce((res: string[], xGroupKey: string) => {\n res = res.concat(result.meta.xKeysByGroups[xGroupKey]);\n return res;\n }, []);\n\n result.meta.yKeysByGroups = result.meta.yGroupKeys.reduce((res: Record<string, string[]>, yGroupKey) => {\n const existingYKeys = sortByLabels(lodash.uniq(\n lodash.flatten(result.meta.facetKeys.map(facetKey => result.facets[facetKey].yKeysByGroups[yGroupKey]))\n ), yAxis.sorting, result.meta.yLabels);\n res[yGroupKey] = keysOrder[yColumn.value] ? lodash.intersection(keysOrder[yColumn.value], existingYKeys) : existingYKeys;\n return res;\n }, {});\n result.meta.yKeys = result.meta.yGroupKeys.reduce((res: string[], yGroupKey: string) => {\n res = res.concat(result.meta.yKeysByGroups[yGroupKey]);\n return res;\n }, []);\n\n for (const valueSource of result.meta.valueSources) {\n // avoid render errors on empty data\n if (result.meta.valueExtent[valueSource][0] === Infinity) {\n result.meta.valueExtent[valueSource][0] = 0;\n }\n if (result.meta.valueExtent[valueSource][1] === -Infinity) {\n result.meta.valueExtent[valueSource][1] = 0;\n }\n }\n\n result.meta.xLabels['null'] = xColumn.nullValueLabel ?? 'NA';\n result.meta.yLabels['null'] = yColumn.nullValueLabel ?? 'NA';\n result.meta.xGroupLabels['null'] = xGroupBy.map(column => column.nullValueLabel ?? 'NA').join(', ');\n result.meta.yGroupLabels['null'] = yGroupBy.map(column => column.nullValueLabel ?? 'NA').join(', ');\n return result;\n}"],"mappings":"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"}
@@ -4,5 +4,26 @@ import { HeatmapSettingsImpl } from './HeatmapSettingsImpl';
4
4
  import { Cell, GroupedCellsData } from './fillCellsData';
5
5
  export type CellHeatmap = Cell<'dataSource'>;
6
6
  export type GroupedCellsHeatmap = GroupedCellsData<'dataSource'>;
7
- export declare function getCells(data: DataFrame, xColumn: ColumnName, yColumn: ColumnName, valueColumns: Record<string, ColumnName>, facetBy: ColumnName[], xGroupBy: ColumnName[], yGroupBy: ColumnName[], facetSettings: HeatmapSettingsImpl['facetSettings'], annotations: HeatmapSettingsImpl['annotations'], dendrogramX: HeatmapSettingsImpl['dendrogramX'], dendrogramY: HeatmapSettingsImpl['dendrogramY'], normalization: HeatmapSettingsImpl['normalization'], NAValueAs: HeatmapSettingsImpl['NAValueAs'], keysOrder: HeatmapSettingsImpl['keysOrder'], xAxis: HeatmapSettingsImpl['chartSettings']['xAxis'], yAxis: HeatmapSettingsImpl['chartSettings']['yAxis'], aggregation: HeatmapSettingsImpl['aggregation']): GroupedCellsHeatmap;
7
+ export declare function createEmptyGroupedCells(): GroupedCellsHeatmap;
8
+ export declare function getCells({ data, xColumn, yColumn, valueColumns, facetBy, xGroupBy, yGroupBy, facetSettings, annotations, dendrogramX, dendrogramY, normalization, NAValueAs, keysOrder, xAxis, yAxis, aggregation, showEmptyRows, showEmptyColumns, }: {
9
+ data: DataFrame;
10
+ xColumn: ColumnName;
11
+ yColumn: ColumnName;
12
+ valueColumns: Record<string, ColumnName>;
13
+ facetBy: ColumnName[];
14
+ xGroupBy: ColumnName[];
15
+ yGroupBy: ColumnName[];
16
+ facetSettings: HeatmapSettingsImpl['facetSettings'];
17
+ annotations: HeatmapSettingsImpl['annotations'];
18
+ dendrogramX: HeatmapSettingsImpl['dendrogramX'];
19
+ dendrogramY: HeatmapSettingsImpl['dendrogramY'];
20
+ normalization: HeatmapSettingsImpl['normalization'];
21
+ NAValueAs: HeatmapSettingsImpl['NAValueAs'];
22
+ keysOrder: HeatmapSettingsImpl['keysOrder'];
23
+ xAxis: HeatmapSettingsImpl['chartSettings']['xAxis'];
24
+ yAxis: HeatmapSettingsImpl['chartSettings']['yAxis'];
25
+ aggregation: HeatmapSettingsImpl['aggregation'];
26
+ showEmptyRows?: boolean;
27
+ showEmptyColumns?: boolean;
28
+ }): GroupedCellsHeatmap;
8
29
  //# sourceMappingURL=getCells.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"getCells.d.ts","sourceRoot":"","sources":["../../src/heatmap/getCells.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,cAAc,CAAC;AAC9C,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,UAAU,CAAC;AAC3C,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,uBAAuB,CAAC;AACjE,OAAO,KAAK,EAAE,IAAI,EAAE,gBAAgB,EAAE,MAAM,iBAAiB,CAAC;AAG9D,MAAM,MAAM,WAAW,GAAG,IAAI,CAAC,YAAY,CAAC,CAAA;AAC5C,MAAM,MAAM,mBAAmB,GAAG,gBAAgB,CAAC,YAAY,CAAC,CAAC;AA4BjE,wBAAgB,QAAQ,CACpB,IAAI,EAAE,SAAS,EACf,OAAO,EAAE,UAAU,EACnB,OAAO,EAAE,UAAU,EACnB,YAAY,EAAE,MAAM,CAAC,MAAM,EAAE,UAAU,CAAC,EACxC,OAAO,EAAE,UAAU,EAAE,EACrB,QAAQ,EAAE,UAAU,EAAE,EACtB,QAAQ,EAAE,UAAU,EAAE,EACtB,aAAa,EAAE,mBAAmB,CAAC,eAAe,CAAC,EACnD,WAAW,EAAE,mBAAmB,CAAC,aAAa,CAAC,EAC/C,WAAW,EAAE,mBAAmB,CAAC,aAAa,CAAC,EAC/C,WAAW,EAAE,mBAAmB,CAAC,aAAa,CAAC,EAC/C,aAAa,EAAE,mBAAmB,CAAC,eAAe,CAAC,EACnD,SAAS,EAAE,mBAAmB,CAAC,WAAW,CAAC,EAC3C,SAAS,EAAE,mBAAmB,CAAC,WAAW,CAAC,EAC3C,KAAK,EAAE,mBAAmB,CAAC,eAAe,CAAC,CAAC,OAAO,CAAC,EACpD,KAAK,EAAE,mBAAmB,CAAC,eAAe,CAAC,CAAC,OAAO,CAAC,EACpD,WAAW,EAAE,mBAAmB,CAAC,aAAa,CAAC,GAChD,mBAAmB,CAkBrB"}
1
+ {"version":3,"file":"getCells.d.ts","sourceRoot":"","sources":["../../src/heatmap/getCells.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,cAAc,CAAC;AAC9C,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,UAAU,CAAC;AAC3C,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,uBAAuB,CAAC;AACjE,OAAO,KAAK,EAAE,IAAI,EAAE,gBAAgB,EAAE,MAAM,iBAAiB,CAAC;AAG9D,MAAM,MAAM,WAAW,GAAG,IAAI,CAAC,YAAY,CAAC,CAAA;AAC5C,MAAM,MAAM,mBAAmB,GAAG,gBAAgB,CAAC,YAAY,CAAC,CAAC;AAEjE,wBAAgB,uBAAuB,IAAI,mBAAmB,CAwB7D;AAED,wBAAgB,QAAQ,CAAC,EACrB,IAAI,EACJ,OAAO,EACP,OAAO,EACP,YAAY,EACZ,OAAO,EACP,QAAQ,EACR,QAAQ,EACR,aAAa,EACb,WAAW,EACX,WAAW,EACX,WAAW,EACX,aAAa,EACb,SAAS,EACT,SAAS,EACT,KAAK,EACL,KAAK,EACL,WAAW,EACX,aAAqB,EACrB,gBAAwB,GAC3B,EAAE;IACC,IAAI,EAAE,SAAS,CAAC;IAChB,OAAO,EAAE,UAAU,CAAC;IACpB,OAAO,EAAE,UAAU,CAAC;IACpB,YAAY,EAAE,MAAM,CAAC,MAAM,EAAE,UAAU,CAAC,CAAC;IACzC,OAAO,EAAE,UAAU,EAAE,CAAC;IACtB,QAAQ,EAAE,UAAU,EAAE,CAAC;IACvB,QAAQ,EAAE,UAAU,EAAE,CAAC;IACvB,aAAa,EAAE,mBAAmB,CAAC,eAAe,CAAC,CAAC;IACpD,WAAW,EAAE,mBAAmB,CAAC,aAAa,CAAC,CAAC;IAChD,WAAW,EAAE,mBAAmB,CAAC,aAAa,CAAC,CAAC;IAChD,WAAW,EAAE,mBAAmB,CAAC,aAAa,CAAC,CAAC;IAChD,aAAa,EAAE,mBAAmB,CAAC,eAAe,CAAC,CAAC;IACpD,SAAS,EAAE,mBAAmB,CAAC,WAAW,CAAC,CAAC;IAC5C,SAAS,EAAE,mBAAmB,CAAC,WAAW,CAAC,CAAC;IAC5C,KAAK,EAAE,mBAAmB,CAAC,eAAe,CAAC,CAAC,OAAO,CAAC,CAAC;IACrD,KAAK,EAAE,mBAAmB,CAAC,eAAe,CAAC,CAAC,OAAO,CAAC,CAAC;IACrD,WAAW,EAAE,mBAAmB,CAAC,aAAa,CAAC,CAAC;IAChD,aAAa,CAAC,EAAE,OAAO,CAAC;IACxB,gBAAgB,CAAC,EAAE,OAAO,CAAC;CAC9B,GAAG,mBAAmB,CAmBtB"}
@@ -24,9 +24,29 @@ function t() {
24
24
  facets: {}
25
25
  };
26
26
  }
27
- function n(n, r, i, a, o, s, c, l, u, d, f, p, m, h, g, _, v) {
28
- let y = t();
29
- return e(y, n, r, i, a, o, s, c, l, u, d, f, { dataSource: p }, m, h, g, _, v), y;
27
+ function n({ data: n, xColumn: r, yColumn: i, valueColumns: a, facetBy: o, xGroupBy: s, yGroupBy: c, facetSettings: l, annotations: u, dendrogramX: d, dendrogramY: f, normalization: p, NAValueAs: m, keysOrder: h, xAxis: g, yAxis: _, aggregation: v, showEmptyRows: y = !1, showEmptyColumns: b = !1 }) {
28
+ let x = t();
29
+ return e(x, {
30
+ data: n,
31
+ xColumn: r,
32
+ yColumn: i,
33
+ valueColumns: a,
34
+ facetBy: o,
35
+ xGroupBy: s,
36
+ yGroupBy: c,
37
+ facetSettings: l,
38
+ annotations: u,
39
+ dendrogramX: d,
40
+ dendrogramY: f,
41
+ normalizationBySource: { dataSource: p },
42
+ NAValueAs: m,
43
+ keysOrder: h,
44
+ xAxis: g,
45
+ yAxis: _,
46
+ aggregation: v,
47
+ showEmptyRows: y,
48
+ showEmptyColumns: b
49
+ }), x;
30
50
  }
31
51
  export { n as getCells };
32
52
 
@@ -1 +1 @@
1
- {"version":3,"file":"getCells.js","names":[],"sources":["../../src/heatmap/getCells.ts"],"sourcesContent":["import type { DataFrame } from '../DataFrame';\nimport type { ColumnName } from '../types';\nimport type { HeatmapSettingsImpl } from './HeatmapSettingsImpl';\nimport type { Cell, GroupedCellsData } from './fillCellsData';\nimport { fillCellsData } from './fillCellsData';\n\nexport type CellHeatmap = Cell<'dataSource'>\nexport type GroupedCellsHeatmap = GroupedCellsData<'dataSource'>;\n\nfunction createEmptyGroupedCells(): GroupedCellsHeatmap {\n return {\n meta: {\n valueSources: ['dataSource'],\n facetKeys: [],\n xKeys: [],\n yKeys: [],\n xGroupKeys: [],\n yGroupKeys: [],\n xKeysByGroups: {},\n yKeysByGroups: {},\n xLabels: {},\n yLabels: {},\n xGroupLabels: {},\n yGroupLabels: {},\n xDataByKeys: {},\n yDataByKeys: {},\n facetKeyValues: {},\n xGroupKeyValues: {},\n yGroupKeyValues: {},\n valueExtent: { dataSource: [Infinity, -Infinity] },\n },\n facets: {},\n };\n}\n\nexport function getCells(\n data: DataFrame,\n xColumn: ColumnName,\n yColumn: ColumnName,\n valueColumns: Record<string, ColumnName>,\n facetBy: ColumnName[],\n xGroupBy: ColumnName[],\n yGroupBy: ColumnName[],\n facetSettings: HeatmapSettingsImpl['facetSettings'],\n annotations: HeatmapSettingsImpl['annotations'],\n dendrogramX: HeatmapSettingsImpl['dendrogramX'],\n dendrogramY: HeatmapSettingsImpl['dendrogramY'],\n normalization: HeatmapSettingsImpl['normalization'],\n NAValueAs: HeatmapSettingsImpl['NAValueAs'],\n keysOrder: HeatmapSettingsImpl['keysOrder'],\n xAxis: HeatmapSettingsImpl['chartSettings']['xAxis'],\n yAxis: HeatmapSettingsImpl['chartSettings']['yAxis'],\n aggregation: HeatmapSettingsImpl['aggregation'],\n): GroupedCellsHeatmap {\n const result: GroupedCellsHeatmap = createEmptyGroupedCells();\n fillCellsData(\n result,\n data,\n xColumn, yColumn, valueColumns,\n facetBy, xGroupBy, yGroupBy,\n facetSettings,\n annotations,\n dendrogramX, dendrogramY,\n {dataSource: normalization},\n NAValueAs,\n keysOrder,\n xAxis,\n yAxis,\n aggregation\n );\n return result;\n}\n"],"mappings":";AASA,SAAS,IAA+C;AACpD,QAAO;EACH,MAAM;GACF,cAAc,CAAC,aAAa;GAC5B,WAAW,EAAE;GACb,OAAO,EAAE;GACT,OAAO,EAAE;GACT,YAAY,EAAE;GACd,YAAY,EAAE;GACd,eAAe,EAAE;GACjB,eAAe,EAAE;GACjB,SAAS,EAAE;GACX,SAAS,EAAE;GACX,cAAc,EAAE;GAChB,cAAc,EAAE;GAChB,aAAa,EAAE;GACf,aAAa,EAAE;GACf,gBAAgB,EAAE;GAClB,iBAAiB,EAAE;GACnB,iBAAiB,EAAE;GACnB,aAAa,EAAE,YAAY,CAAC,UAAU,UAAU,EAAE;GACrD;EACD,QAAQ,EAAE;EACb;;AAGL,SAAgB,EACZ,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACmB;CACnB,IAAM,IAA8B,GAAyB;AAgB7D,QAfA,EACI,GACA,GACA,GAAS,GAAS,GAClB,GAAS,GAAU,GACnB,GACA,GACA,GAAa,GACb,EAAC,YAAY,GAAc,EAC3B,GACA,GACA,GACA,GACA,EACH,EACM"}
1
+ {"version":3,"file":"getCells.js","names":[],"sources":["../../src/heatmap/getCells.ts"],"sourcesContent":["import type { DataFrame } from '../DataFrame';\nimport type { ColumnName } from '../types';\nimport type { HeatmapSettingsImpl } from './HeatmapSettingsImpl';\nimport type { Cell, GroupedCellsData } from './fillCellsData';\nimport { fillCellsData } from './fillCellsData';\n\nexport type CellHeatmap = Cell<'dataSource'>\nexport type GroupedCellsHeatmap = GroupedCellsData<'dataSource'>;\n\nexport function createEmptyGroupedCells(): GroupedCellsHeatmap {\n return {\n meta: {\n valueSources: ['dataSource'],\n facetKeys: [],\n xKeys: [],\n yKeys: [],\n xGroupKeys: [],\n yGroupKeys: [],\n xKeysByGroups: {},\n yKeysByGroups: {},\n xLabels: {},\n yLabels: {},\n xGroupLabels: {},\n yGroupLabels: {},\n xDataByKeys: {},\n yDataByKeys: {},\n facetKeyValues: {},\n xGroupKeyValues: {},\n yGroupKeyValues: {},\n valueExtent: { dataSource: [Infinity, -Infinity] },\n },\n facets: {},\n };\n}\n\nexport function getCells({\n data,\n xColumn,\n yColumn,\n valueColumns,\n facetBy,\n xGroupBy,\n yGroupBy,\n facetSettings,\n annotations,\n dendrogramX,\n dendrogramY,\n normalization,\n NAValueAs,\n keysOrder,\n xAxis,\n yAxis,\n aggregation,\n showEmptyRows = false,\n showEmptyColumns = false,\n}: {\n data: DataFrame;\n xColumn: ColumnName;\n yColumn: ColumnName;\n valueColumns: Record<string, ColumnName>;\n facetBy: ColumnName[];\n xGroupBy: ColumnName[];\n yGroupBy: ColumnName[];\n facetSettings: HeatmapSettingsImpl['facetSettings'];\n annotations: HeatmapSettingsImpl['annotations'];\n dendrogramX: HeatmapSettingsImpl['dendrogramX'];\n dendrogramY: HeatmapSettingsImpl['dendrogramY'];\n normalization: HeatmapSettingsImpl['normalization'];\n NAValueAs: HeatmapSettingsImpl['NAValueAs'];\n keysOrder: HeatmapSettingsImpl['keysOrder'];\n xAxis: HeatmapSettingsImpl['chartSettings']['xAxis'];\n yAxis: HeatmapSettingsImpl['chartSettings']['yAxis'];\n aggregation: HeatmapSettingsImpl['aggregation'];\n showEmptyRows?: boolean;\n showEmptyColumns?: boolean;\n}): GroupedCellsHeatmap {\n const result: GroupedCellsHeatmap = createEmptyGroupedCells();\n fillCellsData(result, {\n data,\n xColumn, yColumn, valueColumns,\n facetBy, xGroupBy, yGroupBy,\n facetSettings,\n annotations,\n dendrogramX, dendrogramY,\n normalizationBySource: { dataSource: normalization },\n NAValueAs,\n keysOrder,\n xAxis,\n yAxis,\n aggregation,\n showEmptyRows,\n showEmptyColumns,\n });\n return result;\n}\n"],"mappings":";AASA,SAAgB,IAA+C;AAC3D,QAAO;EACH,MAAM;GACF,cAAc,CAAC,aAAa;GAC5B,WAAW,EAAE;GACb,OAAO,EAAE;GACT,OAAO,EAAE;GACT,YAAY,EAAE;GACd,YAAY,EAAE;GACd,eAAe,EAAE;GACjB,eAAe,EAAE;GACjB,SAAS,EAAE;GACX,SAAS,EAAE;GACX,cAAc,EAAE;GAChB,cAAc,EAAE;GAChB,aAAa,EAAE;GACf,aAAa,EAAE;GACf,gBAAgB,EAAE;GAClB,iBAAiB,EAAE;GACnB,iBAAiB,EAAE;GACnB,aAAa,EAAE,YAAY,CAAC,UAAU,UAAU,EAAE;GACrD;EACD,QAAQ,EAAE;EACb;;AAGL,SAAgB,EAAS,EACrB,SACA,YACA,YACA,iBACA,YACA,aACA,aACA,kBACA,gBACA,gBACA,gBACA,kBACA,cACA,cACA,UACA,UACA,gBACA,mBAAgB,IAChB,sBAAmB,MAqBC;CACpB,IAAM,IAA8B,GAAyB;AAiB7D,QAhBA,EAAc,GAAQ;EAClB;EACA;EAAS;EAAS;EAClB;EAAS;EAAU;EACnB;EACA;EACA;EAAa;EACb,uBAAuB,EAAE,YAAY,GAAe;EACpD;EACA;EACA;EACA;EACA;EACA;EACA;EACH,CAAC,EACK"}
@@ -6,5 +6,9 @@ export type DendrogramsData = Record<string, {
6
6
  hierarchyByGroupX: Record<string, HierarchyNode<Cluster>>;
7
7
  hierarchyByGroupY: Record<string, HierarchyNode<Cluster>>;
8
8
  }>;
9
- export declare function getDendrograms(groupedCellsData: GroupedCellsHeatmap, dendrogramX: HeatmapSettingsImpl['dendrogramX'], dendrogramY: HeatmapSettingsImpl['dendrogramY']): Promise<DendrogramsData>;
9
+ export declare function getDendrograms({ groupedCellsData, dendrogramX, dendrogramY, }: {
10
+ groupedCellsData: GroupedCellsHeatmap;
11
+ dendrogramX: HeatmapSettingsImpl['dendrogramX'];
12
+ dendrogramY: HeatmapSettingsImpl['dendrogramY'];
13
+ }): Promise<DendrogramsData>;
10
14
  //# sourceMappingURL=getDendrograms.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"getDendrograms.d.ts","sourceRoot":"","sources":["../../src/heatmap/getDendrograms.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,oBAAoB,CAAC;AAClD,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,YAAY,CAAC;AACtD,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,uBAAuB,CAAC;AACjE,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,cAAc,CAAC;AAMlD,MAAM,MAAM,eAAe,GAAG,MAAM,CAAC,MAAM,EAAE;IACzC,iBAAiB,EAAE,MAAM,CAAC,MAAM,EAAE,aAAa,CAAC,OAAO,CAAC,CAAC,CAAC;IAC1D,iBAAiB,EAAE,MAAM,CAAC,MAAM,EAAE,aAAa,CAAC,OAAO,CAAC,CAAC,CAAC;CAC7D,CAAC,CAAA;AAIF,wBAAsB,cAAc,CAChC,gBAAgB,EAAE,mBAAmB,EACrC,WAAW,EAAE,mBAAmB,CAAC,aAAa,CAAC,EAC/C,WAAW,EAAE,mBAAmB,CAAC,aAAa,CAAC,GAChD,OAAO,CAAC,eAAe,CAAC,CA6D1B"}
1
+ {"version":3,"file":"getDendrograms.d.ts","sourceRoot":"","sources":["../../src/heatmap/getDendrograms.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,oBAAoB,CAAC;AAClD,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,YAAY,CAAC;AACtD,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,uBAAuB,CAAC;AACjE,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,cAAc,CAAC;AAMlD,MAAM,MAAM,eAAe,GAAG,MAAM,CAAC,MAAM,EAAE;IACzC,iBAAiB,EAAE,MAAM,CAAC,MAAM,EAAE,aAAa,CAAC,OAAO,CAAC,CAAC,CAAC;IAC1D,iBAAiB,EAAE,MAAM,CAAC,MAAM,EAAE,aAAa,CAAC,OAAO,CAAC,CAAC,CAAC;CAC7D,CAAC,CAAA;AAIF,wBAAsB,cAAc,CAAC,EACjC,gBAAgB,EAChB,WAAW,EACX,WAAW,GACd,EAAE;IACC,gBAAgB,EAAE,mBAAmB,CAAC;IACtC,WAAW,EAAE,mBAAmB,CAAC,aAAa,CAAC,CAAC;IAChD,WAAW,EAAE,mBAAmB,CAAC,aAAa,CAAC,CAAC;CACnD,GAAG,OAAO,CAAC,eAAe,CAAC,CAuF3B"}
@@ -2,7 +2,7 @@ import { WorkerFactory as e } from "../utils/WorkerFactory.js";
2
2
  import t from "./getClusters.js";
3
3
  import { hierarchy as n } from "d3-hierarchy";
4
4
  var r = new e(() => new t());
5
- async function i(e, t, i) {
5
+ async function i({ groupedCellsData: e, dendrogramX: t, dendrogramY: i }) {
6
6
  let { facetKeys: a, xGroupKeys: o, yGroupKeys: s } = e.meta, c = {};
7
7
  return !t && !i ? c : (r.reset(), await Promise.all(a.map(async (a) => {
8
8
  let l = {
@@ -10,23 +10,45 @@ async function i(e, t, i) {
10
10
  hierarchyByGroupY: {}
11
11
  }, u = e.facets[a];
12
12
  if (t) {
13
- let i = [], s = await Promise.all(o.map(async (e) => {
14
- let n = u.xKeysByGroups[e], i = u.yKeys;
15
- return r.wrapper.getClustersApproximate(n.map((e) => i.map((n) => u.cells[e][n]?.normalizedValue.dataSource ?? t.fillNA)), t.distance, t.linkage);
13
+ let i = [], s = o.map((e) => {
14
+ let t = u.xKeysByGroups[e];
15
+ return t ? {
16
+ nonEmptyXKeys: t.filter((e) => u.cells[e] !== void 0),
17
+ emptyXKeys: t.filter((e) => u.cells[e] === void 0)
18
+ } : {
19
+ nonEmptyXKeys: [],
20
+ emptyXKeys: []
21
+ };
22
+ }), c = await Promise.all(s.map(({ nonEmptyXKeys: e }) => {
23
+ if (e.length === 0) return Promise.resolve(null);
24
+ let n = u.yKeys;
25
+ return r.wrapper.getClustersApproximate(e.map((e) => n.map((n) => u.cells[e][n]?.normalizedValue.dataSource ?? t.fillNA)), t.distance, t.linkage);
16
26
  }));
17
27
  o.forEach((t, r) => {
18
- let o = s[r], c = o.indexes.map((e) => u.xKeysByGroups[t][e]);
19
- e.facets[a].xKeysByGroups[t] = c, i.push(...c), l.hierarchyByGroupX[t] = n(o);
28
+ let { nonEmptyXKeys: o, emptyXKeys: u } = s[r], d = c[r], f = [...d ? d.indexes.map((e) => o[e]) : o, ...u];
29
+ e.facets[a].xKeysByGroups[t] = f, i.push(...f), d && (l.hierarchyByGroupX[t] = n(d));
20
30
  }), e.facets[a].xKeys = i;
21
31
  }
22
32
  if (i) {
23
- let t = [], o = await Promise.all(s.map(async (e) => {
24
- let t = u.yKeysByGroups[e], n = u.xKeys;
25
- return r.wrapper.getClustersApproximate(t.map((e) => n.map((t) => u.cells[t][e]?.normalizedValue.dataSource ?? i.fillNA)), i.distance, i.linkage);
33
+ let t = [], o = s.map((e) => {
34
+ let t = u.yKeysByGroups[e];
35
+ if (!t) return {
36
+ nonEmptyYKeys: [],
37
+ emptyYKeys: []
38
+ };
39
+ let n = u.xKeys;
40
+ return {
41
+ nonEmptyYKeys: t.filter((e) => n.some((t) => u.cells[t]?.[e] !== void 0)),
42
+ emptyYKeys: t.filter((e) => n.every((t) => u.cells[t]?.[e] === void 0))
43
+ };
44
+ }), c = await Promise.all(o.map(({ nonEmptyYKeys: e }) => {
45
+ if (e.length === 0) return Promise.resolve(null);
46
+ let t = u.xKeys;
47
+ return r.wrapper.getClustersApproximate(e.map((e) => t.map((t) => u.cells[t]?.[e]?.normalizedValue.dataSource ?? i.fillNA)), i.distance, i.linkage);
26
48
  }));
27
49
  s.forEach((r, i) => {
28
- let s = o[i], c = s.indexes.map((e) => u.yKeysByGroups[r][e]);
29
- e.facets[a].yKeysByGroups[r] = c, t.push(...c), l.hierarchyByGroupY[r] = n(s);
50
+ let { nonEmptyYKeys: s, emptyYKeys: u } = o[i], d = c[i], f = [...d ? d.indexes.map((e) => s[e]) : s, ...u];
51
+ e.facets[a].yKeysByGroups[r] = f, t.push(...f), d && (l.hierarchyByGroupY[r] = n(d));
30
52
  }), e.facets[a].yKeys = t;
31
53
  }
32
54
  c[a] = l;
@@ -1 +1 @@
1
- {"version":3,"file":"getDendrograms.js","names":[],"sources":["../../src/heatmap/getDendrograms.ts"],"sourcesContent":["import type { Cluster } from './components/types';\nimport type { GroupedCellsHeatmap } from './getCells';\nimport type { HeatmapSettingsImpl } from './HeatmapSettingsImpl';\nimport type { HierarchyNode } from 'd3-hierarchy';\nimport { hierarchy } from 'd3-hierarchy';\nimport type { getClustersApproximate } from './getClusters';\nimport { WorkerFactory } from '../utils/WorkerFactory';\nimport GetClustersWorker from './getClusters?worker&inline';\n\nexport type DendrogramsData = Record<string, {\n hierarchyByGroupX: Record<string, HierarchyNode<Cluster>>;\n hierarchyByGroupY: Record<string, HierarchyNode<Cluster>>;\n}>\n\nconst workerWrapper = new WorkerFactory<{ getClustersApproximate: typeof getClustersApproximate }>(() => new GetClustersWorker());\n\nexport async function getDendrograms(\n groupedCellsData: GroupedCellsHeatmap,\n dendrogramX: HeatmapSettingsImpl['dendrogramX'],\n dendrogramY: HeatmapSettingsImpl['dendrogramY'],\n): Promise<DendrogramsData> {\n const { facetKeys, xGroupKeys, yGroupKeys } = groupedCellsData.meta;\n const result: DendrogramsData = {};\n\n if (!dendrogramX && !dendrogramY) {\n return result;\n }\n workerWrapper.reset();\n await Promise.all(facetKeys.map(async facetKey => {\n const facetResult: DendrogramsData[string] = {\n hierarchyByGroupX: {},\n hierarchyByGroupY: {},\n };\n const cellsGroup = groupedCellsData.facets[facetKey];\n if (dendrogramX) {\n const updatedXKeys: string[] = [];\n const rootClusters = await Promise.all(xGroupKeys.map(async xGroupKey => {\n const xKeys = cellsGroup.xKeysByGroups[xGroupKey];\n const yKeys = cellsGroup.yKeys;\n return workerWrapper.wrapper.getClustersApproximate(\n xKeys.map(x => yKeys.map(y => (cellsGroup.cells[x][y]?.normalizedValue.dataSource ?? dendrogramX.fillNA) as number)),\n dendrogramX.distance,\n dendrogramX.linkage\n ); \n }));\n xGroupKeys.forEach((xGroupKey, idx) => {\n //set sorted group keys\n const rootCluster = rootClusters[idx];\n const newXKeys = rootCluster.indexes.map(i => cellsGroup.xKeysByGroups[xGroupKey][i]);\n groupedCellsData.facets[facetKey].xKeysByGroups[xGroupKey] = newXKeys;\n updatedXKeys.push(...newXKeys);\n facetResult.hierarchyByGroupX[xGroupKey] = hierarchy(rootCluster);\n });\n // set sorted group keys of all groups\n groupedCellsData.facets[facetKey].xKeys = updatedXKeys;\n }\n if (dendrogramY) {\n const updatedYKeys: string[] = [];\n const rootClusters = await Promise.all(yGroupKeys.map(async yGroupKey => {\n const yKeys = cellsGroup.yKeysByGroups[yGroupKey];\n const xKeys = cellsGroup.xKeys;\n return workerWrapper.wrapper.getClustersApproximate(\n yKeys.map(y => xKeys.map(x => (cellsGroup.cells[x][y]?.normalizedValue.dataSource ?? dendrogramY.fillNA) as number)),\n dendrogramY.distance,\n dendrogramY.linkage\n );\n }));\n yGroupKeys.forEach((yGroupKey, idx) => {\n const rootCluster = rootClusters[idx];\n const newYKeys = rootCluster.indexes.map(i => cellsGroup.yKeysByGroups[yGroupKey][i]);\n groupedCellsData.facets[facetKey].yKeysByGroups[yGroupKey] = newYKeys;\n updatedYKeys.push(...newYKeys);\n facetResult.hierarchyByGroupY[yGroupKey] = hierarchy(rootCluster);\n });\n // set sorted group keys of all groups\n groupedCellsData.facets[facetKey].yKeys = updatedYKeys;\n }\n result[facetKey] = facetResult;\n }));\n\n return result;\n}\n"],"mappings":";;;AAcA,IAAM,IAAgB,IAAI,QAA+E,IAAI,GAAmB,CAAC;AAEjI,eAAsB,EAClB,GACA,GACA,GACwB;CACxB,IAAM,EAAE,cAAW,eAAY,kBAAe,EAAiB,MACzD,IAA0B,EAAE;AA0DlC,QAxDI,CAAC,KAAe,CAAC,IACV,KAEX,EAAc,OAAO,EACrB,MAAM,QAAQ,IAAI,EAAU,IAAI,OAAM,MAAY;EAC9C,IAAM,IAAuC;GACzC,mBAAmB,EAAE;GACrB,mBAAmB,EAAE;GACxB,EACK,IAAa,EAAiB,OAAO;AAC3C,MAAI,GAAa;GACb,IAAM,IAAyB,EAAE,EAC3B,IAAe,MAAM,QAAQ,IAAI,EAAW,IAAI,OAAM,MAAa;IACrE,IAAM,IAAQ,EAAW,cAAc,IACjC,IAAQ,EAAW;AACzB,WAAO,EAAc,QAAQ,uBACzB,EAAM,KAAI,MAAK,EAAM,KAAI,MAAM,EAAW,MAAM,GAAG,IAAI,gBAAgB,cAAc,EAAY,OAAkB,CAAC,EACpH,EAAY,UACZ,EAAY,QACf;KACH,CAAC;AAUH,GATA,EAAW,SAAS,GAAW,MAAQ;IAEnC,IAAM,IAAc,EAAa,IAC3B,IAAW,EAAY,QAAQ,KAAI,MAAK,EAAW,cAAc,GAAW,GAAG;AAGrF,IAFA,EAAiB,OAAO,GAAU,cAAc,KAAa,GAC7D,EAAa,KAAK,GAAG,EAAS,EAC9B,EAAY,kBAAkB,KAAa,EAAU,EAAY;KACnE,EAEF,EAAiB,OAAO,GAAU,QAAQ;;AAE9C,MAAI,GAAa;GACb,IAAM,IAAyB,EAAE,EAC3B,IAAe,MAAM,QAAQ,IAAI,EAAW,IAAI,OAAM,MAAa;IACrE,IAAM,IAAQ,EAAW,cAAc,IACjC,IAAQ,EAAW;AACzB,WAAO,EAAc,QAAQ,uBACzB,EAAM,KAAI,MAAK,EAAM,KAAI,MAAM,EAAW,MAAM,GAAG,IAAI,gBAAgB,cAAc,EAAY,OAAkB,CAAC,EACpH,EAAY,UACZ,EAAY,QACf;KACH,CAAC;AASH,GARA,EAAW,SAAS,GAAW,MAAQ;IACnC,IAAM,IAAc,EAAa,IAC3B,IAAW,EAAY,QAAQ,KAAI,MAAK,EAAW,cAAc,GAAW,GAAG;AAGrF,IAFA,EAAiB,OAAO,GAAU,cAAc,KAAa,GAC7D,EAAa,KAAK,GAAG,EAAS,EAC9B,EAAY,kBAAkB,KAAa,EAAU,EAAY;KACnE,EAEF,EAAiB,OAAO,GAAU,QAAQ;;AAE9C,IAAO,KAAY;GACrB,CAAC,EAEI"}
1
+ {"version":3,"file":"getDendrograms.js","names":[],"sources":["../../src/heatmap/getDendrograms.ts"],"sourcesContent":["import type { Cluster } from './components/types';\nimport type { GroupedCellsHeatmap } from './getCells';\nimport type { HeatmapSettingsImpl } from './HeatmapSettingsImpl';\nimport type { HierarchyNode } from 'd3-hierarchy';\nimport { hierarchy } from 'd3-hierarchy';\nimport type { getClustersApproximate } from './getClusters';\nimport { WorkerFactory } from '../utils/WorkerFactory';\nimport GetClustersWorker from './getClusters?worker&inline';\n\nexport type DendrogramsData = Record<string, {\n hierarchyByGroupX: Record<string, HierarchyNode<Cluster>>;\n hierarchyByGroupY: Record<string, HierarchyNode<Cluster>>;\n}>\n\nconst workerWrapper = new WorkerFactory<{ getClustersApproximate: typeof getClustersApproximate }>(() => new GetClustersWorker());\n\nexport async function getDendrograms({\n groupedCellsData,\n dendrogramX,\n dendrogramY,\n}: {\n groupedCellsData: GroupedCellsHeatmap;\n dendrogramX: HeatmapSettingsImpl['dendrogramX'];\n dendrogramY: HeatmapSettingsImpl['dendrogramY'];\n}): Promise<DendrogramsData> {\n const { facetKeys, xGroupKeys, yGroupKeys } = groupedCellsData.meta;\n const result: DendrogramsData = {};\n\n if (!dendrogramX && !dendrogramY) {\n return result;\n }\n workerWrapper.reset();\n await Promise.all(facetKeys.map(async facetKey => {\n const facetResult: DendrogramsData[string] = {\n hierarchyByGroupX: {},\n hierarchyByGroupY: {},\n };\n const cellsGroup = groupedCellsData.facets[facetKey];\n if (dendrogramX) {\n const updatedXKeys: string[] = [];\n const clusterInputs = xGroupKeys.map(xGroupKey => {\n const xKeys = cellsGroup.xKeysByGroups[xGroupKey];\n if (!xKeys) return { nonEmptyXKeys: [], emptyXKeys: [] };\n const nonEmptyXKeys = xKeys.filter(x => cellsGroup.cells[x] !== undefined);\n const emptyXKeys = xKeys.filter(x => cellsGroup.cells[x] === undefined);\n return { nonEmptyXKeys, emptyXKeys };\n });\n const rootClusters = await Promise.all(clusterInputs.map(({ nonEmptyXKeys }) => {\n if (nonEmptyXKeys.length === 0) return Promise.resolve(null);\n const yKeys = cellsGroup.yKeys;\n return workerWrapper.wrapper.getClustersApproximate(\n nonEmptyXKeys.map(x => yKeys.map(y => (cellsGroup.cells[x][y]?.normalizedValue.dataSource ?? dendrogramX.fillNA) as number)),\n dendrogramX.distance,\n dendrogramX.linkage\n );\n }));\n xGroupKeys.forEach((xGroupKey, idx) => {\n const { nonEmptyXKeys, emptyXKeys } = clusterInputs[idx];\n const rootCluster = rootClusters[idx];\n const reorderedNonEmptyXKeys = rootCluster\n ? rootCluster.indexes.map(i => nonEmptyXKeys[i])\n : nonEmptyXKeys;\n const newXKeys = [...reorderedNonEmptyXKeys, ...emptyXKeys];\n groupedCellsData.facets[facetKey].xKeysByGroups[xGroupKey] = newXKeys;\n updatedXKeys.push(...newXKeys);\n if (rootCluster) {\n facetResult.hierarchyByGroupX[xGroupKey] = hierarchy(rootCluster);\n }\n });\n // set sorted group keys of all groups\n groupedCellsData.facets[facetKey].xKeys = updatedXKeys;\n }\n if (dendrogramY) {\n const updatedYKeys: string[] = [];\n const clusterInputs = yGroupKeys.map(yGroupKey => {\n const yKeys = cellsGroup.yKeysByGroups[yGroupKey];\n if (!yKeys) return { nonEmptyYKeys: [], emptyYKeys: [] };\n const xKeys = cellsGroup.xKeys;\n const nonEmptyYKeys = yKeys.filter(y => xKeys.some(x => cellsGroup.cells[x]?.[y] !== undefined));\n const emptyYKeys = yKeys.filter(y => xKeys.every(x => cellsGroup.cells[x]?.[y] === undefined));\n return { nonEmptyYKeys, emptyYKeys };\n });\n const rootClusters = await Promise.all(clusterInputs.map(({ nonEmptyYKeys }) => {\n if (nonEmptyYKeys.length === 0) return Promise.resolve(null);\n const xKeys = cellsGroup.xKeys;\n return workerWrapper.wrapper.getClustersApproximate(\n nonEmptyYKeys.map(y => xKeys.map(x => (cellsGroup.cells[x]?.[y]?.normalizedValue.dataSource ?? dendrogramY.fillNA) as number)),\n dendrogramY.distance,\n dendrogramY.linkage\n );\n }));\n yGroupKeys.forEach((yGroupKey, idx) => {\n const { nonEmptyYKeys, emptyYKeys } = clusterInputs[idx];\n const rootCluster = rootClusters[idx];\n const reorderedNonEmptyYKeys = rootCluster\n ? rootCluster.indexes.map(i => nonEmptyYKeys[i])\n : nonEmptyYKeys;\n const newYKeys = [...reorderedNonEmptyYKeys, ...emptyYKeys];\n groupedCellsData.facets[facetKey].yKeysByGroups[yGroupKey] = newYKeys;\n updatedYKeys.push(...newYKeys);\n if (rootCluster) {\n facetResult.hierarchyByGroupY[yGroupKey] = hierarchy(rootCluster);\n }\n });\n // set sorted group keys of all groups\n groupedCellsData.facets[facetKey].yKeys = updatedYKeys;\n }\n result[facetKey] = facetResult;\n }));\n\n return result;\n}\n"],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/heatmap/index.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,aAAa,EAAE,MAAM,kBAAkB,CAAC;AACjD,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,cAAc,CAAC;AAC9C,OAAO,EAAmB,KAAK,SAAS,EAAuB,KAAK,oBAAoB,EAAE,KAAK,eAAe,EAAe,MAAM,UAAU,CAAC;AAE9I,OAAO,aAAa,MAAM,iBAAiB,CAAC;AAC5C,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,YAAY,CAAC;AAEtD,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,kBAAkB,CAAC;AAExD,OAAO,EAAE,mBAAmB,EAAE,MAAM,uBAAuB,CAAC;AAK5D,qBAAa,YAAa,SAAQ,aAAa;IAC3C,QAAQ,EAAE,mBAAmB,CAAC;IAC9B,aAAa,gBAAuB;IAEpC,mBAAmB,EAAE,CAAC,CAAC,EAAC,OAAO,KAAK,IAAI,CAAQ;IAChD,eAAe,EAAE,CAAC,CAAC,EAAC,OAAO,KAAK,IAAI,CAAQ;IAE5C,cAAc,EAAE;QACZ,gBAAgB,EAAE,mBAAmB,CAAC;QACtC,eAAe,EAAE,eAAe,CAAC;QACjC,cAAc,EAAE,SAAS,EAAE,CAAC;KAC/B,GAAG,IAAI,CAAQ;IAEhB,gCAAgC,UAAS;gBAE7B,IAAI,EAAE,SAAS,EAAE,QAAQ,EAAE,eAAe,EAAE,aAAa,CAAC,EAAC,oBAAoB;IAU3F,KAAK,CAAC,IAAI,EAAE,WAAW;IAgBvB,OAAO;IAIP,qBAAqB,CAAC,IAAI,EAAE,SAAS,EAAE,QAAQ,EAAE,eAAe;IA0BhE,gBAAgB,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,OAAO;IAIhD,MAAM,IAAI,MAAM;IAKhB,mCAAmC,CAAC,YAAY,EAAE,mBAAmB,EAAE,QAAQ,EAAE,mBAAmB;IAkEpG,+BAA+B,CAAC,QAAQ,EAAE,SAAS,EAAE,IAAI,EAAE,SAAS;IAU9D,WAAW;IA8DjB,gBAAgB;IAIhB,YAAY;CAkDf"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/heatmap/index.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,aAAa,EAAE,MAAM,kBAAkB,CAAC;AACjD,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,cAAc,CAAC;AAC9C,OAAO,EAAmB,KAAK,SAAS,EAAuB,KAAK,oBAAoB,EAAE,KAAK,eAAe,EAAe,MAAM,UAAU,CAAC;AAE9I,OAAO,aAAa,MAAM,iBAAiB,CAAC;AAC5C,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,YAAY,CAAC;AAEtD,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,kBAAkB,CAAC;AAExD,OAAO,EAAE,mBAAmB,EAAE,MAAM,uBAAuB,CAAC;AAK5D,qBAAa,YAAa,SAAQ,aAAa;IAC3C,QAAQ,EAAE,mBAAmB,CAAC;IAC9B,aAAa,gBAAuB;IAEpC,mBAAmB,EAAE,CAAC,CAAC,EAAC,OAAO,KAAK,IAAI,CAAQ;IAChD,eAAe,EAAE,CAAC,CAAC,EAAC,OAAO,KAAK,IAAI,CAAQ;IAE5C,cAAc,EAAE;QACZ,gBAAgB,EAAE,mBAAmB,CAAC;QACtC,eAAe,EAAE,eAAe,CAAC;QACjC,cAAc,EAAE,SAAS,EAAE,CAAC;KAC/B,GAAG,IAAI,CAAQ;IAEhB,gCAAgC,UAAS;gBAE7B,IAAI,EAAE,SAAS,EAAE,QAAQ,EAAE,eAAe,EAAE,aAAa,CAAC,EAAC,oBAAoB;IAU3F,KAAK,CAAC,IAAI,EAAE,WAAW;IAgBvB,OAAO;IAIP,qBAAqB,CAAC,IAAI,EAAE,SAAS,EAAE,QAAQ,EAAE,eAAe;IA0BhE,gBAAgB,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,OAAO;IAIhD,MAAM,IAAI,MAAM;IAKhB,mCAAmC,CAAC,YAAY,EAAE,mBAAmB,EAAE,QAAQ,EAAE,mBAAmB;IAoEpG,+BAA+B,CAAC,QAAQ,EAAE,SAAS,EAAE,IAAI,EAAE,SAAS;IAU9D,WAAW;IAkEjB,gBAAgB;IAIhB,YAAY;CAkDf"}
@@ -49,22 +49,46 @@ var d = class extends e {
49
49
  function S(e, t) {
50
50
  return e.length !== t.length || e.some((e, n) => e.value !== t[n].value);
51
51
  }
52
- return e.xColumn.value !== n.value || e.yColumn.value !== a.value || e.valueColumn.value !== o.value || S(e.xGroupBy, s) || S(e.yGroupBy, c) || S(e.facetBy, l) || S(e.annotations.map((e) => e.valueColumn), u.map((e) => e.valueColumn)) || S(v, y) || S(b, x) || (t.dendrogramX || e.dendrogramX) && (e.dendrogramX?.distance !== t.dendrogramX?.distance || e.dendrogramX?.linkage !== t.dendrogramX?.linkage) || (t.dendrogramY || e.dendrogramY) && (e.dendrogramY?.distance !== t.dendrogramY?.distance || e.dendrogramY?.linkage !== t.dendrogramY?.linkage) || e.chartSettings.valueType !== d.valueType || e.facetSettings.sharedX !== f.sharedX || e.facetSettings.sharedY !== f.sharedY || i(e.facetSettings?.order ?? [], t.facetSettings?.order ?? []), e.normalization?.method !== h?.method || e.normalization?.direction !== h?.direction || e.NAValueAs !== _ || e.aggregation?.method !== g?.method || e.aggregation?.x !== g?.x || e.aggregation?.y !== g?.y;
52
+ return e.xColumn.value !== n.value || e.yColumn.value !== a.value || e.valueColumn.value !== o.value || S(e.xGroupBy, s) || S(e.yGroupBy, c) || S(e.facetBy, l) || S(e.annotations.map((e) => e.valueColumn), u.map((e) => e.valueColumn)) || S(v, y) || S(b, x) || (t.dendrogramX || e.dendrogramX) && (e.dendrogramX?.distance !== t.dendrogramX?.distance || e.dendrogramX?.linkage !== t.dendrogramX?.linkage) || (t.dendrogramY || e.dendrogramY) && (e.dendrogramY?.distance !== t.dendrogramY?.distance || e.dendrogramY?.linkage !== t.dendrogramY?.linkage) || e.chartSettings.valueType !== d.valueType || e.facetSettings.sharedX !== f.sharedX || e.facetSettings.sharedY !== f.sharedY || i(e.facetSettings?.order ?? [], t.facetSettings?.order ?? []) || e.normalization?.method !== h?.method || e.normalization?.direction !== h?.direction || e.NAValueAs !== _ || e.aggregation?.method !== g?.method || e.aggregation?.x !== g?.x || e.aggregation?.y !== g?.y || e.showEmptyRows !== t.showEmptyRows || e.showEmptyColumns !== t.showEmptyColumns;
53
53
  }
54
54
  _needUpdateCalculatedDataByData(e, t) {
55
55
  let n = Object.keys(e.data), r = Object.keys(t.data);
56
56
  return e.id !== t.id || n.length !== r.length || n.some((n) => e.data[n].length !== t.data[n]?.length);
57
57
  }
58
58
  async _updateData() {
59
- let { xColumn: e, yColumn: t, valueColumn: n, xGroupBy: r, yGroupBy: i, facetBy: a, chartSettings: c, facetSettings: l, annotations: u, dendrogramX: d, dendrogramY: f, normalization: p, NAValueAs: m, keysOrder: h, aggregation: g } = this.settings, _ = o(this.data, e, t, { dataSource: n }, a, r, i, l, u, d, f, p, m, h, c.xAxis, c.yAxis, g), v = c.valueType === "discrete" ? this.data.getColumnCategories(n.value) : [];
59
+ let { xColumn: e, yColumn: t, valueColumn: n, xGroupBy: r, yGroupBy: i, facetBy: a, chartSettings: c, facetSettings: l, annotations: u, dendrogramX: d, dendrogramY: f, normalization: p, NAValueAs: m, keysOrder: h, aggregation: g, showEmptyRows: _, showEmptyColumns: v } = this.settings, y = o({
60
+ data: this.data,
61
+ xColumn: e,
62
+ yColumn: t,
63
+ valueColumns: { dataSource: n },
64
+ facetBy: a,
65
+ xGroupBy: r,
66
+ yGroupBy: i,
67
+ facetSettings: l,
68
+ annotations: u,
69
+ dendrogramX: d,
70
+ dendrogramY: f,
71
+ normalization: p,
72
+ NAValueAs: m,
73
+ keysOrder: h,
74
+ xAxis: c.xAxis,
75
+ yAxis: c.yAxis,
76
+ aggregation: g,
77
+ showEmptyRows: _,
78
+ showEmptyColumns: v
79
+ }), b = c.valueType === "discrete" ? this.data.getColumnCategories(n.value) : [];
60
80
  if (d && l.sharedX && a.length > 0) throw Error("Dendrogram on X axis is not available with shared by facets X axis");
61
81
  if (f && l.sharedY && a.length > 0) throw Error("Dendrogram on Y axis is not available with shared by facets Y axis");
62
82
  this.clusteringCalculationsInProgress = !0, this.onLoadingChange(!0);
63
- let y = await s(_, d, f);
83
+ let x = await s({
84
+ groupedCellsData: y,
85
+ dendrogramX: d,
86
+ dendrogramY: f
87
+ });
64
88
  this.clusteringCalculationsInProgress = !1, this.onLoadingChange(!1), this.calculatedData = {
65
- groupedCellsData: _,
66
- dendrogramsData: y,
67
- cellUniqValues: v
89
+ groupedCellsData: y,
90
+ dendrogramsData: x,
91
+ cellUniqValues: b
68
92
  }, this._updateChart();
69
93
  }
70
94
  _updateAesInData() {
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","names":[],"sources":["../../src/heatmap/index.ts"],"sourcesContent":["import { renderToString } from 'react-dom/server.browser';\nimport { AbstractChart } from '../AbstractChart';\nimport type { DataFrame } from '../DataFrame';\nimport { type ColumnName, type DataValue, getUnknownErrorInfo, type HeatmapEventHandlers, type HeatmapSettings, isErrorInfo } from '../types';\nimport { isColumnName } from '../utils';\nimport ChartRenderer from './ChartRenderer';\nimport type { GroupedCellsHeatmap } from './getCells';\nimport { getCells } from './getCells';\nimport type { DendrogramsData } from './getDendrograms';\nimport { getDendrograms } from './getDendrograms';\nimport { HeatmapSettingsImpl } from './HeatmapSettingsImpl';\nimport { MAX_SVG_RENDERED_CELLS_COUNT } from './constants';\nimport { noop } from 'lodash';\nimport { arraysAreDifferent } from '../utils/arraysAreDifferent';\n\nexport class ChartHeatmap extends AbstractChart {\n settings: HeatmapSettingsImpl;\n chartRenderer = new ChartRenderer();\n\n onTooltipHintSwitch: (v:boolean) => void = noop;\n onLoadingChange: (v:boolean) => void = noop;\n\n calculatedData: {\n groupedCellsData: GroupedCellsHeatmap;\n dendrogramsData: DendrogramsData;\n cellUniqValues: DataValue[];\n } | null = null;\n\n clusteringCalculationsInProgress = false;\n\n constructor(data: DataFrame, settings: HeatmapSettings, eventHandlers?:HeatmapEventHandlers) {\n super(data, settings);\n\n this.settings = new HeatmapSettingsImpl(settings);\n if (eventHandlers) {\n this.onTooltipHintSwitch = eventHandlers.onTooltipHintSwitch ?? noop;\n this.onLoadingChange = eventHandlers.onLoadingChange ?? noop;\n }\n }\n\n mount(node: HTMLElement) {\n try {\n this.chartRenderer.init(node);\n this._updateData();\n this.hasError = false;\n this.errorInfo = null;\n } catch (err) {\n this.hasError = true;\n if (err instanceof Error) {\n this.errorInfo = isErrorInfo(err.cause) ? err.cause : getUnknownErrorInfo(err);\n this.chartRenderer.renderError(err.message as string);\n console.error(err);\n }\n }\n }\n\n unmount() {\n this.chartRenderer.clear();\n }\n\n updateSettingsAndData(data: DataFrame, settings: HeatmapSettings) {\n try {\n const previousSettings = this.settings;\n const previousData = this.data;\n this.settings = new HeatmapSettingsImpl(settings);\n this.data = data;\n if (\n this._needUpdateCalculatedDataBySettings(previousSettings, this.settings) ||\n this._needUpdateCalculatedDataByData(previousData, this.data)\n ) {\n this._updateData();\n } else {\n this._updateAesInData();\n }\n this.hasError = false;\n this.errorInfo = null;\n } catch (err) {\n this.hasError = true;\n if (err instanceof Error) {\n this.errorInfo = isErrorInfo(err.cause) ? err.cause : getUnknownErrorInfo(err);\n this.chartRenderer.renderError(err.message as string);\n console.error(err);\n }\n }\n }\n\n updateChartState(_field: string, _value: unknown) {\n console.warn('no chart state for heatmap');\n }\n\n export(): string {\n this._updateChart();\n return renderToString(this.chartRenderer.component);\n }\n\n _needUpdateCalculatedDataBySettings(prevSettings: HeatmapSettingsImpl, settings: HeatmapSettingsImpl) {\n const {\n xColumn,\n yColumn,\n valueColumn,\n xGroupBy,\n yGroupBy,\n facetBy,\n annotations,\n chartSettings,\n facetSettings,\n dendrogramX,\n dendrogramY,\n normalization,\n aggregation,\n NAValueAs,\n } = settings;\n\n const prevDendrogramXColumns: ColumnName[] = Object.values(prevSettings.dendrogramX?.aes || {}).filter(\n isColumnName\n );\n const currentDendrogramXColumns: ColumnName[] = Object.values(dendrogramX?.aes || {}).filter(isColumnName);\n const prevDendrogramYColumns: ColumnName[] = Object.values(prevSettings.dendrogramY?.aes || {}).filter(\n isColumnName\n );\n const currentDendrogramYColumns: ColumnName[] = Object.values(dendrogramY?.aes || {}).filter(isColumnName);\n\n function compareColumnGroups(columns1: ColumnName[], columns2: ColumnName[]) {\n return (\n columns1.length !== columns2.length ||\n columns1.some((column, idx) => column.value !== columns2[idx].value)\n );\n }\n\n return (\n prevSettings.xColumn.value !== xColumn.value ||\n prevSettings.yColumn.value !== yColumn.value ||\n prevSettings.valueColumn.value !== valueColumn.value ||\n compareColumnGroups(prevSettings.xGroupBy, xGroupBy) ||\n compareColumnGroups(prevSettings.yGroupBy, yGroupBy) ||\n compareColumnGroups(prevSettings.facetBy, facetBy) ||\n compareColumnGroups(\n prevSettings.annotations.map(a => a.valueColumn),\n annotations.map(a => a.valueColumn)\n ) ||\n compareColumnGroups(prevDendrogramXColumns, currentDendrogramXColumns) ||\n compareColumnGroups(prevDendrogramYColumns, currentDendrogramYColumns) ||\n ((settings.dendrogramX || prevSettings.dendrogramX) &&\n (prevSettings.dendrogramX?.distance !== settings.dendrogramX?.distance ||\n prevSettings.dendrogramX?.linkage !== settings.dendrogramX?.linkage)) ||\n ((settings.dendrogramY || prevSettings.dendrogramY) &&\n (prevSettings.dendrogramY?.distance !== settings.dendrogramY?.distance ||\n prevSettings.dendrogramY?.linkage !== settings.dendrogramY?.linkage)) ||\n prevSettings.chartSettings.valueType !== chartSettings.valueType ||\n prevSettings.facetSettings.sharedX !== facetSettings.sharedX ||\n prevSettings.facetSettings.sharedY !== facetSettings.sharedY ||\n arraysAreDifferent(prevSettings.facetSettings?.order ?? [], settings.facetSettings?.order ?? []),\n prevSettings.normalization?.method !== normalization?.method ||\n prevSettings.normalization?.direction !== normalization?.direction ||\n prevSettings.NAValueAs !== NAValueAs ||\n prevSettings.aggregation?.method !== aggregation?.method ||\n prevSettings.aggregation?.x !== aggregation?.x ||\n prevSettings.aggregation?.y !== aggregation?.y\n );\n }\n\n _needUpdateCalculatedDataByData(prevData: DataFrame, data: DataFrame) {\n const prevKeys = Object.keys(prevData.data);\n const keys = Object.keys(data.data);\n return (\n prevData.id !== data.id ||\n prevKeys.length !== keys.length ||\n prevKeys.some(key => prevData.data[key].length !== data.data[key]?.length)\n );\n }\n\n async _updateData() {\n const {\n xColumn,\n yColumn,\n valueColumn,\n xGroupBy,\n yGroupBy,\n facetBy,\n chartSettings,\n facetSettings,\n annotations,\n dendrogramX,\n dendrogramY,\n normalization,\n NAValueAs,\n keysOrder,\n aggregation\n } = this.settings;\n\n const groupedCellsData = getCells(\n this.data,\n xColumn,\n yColumn,\n {dataSource: valueColumn},\n facetBy,\n xGroupBy,\n yGroupBy,\n facetSettings,\n annotations,\n dendrogramX,\n dendrogramY,\n normalization,\n NAValueAs,\n keysOrder,\n chartSettings.xAxis,\n chartSettings.yAxis,\n aggregation\n );\n\n const cellUniqValues = chartSettings.valueType === 'discrete' ? this.data.getColumnCategories(valueColumn.value) : [];\n \n if (dendrogramX && facetSettings.sharedX && facetBy.length > 0) {\n throw Error('Dendrogram on X axis is not available with shared by facets X axis');\n }\n if (dendrogramY && facetSettings.sharedY && facetBy.length > 0) {\n throw Error('Dendrogram on Y axis is not available with shared by facets Y axis');\n }\n this.clusteringCalculationsInProgress = true;\n this.onLoadingChange(true);\n const dendrogramsData = await getDendrograms(groupedCellsData, dendrogramX, dendrogramY);\n this.clusteringCalculationsInProgress = false;\n this.onLoadingChange(false);\n\n this.calculatedData = {\n groupedCellsData,\n dendrogramsData,\n cellUniqValues,\n };\n \n this._updateChart();\n }\n\n _updateAesInData() {\n this._updateChart();\n }\n\n _updateChart() {\n if (!this.calculatedData || this.clusteringCalculationsInProgress) {\n return;\n }\n const {\n id,\n valueColumn,\n chartSettings,\n facetSettings,\n aes,\n annotations,\n dendrogramX,\n dendrogramY,\n inheritedDendrogramAes,\n normalization,\n keysOrder,\n xColumn,\n yColumn,\n xGroupBy,\n yGroupBy,\n } = this.settings;\n const customOrder = {\n x: keysOrder[xColumn.value]?.length > 0,\n y: keysOrder[yColumn.value]?.length > 0,\n xGroup: xGroupBy.some((v) => keysOrder[v.value]?.length > 0),\n yGroup: yGroupBy.some((v) => keysOrder[v.value]?.length > 0),\n };\n const dataSize = this.data.columnNames.length ? this.data.getColumn(this.data.columnNames[0]).length : 0;\n const cellsRenderingMode = this.settings.cellsRenderingMode ?? (dataSize > MAX_SVG_RENDERED_CELLS_COUNT ? 'canvas' : 'svg');\n \n this.chartRenderer.render(\n this.data,\n id,\n chartSettings,\n facetSettings,\n aes,\n this.calculatedData.groupedCellsData,\n annotations,\n valueColumn,\n dendrogramX,\n dendrogramY,\n this.calculatedData.dendrogramsData,\n inheritedDendrogramAes,\n this.calculatedData.cellUniqValues,\n normalization,\n this.onTooltipHintSwitch,\n customOrder,\n cellsRenderingMode\n );\n }\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"index.js","names":[],"sources":["../../src/heatmap/index.ts"],"sourcesContent":["import { renderToString } from 'react-dom/server.browser';\nimport { AbstractChart } from '../AbstractChart';\nimport type { DataFrame } from '../DataFrame';\nimport { type ColumnName, type DataValue, getUnknownErrorInfo, type HeatmapEventHandlers, type HeatmapSettings, isErrorInfo } from '../types';\nimport { isColumnName } from '../utils';\nimport ChartRenderer from './ChartRenderer';\nimport type { GroupedCellsHeatmap } from './getCells';\nimport { getCells } from './getCells';\nimport type { DendrogramsData } from './getDendrograms';\nimport { getDendrograms } from './getDendrograms';\nimport { HeatmapSettingsImpl } from './HeatmapSettingsImpl';\nimport { MAX_SVG_RENDERED_CELLS_COUNT } from './constants';\nimport { noop } from 'lodash';\nimport { arraysAreDifferent } from '../utils/arraysAreDifferent';\n\nexport class ChartHeatmap extends AbstractChart {\n settings: HeatmapSettingsImpl;\n chartRenderer = new ChartRenderer();\n\n onTooltipHintSwitch: (v:boolean) => void = noop;\n onLoadingChange: (v:boolean) => void = noop;\n\n calculatedData: {\n groupedCellsData: GroupedCellsHeatmap;\n dendrogramsData: DendrogramsData;\n cellUniqValues: DataValue[];\n } | null = null;\n\n clusteringCalculationsInProgress = false;\n\n constructor(data: DataFrame, settings: HeatmapSettings, eventHandlers?:HeatmapEventHandlers) {\n super(data, settings);\n\n this.settings = new HeatmapSettingsImpl(settings);\n if (eventHandlers) {\n this.onTooltipHintSwitch = eventHandlers.onTooltipHintSwitch ?? noop;\n this.onLoadingChange = eventHandlers.onLoadingChange ?? noop;\n }\n }\n\n mount(node: HTMLElement) {\n try {\n this.chartRenderer.init(node);\n this._updateData();\n this.hasError = false;\n this.errorInfo = null;\n } catch (err) {\n this.hasError = true;\n if (err instanceof Error) {\n this.errorInfo = isErrorInfo(err.cause) ? err.cause : getUnknownErrorInfo(err);\n this.chartRenderer.renderError(err.message as string);\n console.error(err);\n }\n }\n }\n\n unmount() {\n this.chartRenderer.clear();\n }\n\n updateSettingsAndData(data: DataFrame, settings: HeatmapSettings) {\n try {\n const previousSettings = this.settings;\n const previousData = this.data;\n this.settings = new HeatmapSettingsImpl(settings);\n this.data = data;\n if (\n this._needUpdateCalculatedDataBySettings(previousSettings, this.settings) ||\n this._needUpdateCalculatedDataByData(previousData, this.data)\n ) {\n this._updateData();\n } else {\n this._updateAesInData();\n }\n this.hasError = false;\n this.errorInfo = null;\n } catch (err) {\n this.hasError = true;\n if (err instanceof Error) {\n this.errorInfo = isErrorInfo(err.cause) ? err.cause : getUnknownErrorInfo(err);\n this.chartRenderer.renderError(err.message as string);\n console.error(err);\n }\n }\n }\n\n updateChartState(_field: string, _value: unknown) {\n console.warn('no chart state for heatmap');\n }\n\n export(): string {\n this._updateChart();\n return renderToString(this.chartRenderer.component);\n }\n\n _needUpdateCalculatedDataBySettings(prevSettings: HeatmapSettingsImpl, settings: HeatmapSettingsImpl) {\n const {\n xColumn,\n yColumn,\n valueColumn,\n xGroupBy,\n yGroupBy,\n facetBy,\n annotations,\n chartSettings,\n facetSettings,\n dendrogramX,\n dendrogramY,\n normalization,\n aggregation,\n NAValueAs,\n } = settings;\n\n const prevDendrogramXColumns: ColumnName[] = Object.values(prevSettings.dendrogramX?.aes || {}).filter(\n isColumnName\n );\n const currentDendrogramXColumns: ColumnName[] = Object.values(dendrogramX?.aes || {}).filter(isColumnName);\n const prevDendrogramYColumns: ColumnName[] = Object.values(prevSettings.dendrogramY?.aes || {}).filter(\n isColumnName\n );\n const currentDendrogramYColumns: ColumnName[] = Object.values(dendrogramY?.aes || {}).filter(isColumnName);\n\n function compareColumnGroups(columns1: ColumnName[], columns2: ColumnName[]) {\n return (\n columns1.length !== columns2.length ||\n columns1.some((column, idx) => column.value !== columns2[idx].value)\n );\n }\n\n return (\n prevSettings.xColumn.value !== xColumn.value ||\n prevSettings.yColumn.value !== yColumn.value ||\n prevSettings.valueColumn.value !== valueColumn.value ||\n compareColumnGroups(prevSettings.xGroupBy, xGroupBy) ||\n compareColumnGroups(prevSettings.yGroupBy, yGroupBy) ||\n compareColumnGroups(prevSettings.facetBy, facetBy) ||\n compareColumnGroups(\n prevSettings.annotations.map(a => a.valueColumn),\n annotations.map(a => a.valueColumn)\n ) ||\n compareColumnGroups(prevDendrogramXColumns, currentDendrogramXColumns) ||\n compareColumnGroups(prevDendrogramYColumns, currentDendrogramYColumns) ||\n ((settings.dendrogramX || prevSettings.dendrogramX) &&\n (prevSettings.dendrogramX?.distance !== settings.dendrogramX?.distance ||\n prevSettings.dendrogramX?.linkage !== settings.dendrogramX?.linkage)) ||\n ((settings.dendrogramY || prevSettings.dendrogramY) &&\n (prevSettings.dendrogramY?.distance !== settings.dendrogramY?.distance ||\n prevSettings.dendrogramY?.linkage !== settings.dendrogramY?.linkage)) ||\n prevSettings.chartSettings.valueType !== chartSettings.valueType ||\n prevSettings.facetSettings.sharedX !== facetSettings.sharedX ||\n prevSettings.facetSettings.sharedY !== facetSettings.sharedY ||\n arraysAreDifferent(prevSettings.facetSettings?.order ?? [], settings.facetSettings?.order ?? []) ||\n prevSettings.normalization?.method !== normalization?.method ||\n prevSettings.normalization?.direction !== normalization?.direction ||\n prevSettings.NAValueAs !== NAValueAs ||\n prevSettings.aggregation?.method !== aggregation?.method ||\n prevSettings.aggregation?.x !== aggregation?.x ||\n prevSettings.aggregation?.y !== aggregation?.y ||\n prevSettings.showEmptyRows !== settings.showEmptyRows ||\n prevSettings.showEmptyColumns !== settings.showEmptyColumns\n );\n }\n\n _needUpdateCalculatedDataByData(prevData: DataFrame, data: DataFrame) {\n const prevKeys = Object.keys(prevData.data);\n const keys = Object.keys(data.data);\n return (\n prevData.id !== data.id ||\n prevKeys.length !== keys.length ||\n prevKeys.some(key => prevData.data[key].length !== data.data[key]?.length)\n );\n }\n\n async _updateData() {\n const {\n xColumn,\n yColumn,\n valueColumn,\n xGroupBy,\n yGroupBy,\n facetBy,\n chartSettings,\n facetSettings,\n annotations,\n dendrogramX,\n dendrogramY,\n normalization,\n NAValueAs,\n keysOrder,\n aggregation,\n showEmptyRows,\n showEmptyColumns,\n } = this.settings;\n\n const groupedCellsData = getCells({\n data: this.data,\n xColumn,\n yColumn,\n valueColumns: { dataSource: valueColumn },\n facetBy,\n xGroupBy,\n yGroupBy,\n facetSettings,\n annotations,\n dendrogramX,\n dendrogramY,\n normalization,\n NAValueAs,\n keysOrder,\n xAxis: chartSettings.xAxis,\n yAxis: chartSettings.yAxis,\n aggregation,\n showEmptyRows,\n showEmptyColumns,\n });\n\n const cellUniqValues = chartSettings.valueType === 'discrete' ? this.data.getColumnCategories(valueColumn.value) : [];\n \n if (dendrogramX && facetSettings.sharedX && facetBy.length > 0) {\n throw Error('Dendrogram on X axis is not available with shared by facets X axis');\n }\n if (dendrogramY && facetSettings.sharedY && facetBy.length > 0) {\n throw Error('Dendrogram on Y axis is not available with shared by facets Y axis');\n }\n this.clusteringCalculationsInProgress = true;\n this.onLoadingChange(true);\n const dendrogramsData = await getDendrograms({ groupedCellsData, dendrogramX, dendrogramY });\n this.clusteringCalculationsInProgress = false;\n this.onLoadingChange(false);\n\n this.calculatedData = {\n groupedCellsData,\n dendrogramsData,\n cellUniqValues,\n };\n \n this._updateChart();\n }\n\n _updateAesInData() {\n this._updateChart();\n }\n\n _updateChart() {\n if (!this.calculatedData || this.clusteringCalculationsInProgress) {\n return;\n }\n const {\n id,\n valueColumn,\n chartSettings,\n facetSettings,\n aes,\n annotations,\n dendrogramX,\n dendrogramY,\n inheritedDendrogramAes,\n normalization,\n keysOrder,\n xColumn,\n yColumn,\n xGroupBy,\n yGroupBy,\n } = this.settings;\n const customOrder = {\n x: keysOrder[xColumn.value]?.length > 0,\n y: keysOrder[yColumn.value]?.length > 0,\n xGroup: xGroupBy.some((v) => keysOrder[v.value]?.length > 0),\n yGroup: yGroupBy.some((v) => keysOrder[v.value]?.length > 0),\n };\n const dataSize = this.data.columnNames.length ? this.data.getColumn(this.data.columnNames[0]).length : 0;\n const cellsRenderingMode = this.settings.cellsRenderingMode ?? (dataSize > MAX_SVG_RENDERED_CELLS_COUNT ? 'canvas' : 'svg');\n \n this.chartRenderer.render(\n this.data,\n id,\n chartSettings,\n facetSettings,\n aes,\n this.calculatedData.groupedCellsData,\n annotations,\n valueColumn,\n dendrogramX,\n dendrogramY,\n this.calculatedData.dendrogramsData,\n inheritedDendrogramAes,\n this.calculatedData.cellUniqValues,\n normalization,\n this.onTooltipHintSwitch,\n customOrder,\n cellsRenderingMode\n );\n }\n}\n"],"mappings":"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"}
@@ -356,6 +356,8 @@ export declare const BubblesSettingsSchema: z.ZodObject<{
356
356
  }[] | undefined;
357
357
  }>>;
358
358
  NAValueAs: z.ZodOptional<z.ZodUnion<[z.ZodNumber, z.ZodNull]>>;
359
+ showEmptyRows: z.ZodOptional<z.ZodBoolean>;
360
+ showEmptyColumns: z.ZodOptional<z.ZodBoolean>;
359
361
  }, "strip", z.ZodTypeAny, {
360
362
  type: "bubble";
361
363
  title: {
@@ -485,6 +487,8 @@ export declare const BubblesSettingsSchema: z.ZodObject<{
485
487
  method?: "sum" | "mean" | "median" | "min" | "max" | undefined;
486
488
  } | undefined;
487
489
  NAValueAs?: number | null | undefined;
490
+ showEmptyRows?: boolean | undefined;
491
+ showEmptyColumns?: boolean | undefined;
488
492
  }, {
489
493
  type: "bubble";
490
494
  title: {
@@ -614,6 +618,8 @@ export declare const BubblesSettingsSchema: z.ZodObject<{
614
618
  method?: "sum" | "mean" | "median" | "min" | "max" | undefined;
615
619
  } | undefined;
616
620
  NAValueAs?: number | null | undefined;
621
+ showEmptyRows?: boolean | undefined;
622
+ showEmptyColumns?: boolean | undefined;
617
623
  }>;
618
624
  export type BubbleSettings = z.infer<typeof BubblesSettingsSchema>;
619
625
  //# sourceMappingURL=bubble.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"bubble.d.ts","sourceRoot":"","sources":["../../src/types/bubble.ts"],"names":[],"mappings":"AAQA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAYxB,eAAO,MAAM,qBAAqB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAoEhC,CAAC;AAEH,MAAM,MAAM,cAAc,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,qBAAqB,CAAC,CAAC"}
1
+ {"version":3,"file":"bubble.d.ts","sourceRoot":"","sources":["../../src/types/bubble.ts"],"names":[],"mappings":"AAQA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAYxB,eAAO,MAAM,qBAAqB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAsEhC,CAAC;AAEH,MAAM,MAAM,cAAc,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,qBAAqB,CAAC,CAAC"}
@@ -70,7 +70,9 @@ const c = o.object({
70
70
  emptyCellColor: o.optional(o.string())
71
71
  })),
72
72
  tooltips: o.optional(a),
73
- NAValueAs: o.optional(o.union([o.number(), o.null()]))
73
+ NAValueAs: o.optional(o.union([o.number(), o.null()])),
74
+ showEmptyRows: o.optional(o.boolean()),
75
+ showEmptyColumns: o.optional(o.boolean())
74
76
  });
75
77
  export { c as BubblesSettingsSchema };
76
78