@milaboratories/miplots4 1.0.178 → 1.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/bubble/BubbleSettingsImpl.d.ts +2 -0
- package/dist/bubble/BubbleSettingsImpl.d.ts.map +1 -1
- package/dist/bubble/BubbleSettingsImpl.js +3 -1
- package/dist/bubble/BubbleSettingsImpl.js.map +1 -1
- package/dist/bubble/getGroupedCellsData.d.ts +1 -1
- package/dist/bubble/getGroupedCellsData.d.ts.map +1 -1
- package/dist/bubble/getGroupedCellsData.js +30 -10
- package/dist/bubble/getGroupedCellsData.js.map +1 -1
- package/dist/bubble/index.d.ts.map +1 -1
- package/dist/bubble/index.js +3 -3
- package/dist/bubble/index.js.map +1 -1
- package/dist/heatmap/ChartRenderer.d.ts.map +1 -1
- package/dist/heatmap/ChartRenderer.js +26 -20
- package/dist/heatmap/ChartRenderer.js.map +1 -1
- package/dist/heatmap/HeatmapSettingsImpl.d.ts +2 -0
- package/dist/heatmap/HeatmapSettingsImpl.d.ts.map +1 -1
- package/dist/heatmap/HeatmapSettingsImpl.js +3 -1
- package/dist/heatmap/HeatmapSettingsImpl.js.map +1 -1
- package/dist/heatmap/fillCellsData.d.ts +22 -2
- package/dist/heatmap/fillCellsData.d.ts.map +1 -1
- package/dist/heatmap/fillCellsData.js +60 -47
- package/dist/heatmap/fillCellsData.js.map +1 -1
- package/dist/heatmap/getCells.d.ts +22 -1
- package/dist/heatmap/getCells.d.ts.map +1 -1
- package/dist/heatmap/getCells.js +23 -3
- package/dist/heatmap/getCells.js.map +1 -1
- package/dist/heatmap/getDendrograms.d.ts +5 -1
- package/dist/heatmap/getDendrograms.d.ts.map +1 -1
- package/dist/heatmap/getDendrograms.js +33 -11
- package/dist/heatmap/getDendrograms.js.map +1 -1
- package/dist/heatmap/index.d.ts.map +1 -1
- package/dist/heatmap/index.js +30 -6
- package/dist/heatmap/index.js.map +1 -1
- package/dist/scatterplot/ChartRenderer.d.ts +2 -2
- package/dist/scatterplot/ChartRenderer.d.ts.map +1 -1
- package/dist/scatterplot/ChartRenderer.js +155 -115
- package/dist/scatterplot/ChartRenderer.js.map +1 -1
- package/dist/scatterplot/ScatterplotSettingsImpl.d.ts +11 -1
- package/dist/scatterplot/ScatterplotSettingsImpl.d.ts.map +1 -1
- package/dist/scatterplot/ScatterplotSettingsImpl.js +20 -0
- package/dist/scatterplot/ScatterplotSettingsImpl.js.map +1 -1
- package/dist/scatterplot/components/ChartLayersData.d.ts +5 -0
- package/dist/scatterplot/components/ChartLayersData.d.ts.map +1 -1
- package/dist/scatterplot/components/ChartLayersData.js +115 -35
- package/dist/scatterplot/components/ChartLayersData.js.map +1 -1
- package/dist/scatterplot/components/types.d.ts +2 -0
- package/dist/scatterplot/components/types.d.ts.map +1 -1
- package/dist/scatterplot/getLayersData.d.ts +11 -2
- package/dist/scatterplot/getLayersData.d.ts.map +1 -1
- package/dist/scatterplot/getLayersData.js +36 -19
- package/dist/scatterplot/getLayersData.js.map +1 -1
- package/dist/scatterplot/index.d.ts.map +1 -1
- package/dist/scatterplot/index.js +51 -33
- package/dist/scatterplot/index.js.map +1 -1
- package/dist/scatterplot/linearRegression.js +1 -1
- package/dist/scatterplot/utils/createAesGetter.d.ts.map +1 -1
- package/dist/scatterplot/utils/createAesGetter.js +5 -3
- package/dist/scatterplot/utils/createAesGetter.js.map +1 -1
- package/dist/scatterplot/utils/createLegendInfo.d.ts +11 -2
- package/dist/scatterplot/utils/createLegendInfo.d.ts.map +1 -1
- package/dist/scatterplot/utils/createLegendInfo.js +21 -16
- package/dist/scatterplot/utils/createLegendInfo.js.map +1 -1
- package/dist/scatterplot-umap/ChartRenderer.d.ts +6 -6
- package/dist/scatterplot-umap/ChartRenderer.d.ts.map +1 -1
- package/dist/scatterplot-umap/ChartRenderer.js +99 -57
- package/dist/scatterplot-umap/ChartRenderer.js.map +1 -1
- package/dist/scatterplot-umap/SettingsImpl.d.ts +11 -1
- package/dist/scatterplot-umap/SettingsImpl.d.ts.map +1 -1
- package/dist/scatterplot-umap/SettingsImpl.js +21 -1
- package/dist/scatterplot-umap/SettingsImpl.js.map +1 -1
- package/dist/scatterplot-umap/components/LowerSVG.d.ts +3 -2
- package/dist/scatterplot-umap/components/LowerSVG.d.ts.map +1 -1
- package/dist/scatterplot-umap/components/LowerSVG.js +159 -108
- package/dist/scatterplot-umap/components/LowerSVG.js.map +1 -1
- package/dist/scatterplot-umap/components/SVGLayer.d.ts +1 -1
- package/dist/scatterplot-umap/components/SVGLayer.d.ts.map +1 -1
- package/dist/scatterplot-umap/components/SVGLayer.js +9 -8
- package/dist/scatterplot-umap/components/SVGLayer.js.map +1 -1
- package/dist/scatterplot-umap/index.d.ts +6 -1
- package/dist/scatterplot-umap/index.d.ts.map +1 -1
- package/dist/scatterplot-umap/index.js +65 -31
- package/dist/scatterplot-umap/index.js.map +1 -1
- package/dist/scatterplot-umap/types.d.ts +7 -0
- package/dist/scatterplot-umap/types.d.ts.map +1 -1
- package/dist/types/bubble.d.ts +6 -0
- package/dist/types/bubble.d.ts.map +1 -1
- package/dist/types/bubble.js +3 -1
- package/dist/types/bubble.js.map +1 -1
- package/dist/types/heatmap.d.ts +6 -0
- package/dist/types/heatmap.d.ts.map +1 -1
- package/dist/types/heatmap.js +2 -0
- package/dist/types/heatmap.js.map +1 -1
- package/dist/types/scatterplot-umap.d.ts +763 -87
- package/dist/types/scatterplot-umap.d.ts.map +1 -1
- package/dist/types/scatterplot-umap.js +19 -3
- package/dist/types/scatterplot-umap.js.map +1 -1
- package/dist/types/scatterplot.d.ts +1377 -44
- package/dist/types/scatterplot.d.ts.map +1 -1
- package/dist/types/scatterplot.js +27 -3
- package/dist/types/scatterplot.js.map +1 -1
- package/package.json +1 -1
|
@@ -29,6 +29,8 @@ export declare class BubbleSettingsImpl implements SettingsInterface {
|
|
|
29
29
|
method: AggregationMethod;
|
|
30
30
|
};
|
|
31
31
|
readonly NAValueAs: number | null;
|
|
32
|
+
readonly showEmptyRows: boolean;
|
|
33
|
+
readonly showEmptyColumns: boolean;
|
|
32
34
|
readonly keysOrder: Record<string, string[]>;
|
|
33
35
|
readonly chartSettings: {
|
|
34
36
|
readonly size: {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"BubbleSettingsImpl.d.ts","sourceRoot":"","sources":["../../src/bubble/BubbleSettingsImpl.ts"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"BubbleSettingsImpl.d.ts","sourceRoot":"","sources":["../../src/bubble/BubbleSettingsImpl.ts"],"names":[],"mappings":"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"}
|
|
@@ -16,6 +16,8 @@ var n = class {
|
|
|
16
16
|
normalization;
|
|
17
17
|
aggregation;
|
|
18
18
|
NAValueAs;
|
|
19
|
+
showEmptyRows;
|
|
20
|
+
showEmptyColumns;
|
|
19
21
|
keysOrder;
|
|
20
22
|
chartSettings;
|
|
21
23
|
aes;
|
|
@@ -26,7 +28,7 @@ var n = class {
|
|
|
26
28
|
titlePosition: "left",
|
|
27
29
|
order: n.facetSettings?.order ?? null,
|
|
28
30
|
...n.facetSettings
|
|
29
|
-
}, this.facetBy = n.facetBy ?? [], this.valueColumnSize = n.valueSize, this.valueColumnColor = n.valueColor, this.xColumn = n.xColumn, this.xGroupBy = n.xGroupBy ?? [], this.yColumn = n.yColumn, this.yGroupBy = n.yGroupBy ?? [], this.NAValueAs = n.NAValueAs ?? null, this.keysOrder = n.keysOrder ?? {}, this.normalization = n.normalization ?? null;
|
|
31
|
+
}, this.facetBy = n.facetBy ?? [], this.valueColumnSize = n.valueSize, this.valueColumnColor = n.valueColor, this.xColumn = n.xColumn, this.xGroupBy = n.xGroupBy ?? [], this.yColumn = n.yColumn, this.yGroupBy = n.yGroupBy ?? [], this.NAValueAs = n.NAValueAs ?? null, this.showEmptyRows = n.showEmptyRows ?? !1, this.showEmptyColumns = n.showEmptyColumns ?? !1, this.keysOrder = n.keysOrder ?? {}, this.normalization = n.normalization ?? null;
|
|
30
32
|
let r = n.size?.cellSize ?? null;
|
|
31
33
|
this.chartSettings = {
|
|
32
34
|
size: {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"BubbleSettingsImpl.js","names":[],"sources":["../../src/bubble/BubbleSettingsImpl.ts"],"sourcesContent":["import { BLACK, DEFAULT_HEIGHT, DEFAULT_HEIGHT_SMALL, DEFAULT_WIDTH, DEFAULT_WIDTH_SMALL } from '../constants';\nimport { BubblesSettingsSchema } from '../types';\nimport type {\n AggregationMethod,\n BubbleSettings,\n ColumnName,\n FrameType,\n LegendPosition,\n NormalizationDirection,\n NormalizationMethod,\n SettingsInterface,\n TitlePosition,\n} from '../types';\nimport lodash from 'lodash';\n\nexport class BubbleSettingsImpl implements SettingsInterface {\n readonly id: string;\n readonly type = 'bubble';\n readonly facetSettings: {\n order: string[] | null;\n sharedX: boolean;\n sharedY: boolean;\n nRows?: number;\n nCols?: number;\n titlePosition: 'left' | 'center' | 'right';\n };\n readonly valueColumnSize: ColumnName;\n readonly valueColumnColor: ColumnName;\n readonly xColumn: ColumnName;\n readonly xGroupBy: ColumnName[];\n readonly yColumn: ColumnName;\n readonly yGroupBy: ColumnName[];\n readonly facetBy: ColumnName[];\n readonly normalization: {\n direction: NormalizationDirection;\n method: NormalizationMethod;\n colorRange?: number[];\n sizeRange?: number[];\n } | null;\n readonly aggregation: {\n x: boolean;\n y: boolean;\n method: AggregationMethod;\n };\n readonly NAValueAs: number | null;\n readonly keysOrder: Record<string, string[]>;\n readonly chartSettings: {\n readonly size: { width: number | null; height: number | null, cellSize: number | null };\n readonly title: { name: string; show: boolean; position: TitlePosition };\n readonly yAxis: {\n title: string;\n showTicks: boolean;\n showTitle: boolean;\n showAxisLabels: boolean;\n position: 'left' | 'right';\n axisLabelsAngle: 0 | 45 | 90;\n sorting: 'asc' | 'desc';\n };\n readonly xAxis: {\n title: string;\n showTicks: boolean;\n showTitle: boolean;\n showAxisLabels: boolean;\n position: 'bottom' | 'top';\n axisLabelsAngle: 0 | 45 | 90;\n sorting: 'asc' | 'desc';\n };\n readonly frame: { type: FrameType };\n readonly legend: { show: boolean; position: LegendPosition };\n readonly tooltips: { show: boolean; content?: ColumnName[] };\n };\n readonly aes: {\n minRadius: number;\n maxRadius: number;\n colorsList: string[];\n cellStrokeColor: string;\n emptyCellColor: string;\n };\n\n constructor(settings: BubbleSettings) {\n BubblesSettingsSchema.parse(settings);\n this.id = lodash.uniqueId('settings');\n this.facetSettings = { sharedX: true, sharedY: true, titlePosition: 'left', order: settings.facetSettings?.order ?? null, ...settings.facetSettings };\n this.facetBy = settings.facetBy ?? [];\n this.valueColumnSize = settings.valueSize;\n this.valueColumnColor = settings.valueColor;\n this.xColumn = settings.xColumn;\n this.xGroupBy = settings.xGroupBy ?? [];\n this.yColumn = settings.yColumn;\n this.yGroupBy = settings.yGroupBy ?? [];\n this.NAValueAs = settings.NAValueAs ?? null;\n this.keysOrder = settings.keysOrder ?? {};\n this.normalization = settings.normalization ?? null;\n\n const cellSize = settings.size?.cellSize ?? null;\n const width = cellSize ? null : settings?.size?.width ?? (this.facetBy.length ? DEFAULT_WIDTH_SMALL : DEFAULT_WIDTH);\n const height = cellSize ? null : settings?.size?.height ?? (this.facetBy.length ? DEFAULT_HEIGHT_SMALL : DEFAULT_HEIGHT);\n this.chartSettings = {\n size: { width, height, cellSize },\n title: {\n position: 'center',\n show: true,\n ...settings.title,\n name: settings.title?.name ?? 'Chart',\n },\n yAxis: {\n title: settings.yColumn.label ?? settings.yColumn.value,\n showTicks: true,\n showTitle: true,\n showAxisLabels: true,\n position: 'left',\n axisLabelsAngle: 90,\n sorting: 'asc',\n ...settings.yAxis,\n },\n xAxis: {\n title: settings.xColumn.label ?? settings.xColumn.value,\n showTicks: true,\n showTitle: true,\n showAxisLabels: true,\n position: 'bottom',\n axisLabelsAngle: 90,\n sorting: 'asc',\n ...settings.xAxis,\n },\n frame: { type: settings.frame?.type ?? 'full' },\n legend: {\n show: true,\n position: 'right',\n ...settings.legend,\n },\n tooltips: {\n show: true,\n ...settings.tooltips,\n },\n };\n\n this.aggregation = {\n x: false,\n y: false,\n method: 'min',\n ...settings.aggregation\n };\n\n this.aes = {\n minRadius: settings.aes?.minRadius ?? 3,\n maxRadius: settings.aes?.maxRadius ?? 20,\n colorsList: settings.aes?.colorsList ?? ['black', 'white', 'red'],\n cellStrokeColor: settings.aes?.cellStrokeColor ?? BLACK,\n emptyCellColor: settings.aes?.emptyCellColor ?? 'white',\n };\n }\n}\n"],"mappings":";;;;AAeA,IAAa,IAAb,MAA6D;CACzD;CACA,OAAgB;CAChB;CAQA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CAMA;CAKA;CACA;CACA;CAyBA;CAQA,YAAY,GAA0B;
|
|
1
|
+
{"version":3,"file":"BubbleSettingsImpl.js","names":[],"sources":["../../src/bubble/BubbleSettingsImpl.ts"],"sourcesContent":["import { BLACK, DEFAULT_HEIGHT, DEFAULT_HEIGHT_SMALL, DEFAULT_WIDTH, DEFAULT_WIDTH_SMALL } from '../constants';\nimport { BubblesSettingsSchema } from '../types';\nimport type {\n AggregationMethod,\n BubbleSettings,\n ColumnName,\n FrameType,\n LegendPosition,\n NormalizationDirection,\n NormalizationMethod,\n SettingsInterface,\n TitlePosition,\n} from '../types';\nimport lodash from 'lodash';\n\nexport class BubbleSettingsImpl implements SettingsInterface {\n readonly id: string;\n readonly type = 'bubble';\n readonly facetSettings: {\n order: string[] | null;\n sharedX: boolean;\n sharedY: boolean;\n nRows?: number;\n nCols?: number;\n titlePosition: 'left' | 'center' | 'right';\n };\n readonly valueColumnSize: ColumnName;\n readonly valueColumnColor: ColumnName;\n readonly xColumn: ColumnName;\n readonly xGroupBy: ColumnName[];\n readonly yColumn: ColumnName;\n readonly yGroupBy: ColumnName[];\n readonly facetBy: ColumnName[];\n readonly normalization: {\n direction: NormalizationDirection;\n method: NormalizationMethod;\n colorRange?: number[];\n sizeRange?: number[];\n } | null;\n readonly aggregation: {\n x: boolean;\n y: boolean;\n method: AggregationMethod;\n };\n readonly NAValueAs: number | null;\n readonly showEmptyRows: boolean;\n readonly showEmptyColumns: boolean;\n readonly keysOrder: Record<string, string[]>;\n readonly chartSettings: {\n readonly size: { width: number | null; height: number | null, cellSize: number | null };\n readonly title: { name: string; show: boolean; position: TitlePosition };\n readonly yAxis: {\n title: string;\n showTicks: boolean;\n showTitle: boolean;\n showAxisLabels: boolean;\n position: 'left' | 'right';\n axisLabelsAngle: 0 | 45 | 90;\n sorting: 'asc' | 'desc';\n };\n readonly xAxis: {\n title: string;\n showTicks: boolean;\n showTitle: boolean;\n showAxisLabels: boolean;\n position: 'bottom' | 'top';\n axisLabelsAngle: 0 | 45 | 90;\n sorting: 'asc' | 'desc';\n };\n readonly frame: { type: FrameType };\n readonly legend: { show: boolean; position: LegendPosition };\n readonly tooltips: { show: boolean; content?: ColumnName[] };\n };\n readonly aes: {\n minRadius: number;\n maxRadius: number;\n colorsList: string[];\n cellStrokeColor: string;\n emptyCellColor: string;\n };\n\n constructor(settings: BubbleSettings) {\n BubblesSettingsSchema.parse(settings);\n this.id = lodash.uniqueId('settings');\n this.facetSettings = { sharedX: true, sharedY: true, titlePosition: 'left', order: settings.facetSettings?.order ?? null, ...settings.facetSettings };\n this.facetBy = settings.facetBy ?? [];\n this.valueColumnSize = settings.valueSize;\n this.valueColumnColor = settings.valueColor;\n this.xColumn = settings.xColumn;\n this.xGroupBy = settings.xGroupBy ?? [];\n this.yColumn = settings.yColumn;\n this.yGroupBy = settings.yGroupBy ?? [];\n this.NAValueAs = settings.NAValueAs ?? null;\n this.showEmptyRows = settings.showEmptyRows ?? false;\n this.showEmptyColumns = settings.showEmptyColumns ?? false;\n this.keysOrder = settings.keysOrder ?? {};\n this.normalization = settings.normalization ?? null;\n\n const cellSize = settings.size?.cellSize ?? null;\n const width = cellSize ? null : settings?.size?.width ?? (this.facetBy.length ? DEFAULT_WIDTH_SMALL : DEFAULT_WIDTH);\n const height = cellSize ? null : settings?.size?.height ?? (this.facetBy.length ? DEFAULT_HEIGHT_SMALL : DEFAULT_HEIGHT);\n this.chartSettings = {\n size: { width, height, cellSize },\n title: {\n position: 'center',\n show: true,\n ...settings.title,\n name: settings.title?.name ?? 'Chart',\n },\n yAxis: {\n title: settings.yColumn.label ?? settings.yColumn.value,\n showTicks: true,\n showTitle: true,\n showAxisLabels: true,\n position: 'left',\n axisLabelsAngle: 90,\n sorting: 'asc',\n ...settings.yAxis,\n },\n xAxis: {\n title: settings.xColumn.label ?? settings.xColumn.value,\n showTicks: true,\n showTitle: true,\n showAxisLabels: true,\n position: 'bottom',\n axisLabelsAngle: 90,\n sorting: 'asc',\n ...settings.xAxis,\n },\n frame: { type: settings.frame?.type ?? 'full' },\n legend: {\n show: true,\n position: 'right',\n ...settings.legend,\n },\n tooltips: {\n show: true,\n ...settings.tooltips,\n },\n };\n\n this.aggregation = {\n x: false,\n y: false,\n method: 'min',\n ...settings.aggregation\n };\n\n this.aes = {\n minRadius: settings.aes?.minRadius ?? 3,\n maxRadius: settings.aes?.maxRadius ?? 20,\n colorsList: settings.aes?.colorsList ?? ['black', 'white', 'red'],\n cellStrokeColor: settings.aes?.cellStrokeColor ?? BLACK,\n emptyCellColor: settings.aes?.emptyCellColor ?? 'white',\n };\n }\n}\n"],"mappings":";;;;AAeA,IAAa,IAAb,MAA6D;CACzD;CACA,OAAgB;CAChB;CAQA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CAMA;CAKA;CACA;CACA;CACA;CACA;CAyBA;CAQA,YAAY,GAA0B;AAelC,EAdA,EAAsB,MAAM,EAAS,EACrC,KAAK,KAAK,EAAO,SAAS,WAAW,EACrC,KAAK,gBAAgB;GAAE,SAAS;GAAM,SAAS;GAAM,eAAe;GAAQ,OAAO,EAAS,eAAe,SAAS;GAAM,GAAG,EAAS;GAAe,EACrJ,KAAK,UAAU,EAAS,WAAW,EAAE,EACrC,KAAK,kBAAkB,EAAS,WAChC,KAAK,mBAAmB,EAAS,YACjC,KAAK,UAAU,EAAS,SACxB,KAAK,WAAW,EAAS,YAAY,EAAE,EACvC,KAAK,UAAU,EAAS,SACxB,KAAK,WAAW,EAAS,YAAY,EAAE,EACvC,KAAK,YAAY,EAAS,aAAa,MACvC,KAAK,gBAAgB,EAAS,iBAAiB,IAC/C,KAAK,mBAAmB,EAAS,oBAAoB,IACrD,KAAK,YAAY,EAAS,aAAa,EAAE,EACzC,KAAK,gBAAgB,EAAS,iBAAiB;EAE/C,IAAM,IAAW,EAAS,MAAM,YAAY;AAkD5C,EA/CA,KAAK,gBAAgB;GACjB,MAAM;IAAE,OAHE,IAAW,OAAO,GAAU,MAAM,UAAU,KAAK,QAAQ,SAAA,MAAA;IAGpD,QAFJ,IAAW,OAAO,GAAU,MAAM,WAAW,KAAK,QAAQ,SAAA,MAAA;IAE9C;IAAU;GACjC,OAAO;IACH,UAAU;IACV,MAAM;IACN,GAAG,EAAS;IACZ,MAAM,EAAS,OAAO,QAAQ;IACjC;GACD,OAAO;IACH,OAAO,EAAS,QAAQ,SAAS,EAAS,QAAQ;IAClD,WAAW;IACX,WAAW;IACX,gBAAgB;IAChB,UAAU;IACV,iBAAiB;IACjB,SAAS;IACT,GAAG,EAAS;IACf;GACD,OAAO;IACH,OAAO,EAAS,QAAQ,SAAS,EAAS,QAAQ;IAClD,WAAW;IACX,WAAW;IACX,gBAAgB;IAChB,UAAU;IACV,iBAAiB;IACjB,SAAS;IACT,GAAG,EAAS;IACf;GACD,OAAO,EAAE,MAAM,EAAS,OAAO,QAAQ,QAAQ;GAC/C,QAAQ;IACJ,MAAM;IACN,UAAU;IACV,GAAG,EAAS;IACf;GACD,UAAU;IACN,MAAM;IACN,GAAG,EAAS;IACf;GACJ,EAED,KAAK,cAAc;GACf,GAAG;GACH,GAAG;GACH,QAAQ;GACR,GAAG,EAAS;GACf,EAED,KAAK,MAAM;GACP,WAAW,EAAS,KAAK,aAAa;GACtC,WAAW,EAAS,KAAK,aAAa;GACtC,YAAY,EAAS,KAAK,cAAc;IAAC;IAAS;IAAS;IAAM;GACjE,iBAAiB,EAAS,KAAK,mBAAA;GAC/B,gBAAgB,EAAS,KAAK,kBAAkB;GACnD"}
|
|
@@ -5,6 +5,6 @@ import { Cell, GroupedCellsData } from '../heatmap/fillCellsData';
|
|
|
5
5
|
type BubbleDataFields = 'sizeValue' | 'colorValue';
|
|
6
6
|
export type CellBubble = Cell<BubbleDataFields>;
|
|
7
7
|
export type GroupedCellsBubble = GroupedCellsData<BubbleDataFields>;
|
|
8
|
-
export declare function getGroupedCellsData(data: DataFrame, xColumn: ColumnName, yColumn: ColumnName, valueColumnSize: ColumnName, valueColumnColor: ColumnName, facetBy: ColumnName[], xGroupBy: ColumnName[], yGroupBy: ColumnName[], facetSettings: BubbleSettingsImpl['facetSettings'], normalization: BubbleSettingsImpl['normalization'], NAValueAs: BubbleSettingsImpl['NAValueAs'], keysOrder: BubbleSettingsImpl['keysOrder'], xAxis: BubbleSettingsImpl['chartSettings']['xAxis'], yAxis: BubbleSettingsImpl['chartSettings']['yAxis'], aggregation: BubbleSettingsImpl['aggregation']): GroupedCellsBubble;
|
|
8
|
+
export declare function getGroupedCellsData(data: DataFrame, xColumn: ColumnName, yColumn: ColumnName, valueColumnSize: ColumnName, valueColumnColor: ColumnName, facetBy: ColumnName[], xGroupBy: ColumnName[], yGroupBy: ColumnName[], facetSettings: BubbleSettingsImpl['facetSettings'], normalization: BubbleSettingsImpl['normalization'], NAValueAs: BubbleSettingsImpl['NAValueAs'], keysOrder: BubbleSettingsImpl['keysOrder'], xAxis: BubbleSettingsImpl['chartSettings']['xAxis'], yAxis: BubbleSettingsImpl['chartSettings']['yAxis'], aggregation: BubbleSettingsImpl['aggregation'], showEmptyRows?: boolean, showEmptyColumns?: boolean): GroupedCellsBubble;
|
|
9
9
|
export {};
|
|
10
10
|
//# sourceMappingURL=getGroupedCellsData.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"getGroupedCellsData.d.ts","sourceRoot":"","sources":["../../src/bubble/getGroupedCellsData.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,kBAAkB,EAAE,MAAM,sBAAsB,CAAC;AAC/D,OAAO,EAAE,KAAK,IAAI,EAAiB,KAAK,gBAAgB,EAAE,MAAM,0BAA0B,CAAC;AAI3F,KAAK,gBAAgB,GAAG,WAAW,GAAC,YAAY,CAAC;AACjD,MAAM,MAAM,UAAU,GAAG,IAAI,CAAC,gBAAgB,CAAC,CAAC;AAChD,MAAM,MAAM,kBAAkB,GAAG,gBAAgB,CAAC,gBAAgB,CAAC,CAAC;AAoCpE,wBAAgB,mBAAmB,CAC/B,IAAI,EAAE,SAAS,EACf,OAAO,EAAE,UAAU,EACnB,OAAO,EAAE,UAAU,EACnB,eAAe,EAAE,UAAU,EAC3B,gBAAgB,EAAE,UAAU,EAC5B,OAAO,EAAE,UAAU,EAAE,EACrB,QAAQ,EAAE,UAAU,EAAE,EACtB,QAAQ,EAAE,UAAU,EAAE,EACtB,aAAa,EAAE,kBAAkB,CAAC,eAAe,CAAC,EAClD,aAAa,EAAE,kBAAkB,CAAC,eAAe,CAAC,EAClD,SAAS,EAAE,kBAAkB,CAAC,WAAW,CAAC,EAC1C,SAAS,EAAE,kBAAkB,CAAC,WAAW,CAAC,EAC1C,KAAK,EAAE,kBAAkB,CAAC,eAAe,CAAC,CAAC,OAAO,CAAC,EACnD,KAAK,EAAE,kBAAkB,CAAC,eAAe,CAAC,CAAC,OAAO,CAAC,EACnD,WAAW,EAAE,kBAAkB,CAAC,aAAa,CAAC,
|
|
1
|
+
{"version":3,"file":"getGroupedCellsData.d.ts","sourceRoot":"","sources":["../../src/bubble/getGroupedCellsData.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,kBAAkB,EAAE,MAAM,sBAAsB,CAAC;AAC/D,OAAO,EAAE,KAAK,IAAI,EAAiB,KAAK,gBAAgB,EAAE,MAAM,0BAA0B,CAAC;AAI3F,KAAK,gBAAgB,GAAG,WAAW,GAAC,YAAY,CAAC;AACjD,MAAM,MAAM,UAAU,GAAG,IAAI,CAAC,gBAAgB,CAAC,CAAC;AAChD,MAAM,MAAM,kBAAkB,GAAG,gBAAgB,CAAC,gBAAgB,CAAC,CAAC;AAoCpE,wBAAgB,mBAAmB,CAC/B,IAAI,EAAE,SAAS,EACf,OAAO,EAAE,UAAU,EACnB,OAAO,EAAE,UAAU,EACnB,eAAe,EAAE,UAAU,EAC3B,gBAAgB,EAAE,UAAU,EAC5B,OAAO,EAAE,UAAU,EAAE,EACrB,QAAQ,EAAE,UAAU,EAAE,EACtB,QAAQ,EAAE,UAAU,EAAE,EACtB,aAAa,EAAE,kBAAkB,CAAC,eAAe,CAAC,EAClD,aAAa,EAAE,kBAAkB,CAAC,eAAe,CAAC,EAClD,SAAS,EAAE,kBAAkB,CAAC,WAAW,CAAC,EAC1C,SAAS,EAAE,kBAAkB,CAAC,WAAW,CAAC,EAC1C,KAAK,EAAE,kBAAkB,CAAC,eAAe,CAAC,CAAC,OAAO,CAAC,EACnD,KAAK,EAAE,kBAAkB,CAAC,eAAe,CAAC,CAAC,OAAO,CAAC,EACnD,WAAW,EAAE,kBAAkB,CAAC,aAAa,CAAC,EAC9C,aAAa,GAAE,OAAe,EAC9B,gBAAgB,GAAE,OAAe,GAClC,kBAAkB,CA0BpB"}
|
|
@@ -28,16 +28,36 @@ function n() {
|
|
|
28
28
|
facets: {}
|
|
29
29
|
};
|
|
30
30
|
}
|
|
31
|
-
function r(r, i, a, o, s, c, l, u, d, f, p, m, h, g, _) {
|
|
32
|
-
let
|
|
33
|
-
if (e(
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
31
|
+
function r(r, i, a, o, s, c, l, u, d, f, p, m, h, g, _, v = !1, y = !1) {
|
|
32
|
+
let b = n();
|
|
33
|
+
if (e(b, {
|
|
34
|
+
data: r,
|
|
35
|
+
xColumn: i,
|
|
36
|
+
yColumn: a,
|
|
37
|
+
valueColumns: {
|
|
38
|
+
sizeValue: o,
|
|
39
|
+
colorValue: s
|
|
40
|
+
},
|
|
41
|
+
facetBy: c,
|
|
42
|
+
xGroupBy: l,
|
|
43
|
+
yGroupBy: u,
|
|
44
|
+
facetSettings: d,
|
|
45
|
+
annotations: [],
|
|
46
|
+
dendrogramX: null,
|
|
47
|
+
dendrogramY: null,
|
|
48
|
+
normalizationBySource: {
|
|
49
|
+
sizeValue: null,
|
|
50
|
+
colorValue: f
|
|
51
|
+
},
|
|
52
|
+
NAValueAs: p,
|
|
53
|
+
keysOrder: m,
|
|
54
|
+
xAxis: h,
|
|
55
|
+
yAxis: g,
|
|
56
|
+
aggregation: _,
|
|
57
|
+
showEmptyRows: v,
|
|
58
|
+
showEmptyColumns: y
|
|
59
|
+
}), b.meta.xKeys.length * b.meta.yKeys.length > t) throw Error(`Too many cells for graph rendering (${b.meta.xKeys.length * b.meta.yKeys.length})`);
|
|
60
|
+
return b;
|
|
41
61
|
}
|
|
42
62
|
export { r as getGroupedCellsData };
|
|
43
63
|
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"getGroupedCellsData.js","names":[],"sources":["../../src/bubble/getGroupedCellsData.ts"],"sourcesContent":["import type { DataFrame } from '../DataFrame';\nimport type { ColumnName } from '../types';\nimport type { BubbleSettingsImpl } from './BubbleSettingsImpl';\nimport { type Cell, fillCellsData, type GroupedCellsData } from '../heatmap/fillCellsData';\n\nconst MAX_RENDERED_CELLS_COUNT = 1000000;\n\ntype BubbleDataFields = 'sizeValue'|'colorValue';\nexport type CellBubble = Cell<BubbleDataFields>;\nexport type GroupedCellsBubble = GroupedCellsData<BubbleDataFields>;\n\nfunction createEmptyGroupedCells(): GroupedCellsBubble {\n return {\n meta: {\n valueSources: ['sizeValue', 'colorValue'],\n facetKeys: [],\n xGroupKeys: [],\n yGroupKeys: [],\n\n xKeys: [], // all the keys from facets\n yKeys: [], // all the keys from facets\n xKeysByGroups: {},\n yKeysByGroups: {},\n\n xLabels: {},\n yLabels: {},\n xGroupLabels: {},\n yGroupLabels: {},\n\n facetKeyValues: {},\n xGroupKeyValues: {},\n yGroupKeyValues: {},\n\n xDataByKeys: {},\n yDataByKeys: {},\n\n valueExtent: {\n sizeValue: [Infinity, -Infinity],\n colorValue: [Infinity, -Infinity]\n }\n },\n facets: {},\n };\n}\n\nexport function getGroupedCellsData(\n data: DataFrame,\n xColumn: ColumnName,\n yColumn: ColumnName,\n valueColumnSize: ColumnName,\n valueColumnColor: ColumnName,\n facetBy: ColumnName[],\n xGroupBy: ColumnName[],\n yGroupBy: ColumnName[],\n facetSettings: BubbleSettingsImpl['facetSettings'],\n normalization: BubbleSettingsImpl['normalization'],\n NAValueAs: BubbleSettingsImpl['NAValueAs'],\n keysOrder: BubbleSettingsImpl['keysOrder'],\n xAxis: BubbleSettingsImpl['chartSettings']['xAxis'],\n yAxis: BubbleSettingsImpl['chartSettings']['yAxis'],\n aggregation: BubbleSettingsImpl['aggregation'],\n): GroupedCellsBubble {\n const result: GroupedCellsBubble = createEmptyGroupedCells();\n\n fillCellsData(\n
|
|
1
|
+
{"version":3,"file":"getGroupedCellsData.js","names":[],"sources":["../../src/bubble/getGroupedCellsData.ts"],"sourcesContent":["import type { DataFrame } from '../DataFrame';\nimport type { ColumnName } from '../types';\nimport type { BubbleSettingsImpl } from './BubbleSettingsImpl';\nimport { type Cell, fillCellsData, type GroupedCellsData } from '../heatmap/fillCellsData';\n\nconst MAX_RENDERED_CELLS_COUNT = 1000000;\n\ntype BubbleDataFields = 'sizeValue'|'colorValue';\nexport type CellBubble = Cell<BubbleDataFields>;\nexport type GroupedCellsBubble = GroupedCellsData<BubbleDataFields>;\n\nfunction createEmptyGroupedCells(): GroupedCellsBubble {\n return {\n meta: {\n valueSources: ['sizeValue', 'colorValue'],\n facetKeys: [],\n xGroupKeys: [],\n yGroupKeys: [],\n\n xKeys: [], // all the keys from facets\n yKeys: [], // all the keys from facets\n xKeysByGroups: {},\n yKeysByGroups: {},\n\n xLabels: {},\n yLabels: {},\n xGroupLabels: {},\n yGroupLabels: {},\n\n facetKeyValues: {},\n xGroupKeyValues: {},\n yGroupKeyValues: {},\n\n xDataByKeys: {},\n yDataByKeys: {},\n\n valueExtent: {\n sizeValue: [Infinity, -Infinity],\n colorValue: [Infinity, -Infinity]\n }\n },\n facets: {},\n };\n}\n\nexport function getGroupedCellsData(\n data: DataFrame,\n xColumn: ColumnName,\n yColumn: ColumnName,\n valueColumnSize: ColumnName,\n valueColumnColor: ColumnName,\n facetBy: ColumnName[],\n xGroupBy: ColumnName[],\n yGroupBy: ColumnName[],\n facetSettings: BubbleSettingsImpl['facetSettings'],\n normalization: BubbleSettingsImpl['normalization'],\n NAValueAs: BubbleSettingsImpl['NAValueAs'],\n keysOrder: BubbleSettingsImpl['keysOrder'],\n xAxis: BubbleSettingsImpl['chartSettings']['xAxis'],\n yAxis: BubbleSettingsImpl['chartSettings']['yAxis'],\n aggregation: BubbleSettingsImpl['aggregation'],\n showEmptyRows: boolean = false,\n showEmptyColumns: boolean = false,\n): GroupedCellsBubble {\n const result: GroupedCellsBubble = createEmptyGroupedCells();\n\n fillCellsData(result, {\n data,\n xColumn, yColumn,\n valueColumns: { sizeValue: valueColumnSize, colorValue: valueColumnColor },\n facetBy, xGroupBy, yGroupBy,\n facetSettings,\n annotations: [],\n dendrogramX: null,\n dendrogramY: null,\n normalizationBySource: { sizeValue: null, colorValue: normalization },\n NAValueAs,\n keysOrder,\n xAxis,\n yAxis,\n aggregation,\n showEmptyRows,\n showEmptyColumns,\n });\n\n if (result.meta.xKeys.length * result.meta.yKeys.length > MAX_RENDERED_CELLS_COUNT) {\n throw Error(`Too many cells for graph rendering (${result.meta.xKeys.length * result.meta.yKeys.length})`);\n }\n return result;\n}\n"],"mappings":";AAKA,IAAM,IAA2B;AAMjC,SAAS,IAA8C;AACnD,QAAO;EACH,MAAM;GACF,cAAc,CAAC,aAAa,aAAa;GACzC,WAAW,EAAE;GACb,YAAY,EAAE;GACd,YAAY,EAAE;GAEd,OAAO,EAAE;GACT,OAAO,EAAE;GACT,eAAe,EAAE;GACjB,eAAe,EAAE;GAEjB,SAAS,EAAE;GACX,SAAS,EAAE;GACX,cAAc,EAAE;GAChB,cAAc,EAAE;GAEhB,gBAAgB,EAAE;GAClB,iBAAiB,EAAE;GACnB,iBAAiB,EAAE;GAEnB,aAAa,EAAE;GACf,aAAa,EAAE;GAEf,aAAa;IACT,WAAW,CAAC,UAAU,UAAU;IAChC,YAAY,CAAC,UAAU,UAAU;IACpC;GACJ;EACD,QAAQ,EAAE;EACb;;AAGL,SAAgB,EACZ,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,IAAyB,IACzB,IAA4B,IACV;CAClB,IAAM,IAA6B,GAAyB;AAqB5D,KAnBA,EAAc,GAAQ;EAClB;EACA;EAAS;EACT,cAAc;GAAE,WAAW;GAAiB,YAAY;GAAkB;EAC1E;EAAS;EAAU;EACnB;EACA,aAAa,EAAE;EACf,aAAa;EACb,aAAa;EACb,uBAAuB;GAAE,WAAW;GAAM,YAAY;GAAe;EACrE;EACA;EACA;EACA;EACA;EACA;EACA;EACH,CAAC,EAEE,EAAO,KAAK,MAAM,SAAS,EAAO,KAAK,MAAM,SAAS,EACtD,OAAM,MAAM,uCAAuC,EAAO,KAAK,MAAM,SAAS,EAAO,KAAK,MAAM,OAAO,GAAG;AAE9G,QAAO"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/bubble/index.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,aAAa,EAAE,MAAM,kBAAkB,CAAC;AACjD,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,cAAc,CAAC;AAC9C,OAAO,EAAE,KAAK,mBAAmB,EAAE,KAAK,cAAc,EAAoC,MAAM,UAAU,CAAC;AAC3G,OAAO,EAAE,kBAAkB,EAAE,MAAM,sBAAsB,CAAC;AAC1D,OAAO,aAAa,MAAM,iBAAiB,CAAC;AAE5C,OAAO,EAAwC,KAAK,kBAAkB,EAAE,MAAM,uBAAuB,CAAC;AAGtG,qBAAa,WAAY,SAAQ,aAAa;IAC1C,QAAQ,EAAE,kBAAkB,CAAC;IAC7B,aAAa,EAAE,aAAa,CAAC;IAE7B,mBAAmB,EAAE,CAAC,CAAC,EAAC,OAAO,KAAK,IAAI,CAAmB;IAC3D,cAAc,EAAE;QACZ,gBAAgB,EAAE,kBAAkB,CAAC;KACxC,GAAG,IAAI,CAAQ;gBAEJ,IAAI,EAAE,SAAS,EAAE,QAAQ,EAAE,cAAc,EAAE,aAAa,CAAC,EAAE,mBAAmB;IAU1F,KAAK,CAAC,IAAI,EAAE,WAAW;IAiBvB,OAAO;IAIP,qBAAqB,CAAC,IAAI,EAAE,SAAS,EAAE,QAAQ,EAAE,cAAc;IA2B/D,gBAAgB,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,OAAO;IAIhD,MAAM,IAAI,MAAM;IAKhB,mCAAmC,CAAC,YAAY,EAAE,kBAAkB,EAAE,QAAQ,EAAE,kBAAkB;
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/bubble/index.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,aAAa,EAAE,MAAM,kBAAkB,CAAC;AACjD,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,cAAc,CAAC;AAC9C,OAAO,EAAE,KAAK,mBAAmB,EAAE,KAAK,cAAc,EAAoC,MAAM,UAAU,CAAC;AAC3G,OAAO,EAAE,kBAAkB,EAAE,MAAM,sBAAsB,CAAC;AAC1D,OAAO,aAAa,MAAM,iBAAiB,CAAC;AAE5C,OAAO,EAAwC,KAAK,kBAAkB,EAAE,MAAM,uBAAuB,CAAC;AAGtG,qBAAa,WAAY,SAAQ,aAAa;IAC1C,QAAQ,EAAE,kBAAkB,CAAC;IAC7B,aAAa,EAAE,aAAa,CAAC;IAE7B,mBAAmB,EAAE,CAAC,CAAC,EAAC,OAAO,KAAK,IAAI,CAAmB;IAC3D,cAAc,EAAE;QACZ,gBAAgB,EAAE,kBAAkB,CAAC;KACxC,GAAG,IAAI,CAAQ;gBAEJ,IAAI,EAAE,SAAS,EAAE,QAAQ,EAAE,cAAc,EAAE,aAAa,CAAC,EAAE,mBAAmB;IAU1F,KAAK,CAAC,IAAI,EAAE,WAAW;IAiBvB,OAAO;IAIP,qBAAqB,CAAC,IAAI,EAAE,SAAS,EAAE,QAAQ,EAAE,cAAc;IA2B/D,gBAAgB,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,OAAO;IAIhD,MAAM,IAAI,MAAM;IAKhB,mCAAmC,CAAC,YAAY,EAAE,kBAAkB,EAAE,QAAQ,EAAE,kBAAkB;IAiBlG,+BAA+B,CAAC,QAAQ,EAAE,SAAS,EAAE,IAAI,EAAE,SAAS;IAUpE,WAAW;IA4BX,gBAAgB;IAOhB,YAAY;IA2BZ,OAAO,CAAC,WAAW,CAIjB;CACL"}
|
package/dist/bubble/index.js
CHANGED
|
@@ -40,15 +40,15 @@ var l = class extends e {
|
|
|
40
40
|
return this._updateChart(), c(this.chartRenderer.component);
|
|
41
41
|
}
|
|
42
42
|
_needUpdateCalculatedDataBySettings(e, t) {
|
|
43
|
-
return e.facetBy.some((e, n) => e.value !== t.facetBy[n]?.value) || r(e.facetSettings?.order ?? [], t.facetSettings?.order ?? []) || e.normalization?.method !== t.normalization?.method || e.normalization?.direction !== t.normalization?.direction || e.xColumn.value !== t.xColumn.value || e.yColumn.value !== t.yColumn.value || e.valueColumnColor.value !== t.valueColumnColor.value || e.valueColumnSize.value !== t.valueColumnSize.value || e.NAValueAs !== t.NAValueAs || e.aggregation?.method !== t.aggregation?.method || e.aggregation?.x !== t.aggregation?.x || e.aggregation?.y !== t.aggregation?.y;
|
|
43
|
+
return e.facetBy.some((e, n) => e.value !== t.facetBy[n]?.value) || r(e.facetSettings?.order ?? [], t.facetSettings?.order ?? []) || e.normalization?.method !== t.normalization?.method || e.normalization?.direction !== t.normalization?.direction || e.xColumn.value !== t.xColumn.value || e.yColumn.value !== t.yColumn.value || e.valueColumnColor.value !== t.valueColumnColor.value || e.valueColumnSize.value !== t.valueColumnSize.value || e.NAValueAs !== t.NAValueAs || e.aggregation?.method !== t.aggregation?.method || e.aggregation?.x !== t.aggregation?.x || e.aggregation?.y !== t.aggregation?.y || e.showEmptyRows !== t.showEmptyRows || e.showEmptyColumns !== t.showEmptyColumns;
|
|
44
44
|
}
|
|
45
45
|
_needUpdateCalculatedDataByData(e, t) {
|
|
46
46
|
let n = Object.keys(e.data), r = Object.keys(t.data);
|
|
47
47
|
return e.id !== t.id || n.length !== r.length || n.some((n) => e.data[n].length !== t.data[n]?.length);
|
|
48
48
|
}
|
|
49
49
|
_updateData() {
|
|
50
|
-
let { facetBy: e, facetSettings: t, xGroupBy: n, yGroupBy: r, xColumn: i, yColumn: a, valueColumnSize: o, valueColumnColor: c, normalization: l, NAValueAs: u, aggregation: d, chartSettings: f, keysOrder: p } = this.settings;
|
|
51
|
-
this.calculatedData = { groupedCellsData: s(this.data, i, a, o, c, e, n, r, t, l, u, p, f.xAxis, f.yAxis, d) };
|
|
50
|
+
let { facetBy: e, facetSettings: t, xGroupBy: n, yGroupBy: r, xColumn: i, yColumn: a, valueColumnSize: o, valueColumnColor: c, normalization: l, NAValueAs: u, aggregation: d, chartSettings: f, keysOrder: p, showEmptyRows: m, showEmptyColumns: h } = this.settings;
|
|
51
|
+
this.calculatedData = { groupedCellsData: s(this.data, i, a, o, c, e, n, r, t, l, u, p, f.xAxis, f.yAxis, d, m, h) };
|
|
52
52
|
}
|
|
53
53
|
_updateAesInData() {
|
|
54
54
|
this.calculatedData;
|
package/dist/bubble/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","names":[],"sources":["../../src/bubble/index.ts"],"sourcesContent":["import { renderToString } from 'react-dom/server.browser';\nimport { AbstractChart } from '../AbstractChart';\nimport type { DataFrame } from '../DataFrame';\nimport { type BubbleEventHandlers, type BubbleSettings, getUnknownErrorInfo, isErrorInfo } from '../types';\nimport { BubbleSettingsImpl } from './BubbleSettingsImpl';\nimport ChartRenderer from './ChartRenderer';\nimport { getCellTooltip } from './getCellTooltip';\nimport { type CellBubble, getGroupedCellsData, type GroupedCellsBubble } from './getGroupedCellsData';\nimport { arraysAreDifferent } from '../utils/arraysAreDifferent';\n\nexport class ChartBubble extends AbstractChart {\n settings: BubbleSettingsImpl;\n chartRenderer: ChartRenderer;\n\n onTooltipHintSwitch: (v:boolean) => void = () => undefined;\n calculatedData: {\n groupedCellsData: GroupedCellsBubble;\n } | null = null;\n\n constructor(data: DataFrame, settings: BubbleSettings, eventHandlers?: BubbleEventHandlers) {\n super(data, settings);\n\n this.settings = new BubbleSettingsImpl(settings);\n this.chartRenderer = new ChartRenderer();\n if (eventHandlers) {\n this.onTooltipHintSwitch = eventHandlers[0];\n }\n }\n\n mount(node: HTMLElement) {\n try {\n this.chartRenderer.init(node);\n this._updateData();\n this._updateChart();\n this.hasError = false;\n 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: BubbleSettings) {\n try {\n const previousSettings = this.settings;\n const previousData = this.data;\n this.settings = new BubbleSettingsImpl(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._updateChart();\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 bubble chart');\n }\n\n export(): string {\n this._updateChart();\n return renderToString(this.chartRenderer.component);\n }\n\n _needUpdateCalculatedDataBySettings(prevSettings: BubbleSettingsImpl, settings: BubbleSettingsImpl) {\n return prevSettings.facetBy.some((el, idx) => el.value !== settings.facetBy[idx]?.value) ||\n arraysAreDifferent(prevSettings.facetSettings?.order ?? [], settings.facetSettings?.order ?? []) ||\n prevSettings.normalization?.method !== settings.normalization?.method ||\n prevSettings.normalization?.direction !== settings.normalization?.direction ||\n prevSettings.xColumn.value !== settings.xColumn.value ||\n prevSettings.yColumn.value !== settings.yColumn.value ||\n prevSettings.valueColumnColor.value !== settings.valueColumnColor.value ||\n prevSettings.valueColumnSize.value !== settings.valueColumnSize.value ||\n prevSettings.NAValueAs !== settings.NAValueAs ||\n prevSettings.aggregation?.method !== settings.aggregation?.method ||\n prevSettings.aggregation?.x !== settings.aggregation?.x ||\n prevSettings.aggregation?.y !== settings.aggregation?.y;\n }\n\n _needUpdateCalculatedDataByData(prevData: DataFrame, data: DataFrame) {\n const prevKeys = Object.keys(prevData.data);\n const keys = Object.keys(data.data);\n return (\n prevData.id !== data.id ||\n prevKeys.length !== keys.length ||\n prevKeys.some(key => prevData.data[key].length !== data.data[key]?.length)\n );\n }\n\n _updateData() {\n const {facetBy, facetSettings, xGroupBy, yGroupBy, xColumn, yColumn, valueColumnSize, valueColumnColor, normalization, NAValueAs, aggregation, chartSettings, keysOrder} = this.settings;\n\n const groupedCellsData = getGroupedCellsData(\n this.data,\n xColumn,\n yColumn,\n valueColumnSize,\n valueColumnColor,\n facetBy,\n xGroupBy,\n yGroupBy,\n facetSettings,\n normalization,\n NAValueAs,\n keysOrder,\n chartSettings.xAxis,\n chartSettings.yAxis,\n aggregation
|
|
1
|
+
{"version":3,"file":"index.js","names":[],"sources":["../../src/bubble/index.ts"],"sourcesContent":["import { renderToString } from 'react-dom/server.browser';\nimport { AbstractChart } from '../AbstractChart';\nimport type { DataFrame } from '../DataFrame';\nimport { type BubbleEventHandlers, type BubbleSettings, getUnknownErrorInfo, isErrorInfo } from '../types';\nimport { BubbleSettingsImpl } from './BubbleSettingsImpl';\nimport ChartRenderer from './ChartRenderer';\nimport { getCellTooltip } from './getCellTooltip';\nimport { type CellBubble, getGroupedCellsData, type GroupedCellsBubble } from './getGroupedCellsData';\nimport { arraysAreDifferent } from '../utils/arraysAreDifferent';\n\nexport class ChartBubble extends AbstractChart {\n settings: BubbleSettingsImpl;\n chartRenderer: ChartRenderer;\n\n onTooltipHintSwitch: (v:boolean) => void = () => undefined;\n calculatedData: {\n groupedCellsData: GroupedCellsBubble;\n } | null = null;\n\n constructor(data: DataFrame, settings: BubbleSettings, eventHandlers?: BubbleEventHandlers) {\n super(data, settings);\n\n this.settings = new BubbleSettingsImpl(settings);\n this.chartRenderer = new ChartRenderer();\n if (eventHandlers) {\n this.onTooltipHintSwitch = eventHandlers[0];\n }\n }\n\n mount(node: HTMLElement) {\n try {\n this.chartRenderer.init(node);\n this._updateData();\n this._updateChart();\n this.hasError = false;\n 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: BubbleSettings) {\n try {\n const previousSettings = this.settings;\n const previousData = this.data;\n this.settings = new BubbleSettingsImpl(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._updateChart();\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 bubble chart');\n }\n\n export(): string {\n this._updateChart();\n return renderToString(this.chartRenderer.component);\n }\n\n _needUpdateCalculatedDataBySettings(prevSettings: BubbleSettingsImpl, settings: BubbleSettingsImpl) {\n return prevSettings.facetBy.some((el, idx) => el.value !== settings.facetBy[idx]?.value) ||\n arraysAreDifferent(prevSettings.facetSettings?.order ?? [], settings.facetSettings?.order ?? []) ||\n prevSettings.normalization?.method !== settings.normalization?.method ||\n prevSettings.normalization?.direction !== settings.normalization?.direction ||\n prevSettings.xColumn.value !== settings.xColumn.value ||\n prevSettings.yColumn.value !== settings.yColumn.value ||\n prevSettings.valueColumnColor.value !== settings.valueColumnColor.value ||\n prevSettings.valueColumnSize.value !== settings.valueColumnSize.value ||\n prevSettings.NAValueAs !== settings.NAValueAs ||\n prevSettings.aggregation?.method !== settings.aggregation?.method ||\n prevSettings.aggregation?.x !== settings.aggregation?.x ||\n prevSettings.aggregation?.y !== settings.aggregation?.y ||\n prevSettings.showEmptyRows !== settings.showEmptyRows ||\n prevSettings.showEmptyColumns !== settings.showEmptyColumns;\n }\n\n _needUpdateCalculatedDataByData(prevData: DataFrame, data: DataFrame) {\n const prevKeys = Object.keys(prevData.data);\n const keys = Object.keys(data.data);\n return (\n prevData.id !== data.id ||\n prevKeys.length !== keys.length ||\n prevKeys.some(key => prevData.data[key].length !== data.data[key]?.length)\n );\n }\n\n _updateData() {\n const {facetBy, facetSettings, xGroupBy, yGroupBy, xColumn, yColumn, valueColumnSize, valueColumnColor, normalization, NAValueAs, aggregation, chartSettings, keysOrder, showEmptyRows, showEmptyColumns} = this.settings;\n\n const groupedCellsData = getGroupedCellsData(\n this.data,\n xColumn,\n yColumn,\n valueColumnSize,\n valueColumnColor,\n facetBy,\n xGroupBy,\n yGroupBy,\n facetSettings,\n normalization,\n NAValueAs,\n keysOrder,\n chartSettings.xAxis,\n chartSettings.yAxis,\n aggregation,\n showEmptyRows,\n showEmptyColumns,\n );\n\n this.calculatedData = {\n groupedCellsData,\n };\n }\n\n _updateAesInData() {\n const calculated = this.calculatedData;\n if (!calculated) {\n return;\n }\n }\n\n _updateChart() {\n if (!this.calculatedData) {\n return;\n }\n const {id, chartSettings, facetSettings, valueColumnColor, valueColumnSize, normalization, aes, keysOrder, xColumn, yColumn, xGroupBy, yGroupBy} = 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 this.chartRenderer.render(\n this.data,\n id,\n chartSettings,\n facetSettings,\n this.calculatedData.groupedCellsData,\n valueColumnColor,\n valueColumnSize,\n normalization,\n aes,\n this._getTooltip,\n this.onTooltipHintSwitch,\n customOrder\n );\n }\n\n private _getTooltip = (cell: CellBubble): string[] => {\n return this.calculatedData\n ? getCellTooltip(this.data, cell, this.calculatedData.groupedCellsData.meta, this.settings?.chartSettings?.tooltips?.content)\n : ['No data available'];\n };\n}\n"],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ChartRenderer.d.ts","sourceRoot":"","sources":["../../src/heatmap/ChartRenderer.tsx"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,WAAW,EAAE,YAAY,EAAE,MAAM,UAAU,CAAC;AAG1D,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,OAAO,CAAC;AAC1C,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,kBAAkB,CAAC;AAG7C,OAAO,KAAK,EAAE,UAAU,EAAc,MAAM,iBAAiB,CAAC;AAG9D,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,cAAc,CAAC;AAC9C,OAAO,KAAK,EAAW,UAAU,EAAE,SAAS,EAAE,MAAM,UAAU,CAAC;AAM/D,OAAO,KAAK,EACR,qBAAqB,EACrB,aAAa,EACb,gBAAgB,EAChB,mBAAmB,EACnB,UAAU,EACV,YAAY,EAEZ,mBAAmB,EACnB,WAAW,EACX,OAAO,EACV,MAAM,oBAAoB,CAAC;AAE5B,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,YAAY,CAAC;AACtD,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,kBAAkB,CAAC;AACxD,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,uBAAuB,CAAC;AA8FjE,cAAM,aAAa;IACf,SAAS,EAAE,IAAI,GAAG,IAAI,CAAQ;IAC9B,UAAU,EAAE,WAAW,GAAG,IAAI,CAAQ;IACtC,QAAQ,EAAE,WAAW,GAAG,IAAI,CAAQ;IACpC,SAAS,EAAE,YAAY,CAAW;IAClC,gBAAgB,EAAE,MAAM,CAAC,MAAM,EAAE,mBAAmB,CAAC,CAAM;IAC3D,UAAU,EAAE,UAAU,CAOpB;IACF,OAAO,EAAE,OAAO,CAKd;IACF,aAAa,EAAE,aAAa,CAO1B;IACF,WAAW,EAAE,WAAW,CAKtB;IACF,YAAY,SAAK;IACjB,SAAS,SAAK;IACd,MAAM,EAAE,YAAY,CAIlB;IACF,IAAI,EAAE;QACF,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;QAC1B,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;KAC7B,CAAoB;IACrB,UAAU,EAAE,WAAW,CAAC,MAAM,EAAE,MAAM,CAAC,GAAG,YAAY,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,CAE/C;IAC/B,qBAAqB,EAAE,qBAAqB,CAAM;IAClD,mBAAmB,EAAE,mBAAmB,CAAM;IAC9C,MAAM,EAAE,UAAU,CAIhB;IACF,WAAW,EAAE,MAAM,CAAC,MAAM,EAAE,gBAAgB,CAAC,CAAM;IAEnD,KAAK;IAaL,IAAI,CAAC,IAAI,EAAE,WAAW;IAStB,aAAa,CAAC,KAAK,EAAE,mBAAmB,CAAC,eAAe,CAAC,CAAC,OAAO,CAAC,EAAE,IAAI,EAAE,mBAAmB,CAAC,eAAe,CAAC,CAAC,MAAM,CAAC;IAYtH,gBAAgB,CACZ,SAAS,EAAE,mBAAmB,CAAC,eAAe,CAAC,CAAC,WAAW,CAAC,EAC5D,MAAM,EAAE,mBAAmB,CAAC,eAAe,CAAC,CAAC,QAAQ,CAAC,EACtD,WAAW,EAAE,mBAAmB,CAAC,aAAa,CAAC,EAC/C,WAAW,EAAE,UAAU,EACvB,WAAW,EAAE,CAAC,MAAM,EAAE,MAAM,CAAC;IAwEjC,kBAAkB,CACd,YAAY,EAAE,mBAAmB,EACjC,KAAK,EAAE,mBAAmB,CAAC,eAAe,CAAC,CAAC,OAAO,CAAC,EACpD,KAAK,EAAE,mBAAmB,CAAC,eAAe,CAAC,CAAC,OAAO,CAAC,EACpD,aAAa,EAAE,mBAAmB,CAAC,eAAe,CAAC;IAiCvD,qBAAqB,CACjB,IAAI,EAAE,mBAAmB,CAAC,eAAe,CAAC,CAAC,MAAM,CAAC,EAClD,SAAS,EAAE,MAAM,EAAE,EACnB,UAAU,EAAE,MAAM,EAAE,EACpB,UAAU,EAAE,MAAM,EAAE,EACpB,aAAa,EAAE,mBAAmB,CAAC,eAAe,CAAC,EACnD,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,EAC/C,WAAW,EAAE,mBAAmB,CAAC,aAAa,CAAC,EAC/C,WAAW,EAAE,mBAAmB,CAAC,aAAa,CAAC;IAsFnD,iBAAiB,CACb,IAAI,EAAE,mBAAmB,CAAC,eAAe,CAAC,CAAC,MAAM,CAAC,EAClD,YAAY,EAAE,mBAAmB,EACjC,QAAQ,EAAE,MAAM;
|
|
1
|
+
{"version":3,"file":"ChartRenderer.d.ts","sourceRoot":"","sources":["../../src/heatmap/ChartRenderer.tsx"],"names":[],"mappings":"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"}
|
|
@@ -266,31 +266,33 @@ var M = class {
|
|
|
266
266
|
updateChartsSizes(e, t, n) {
|
|
267
267
|
let { width: r, height: i, cellWidth: a, cellHeight: o } = e, s = t.meta.facetKeys[0];
|
|
268
268
|
if (a && s) {
|
|
269
|
-
let e = t.facets[s].xKeys.length, r = t.meta.xGroupKeys.length;
|
|
269
|
+
let e = t.facets[s].xKeys.length, r = t.meta.xGroupKeys.filter((e) => (t.facets[s]?.xKeysByGroups[e]?.length ?? 0) > 0).length;
|
|
270
270
|
this.chartSizes.chartWidth = e * a + n * (r - 1);
|
|
271
271
|
} else this.chartSizes.chartWidth = r;
|
|
272
272
|
if (o && s) {
|
|
273
|
-
let e = t.facets[s].yKeys.length, r = t.meta.yGroupKeys.length;
|
|
273
|
+
let e = t.facets[s].yKeys.length, r = t.meta.yGroupKeys.filter((e) => (t.facets[s]?.yKeysByGroups[e]?.length ?? 0) > 0).length;
|
|
274
274
|
this.chartSizes.chartHeight = e * o + n * (r - 1);
|
|
275
275
|
} else this.chartSizes.chartHeight = i;
|
|
276
276
|
}
|
|
277
277
|
updateScales(e, t, n, r, i, a, o, s, c, l) {
|
|
278
278
|
let { width: u, height: d, cellWidth: f, cellHeight: p } = i, { meta: m, facets: h } = t, { sharedX: g, sharedY: _ } = r, v = (e, t = {}) => e.sort((e, n) => a.sorting === "asc" ? (t[e] ?? e).localeCompare(t[n] ?? n, "en", { numeric: !0 }) : (t[n] ?? n).localeCompare(t[e] ?? e, "en", { numeric: !0 })), b = (e, t = {}) => e.sort((e, n) => o.sorting === "asc" ? (t[e] ?? e).localeCompare(t[n] ?? n, "en", { numeric: !0 }) : (t[n] ?? n).localeCompare(t[e] ?? e, "en", { numeric: !0 }));
|
|
279
279
|
e.forEach((e) => {
|
|
280
|
-
let t = h[e], r = l.xGroup ? m.xGroupKeys : v(m.xGroupKeys), i = l.yGroup ? m.yGroupKeys : b(m.yGroupKeys), { xKeysByGroups: a } = g ? m : t, { yKeysByGroups: o } = _ ? m : t, x = r.map((e) => a[e].length), S = i.map((e) => o[e].length), C = x.reduce((e, t) => e + t, 0), w = S.reduce((e, t) => e + t, 0), T = f || (u - (x.filter((e) => e > 0).length - 1) * n) / C, E = p || (d - (S.filter((e) => e > 0).length - 1) * n) / w, D = [], O = [], k = 0;
|
|
281
|
-
|
|
282
|
-
|
|
283
|
-
O = O.concat(t), t.forEach(() => {
|
|
280
|
+
let t = h[e], r = l.xGroup ? m.xGroupKeys : v(m.xGroupKeys), i = l.yGroup ? m.yGroupKeys : b(m.yGroupKeys), { xKeysByGroups: a } = g ? m : t, { yKeysByGroups: o } = _ ? m : t, x = r.map((e) => a[e].length), S = i.map((e) => o[e].length), C = x.reduce((e, t) => e + t, 0), w = S.reduce((e, t) => e + t, 0), T = f || (u - (x.filter((e) => e > 0).length - 1) * n) / C, E = p || (d - (S.filter((e) => e > 0).length - 1) * n) / w, D = [], O = [], k = 0, A = r.map((e) => s || l.x ? a[e] : v(a[e], m.xLabels));
|
|
281
|
+
A.forEach((e, t) => {
|
|
282
|
+
O = O.concat(e), e.forEach(() => {
|
|
284
283
|
D.push(k), k += T;
|
|
285
|
-
})
|
|
284
|
+
});
|
|
285
|
+
let r = A.slice(t + 1).some((e) => e.length > 0);
|
|
286
|
+
e.length > 0 && r && (k += n);
|
|
286
287
|
});
|
|
287
|
-
let
|
|
288
|
-
|
|
289
|
-
|
|
290
|
-
|
|
291
|
-
|
|
292
|
-
|
|
293
|
-
|
|
288
|
+
let j = [], M = [], N = 0, P = i.map((e) => c || l.y ? o[e] : b(o[e], m.yLabels));
|
|
289
|
+
P.forEach((e, t) => {
|
|
290
|
+
M = M.concat(e), e.forEach(() => {
|
|
291
|
+
j.push(N), N += E;
|
|
292
|
+
});
|
|
293
|
+
let r = P.slice(t + 1).some((e) => e.length > 0);
|
|
294
|
+
e.length > 0 && r && (N += n);
|
|
295
|
+
}), this.scales.x[e] = y().domain(O).range(D), this.scales.y[e] = y().domain(M).range(j), this.step.x[e] = T, this.step.y[e] = E;
|
|
294
296
|
});
|
|
295
297
|
}
|
|
296
298
|
updateAesScale(e, t, n, r, i, a, o) {
|
|
@@ -333,19 +335,23 @@ var M = class {
|
|
|
333
335
|
};
|
|
334
336
|
let { xKeysByGroups: s, yKeysByGroups: c } = r[e];
|
|
335
337
|
if (a) {
|
|
336
|
-
let { hierarchyByGroupX: n } = i[e], r = t.reduce((e, t) => Math.max(e, n[t]?.data.height), 0);
|
|
338
|
+
let { hierarchyByGroupX: n } = i[e], r = t.reduce((e, t) => Math.max(e, n[t]?.data.height ?? 0), 0);
|
|
337
339
|
this.dendrograms[e].x.treesByGroupKey = t.reduce((t, i) => {
|
|
338
|
-
let o = n[i]
|
|
339
|
-
|
|
340
|
+
let o = n[i];
|
|
341
|
+
if (!o) return t;
|
|
342
|
+
let c = s[i];
|
|
343
|
+
_().separation(() => 1).size([o.leaves().length * this.step.x[e], a.size])(o);
|
|
340
344
|
let l = o;
|
|
341
345
|
return E(l, v().domain(a.position === "top" ? [0, r] : [r, 0]).range([a.size, 0]), "y"), D(l, this.scales.x[e](c[0]), "x"), t[i] = l, t;
|
|
342
346
|
}, {}), this.dendrograms[e].x.data = a;
|
|
343
347
|
}
|
|
344
348
|
if (o) {
|
|
345
|
-
let { hierarchyByGroupY: t } = i[e], r = n.reduce((e, n) => Math.max(e, t[n]?.data.height), 0);
|
|
349
|
+
let { hierarchyByGroupY: t } = i[e], r = n.reduce((e, n) => Math.max(e, t[n]?.data.height ?? 0), 0);
|
|
346
350
|
this.dendrograms[e].y.treesByGroupKey = n.reduce((n, i) => {
|
|
347
|
-
let a = t[i]
|
|
348
|
-
|
|
351
|
+
let a = t[i];
|
|
352
|
+
if (!a) return n;
|
|
353
|
+
let s = c[i];
|
|
354
|
+
_().separation(() => 1).size([a.leaves().length * this.step.y[e], o.size])(a);
|
|
349
355
|
let l = a, u = v().domain(o.position === "left" ? [0, r] : [r, 0]).range([o.size, 0]);
|
|
350
356
|
return D(l, this.scales.y[e](s[0]), "x", "y"), E(l, u, "x"), n[i] = l, n;
|
|
351
357
|
}, {}), this.dendrograms[e].y.data = o;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ChartRenderer.js","names":[],"sources":["../../src/heatmap/ChartRenderer.tsx"],"sourcesContent":["import { extent } from 'd3-array';\nimport type { HierarchyNode, HierarchyPointNode } from 'd3-hierarchy';\nimport { cluster } from 'd3-hierarchy';\nimport type { ScaleLinear, ScaleOrdinal } from 'd3-scale';\nimport { scaleLinear, scaleOrdinal } from 'd3-scale';\nimport lodash from 'lodash';\nimport type { ReactElement } from 'react';\nimport type { Root } from 'react-dom/client';\nimport { createRoot } from 'react-dom/client';\nimport { Error } from '../common/Error';\nimport type { LegendData, LegendItem } from '../common/types';\nimport { DataFrameProvider } from '../common/useDataFrame';\nimport { DEFAULT_HEIGHT, DEFAULT_WIDTH, MAX_LEGEND_GRADIENT_HEIGHT, MIN_LEGEND_GRADIENT_HEIGHT, TITLE_LINE_HEIGHT, TITLE_MARGIN } from '../constants';\nimport type { DataFrame } from '../DataFrame';\nimport type { AesItem, ColumnName, DataValue } from '../types';\nimport { arrangeLegendParts } from '../utils/arrangeLegendParts';\nimport { getChartEdgeSides } from '../utils/getChartEdgeSides';\nimport { getContinuousLegendTicks } from '../utils/getContinuousLegendTicks';\nimport { TextMeasurer } from '../utils/TextMeasurer/TextMeasurer';\nimport { ChartsGroup } from './components/ChartsGroup';\nimport type {\n AnnotationColorScales,\n CaptionsSizes,\n ChartDendrograms,\n ChartDimensionsData,\n ChartSizes,\n ChartsScales,\n Cluster,\n DendrogramAesScales,\n LabelAngles,\n Margins,\n} from './components/types';\nimport { CHART_SIDE_ELEMENTS, DEFAULT_AES, LEGEND_OFFSET, MIN_MARGIN, TITLE_LINE } from './constants';\nimport type { GroupedCellsHeatmap } from './getCells';\nimport type { DendrogramsData } from './getDendrograms';\nimport type { HeatmapSettingsImpl } from './HeatmapSettingsImpl';\nimport {\n calculateAnnotationTitleSizes,\n calculateChartSideElementSizes,\n calculateSideElementsBBoxes,\n createContinuousColorScale,\n createDiscreteColorScale,\n createDiscreteRoundColorScale,\n} from './utils';\nimport { calculateCaptionTails } from './utils/calculateCaptionTails';\n\nconst COS_PI_4 = Math.cos(Math.PI / 4);\nconst INCLINE_OFFSET = 5; // height of little triangle of text for captions inclined 45deg\nfunction updateLinksHeight(root: HierarchyPointNode<Cluster>, scale: (v: number) => number, coord: 'x' | 'y') {\n function setHeight(d: HierarchyPointNode<Cluster>) {\n d[coord] = scale(d.data.height);\n if (d.children) d.children.forEach(setHeight);\n }\n setHeight(root);\n}\n\n// add shift to move nodes positions with group gaps\nfunction addShiftToLinkCoord(\n root: HierarchyPointNode<Cluster>,\n shift: number,\n coordFrom: 'x' | 'y',\n coordTo = coordFrom\n) {\n function setX(d: HierarchyPointNode<Cluster>) {\n d[coordTo] = d[coordFrom] + shift;\n if (d.children) d.children.forEach(setX);\n }\n setX(root);\n}\n\nconst getSteps = (count: number, valueExtent: number[]) => {\n const min = Math.min(...valueExtent);\n const max = Math.max(...valueExtent);\n if (min === max) {\n const steps = count % 2 === 0 ? [] : [min];\n for (let i = 1; i < count / 2 + 1; i++) {\n steps.push(min + i);\n steps.unshift(min - i);\n }\n return steps;\n }\n if (count < 2) {\n return [min, max];\n }\n const step = (max - min) / (count - 1);\n const steps = [];\n for (let i = 0; i < count - 1; i++) {\n steps.push(min + step * i);\n }\n steps.push(max);\n return steps;\n};\n\nfunction getContinuousColorRange(normalization: HeatmapSettingsImpl['normalization'], colorsCount: number, valueExtent: number[]) {\n let extent = valueExtent;\n if (normalization) {\n if (normalization.colorRange) {\n extent = normalization.colorRange;\n }\n if (normalization.method === 'standardScaling') {\n extent = [-2, 2];\n }\n if (normalization.method === 'meanNormalization') {\n extent = [-0.75, 0.75];\n }\n }\n return getSteps(colorsCount, extent);\n}\n\nfunction getMaxTextLength(keys: string[], labels: Record<string, string>, textMeasurer: TextMeasurer) {\n let maxLabelSize = 0;\n for (const key of keys) {\n if (labels[key] === undefined) continue;\n const l = textMeasurer.getTextWidth(labels[key]);\n if (l > maxLabelSize) maxLabelSize = l;\n }\n return maxLabelSize;\n}\n\nfunction getCaptionHeight(size: number, angle: number) {\n if (angle === 90) {\n return size;\n }\n if (angle === 45) {\n return size * COS_PI_4 + (size > 0 ? 2 * INCLINE_OFFSET : 0);\n }\n return TITLE_LINE;\n}\n\nclass ChartRenderer {\n reactRoot: Root | null = null;\n parentNode: HTMLElement | null = null;\n rootNode: HTMLElement | null = null;\n component: ReactElement = (<></>);\n chartsDimensions: Record<string, ChartDimensionsData> = {};\n chartSizes: ChartSizes = {\n chartWidth: DEFAULT_WIDTH, // width of single chart\n chartHeight: DEFAULT_HEIGHT, // height of single chart\n chartsWidth: DEFAULT_WIDTH, // width of all charts in charts row\n chartsHeight: DEFAULT_HEIGHT, // width of all charts in charts column, without axes\n totalWidth: DEFAULT_WIDTH, // width of all charts in charts row, plus left axis, plus legend\n totalHeight: DEFAULT_HEIGHT, // width of all charts in charts height, plus bottom axis, plus top title\n };\n margins: Margins = {\n top: MIN_MARGIN,\n bottom: MIN_MARGIN,\n left: MIN_MARGIN,\n right: MIN_MARGIN,\n };\n captionsSizes: CaptionsSizes = {\n xAxisCaptions: 100,\n yAxisCaptions: 100,\n xGroupCaptions: TITLE_LINE,\n yGroupCaptions: TITLE_LINE,\n xCaptionTail: 0,\n yCaptionTail: 0,\n };\n labelAngles: LabelAngles = {\n xAxisLabels: 0,\n yAxisLabels: 0,\n xGroupLabels: 0,\n yGroupLabels: 0,\n };\n columnsCount = 1;\n rowsCount = 1;\n scales: ChartsScales = {\n // scales grouped by facet\n x: { null: scaleOrdinal<string, number>().domain(['null']).range([1]) },\n y: { null: scaleOrdinal<string, number>().domain(['null']).range([1]) },\n };\n step: {\n x: Record<string, number>;\n y: Record<string, number>;\n } = { x: {}, y: {} };\n colorScale: ScaleLinear<string, string> | ScaleOrdinal<string, string, string> = scaleLinear<string, string>()\n .domain([0, 1])\n .range(['white', 'black']);\n annotationColorScales: AnnotationColorScales = {};\n dendrogramAesScales: DendrogramAesScales = {};\n legend: LegendData = {\n width: 0,\n height: 0,\n items: [],\n };\n dendrograms: Record<string, ChartDendrograms> = {};\n\n clear() {\n if (this.parentNode && this.rootNode) {\n this.parentNode?.removeChild(this.rootNode);\n this.parentNode = null;\n this.rootNode = null;\n }\n // timeout to avoid trying to unmount during rendering\n setTimeout(() => {\n this.reactRoot?.unmount();\n this.reactRoot = null;\n });\n }\n\n init(node: HTMLElement) {\n if (this.parentNode === null) {\n this.parentNode = node;\n this.rootNode = document.createElement('div');\n this.parentNode.appendChild(this.rootNode);\n this.reactRoot = createRoot(this.rootNode);\n }\n }\n\n updateMargins(title: HeatmapSettingsImpl['chartSettings']['title'], size: HeatmapSettingsImpl['chartSettings']['size']) {\n this.margins = {\n top: title.show ? TITLE_LINE_HEIGHT + TITLE_MARGIN * 2 : size.outerOffset,\n bottom: size.outerOffset,\n left: size.outerOffset,\n right: this.legend.width + size.outerOffset,\n };\n this.chartSizes.totalWidth = this.margins.left + this.chartSizes.chartsWidth + this.margins.right;\n this.chartSizes.totalHeight =\n this.margins.top + Math.max(this.chartSizes.chartsHeight + this.margins.bottom, this.legend.height);\n }\n\n updateLegendSize(\n valueType: HeatmapSettingsImpl['chartSettings']['valueType'],\n legend: HeatmapSettingsImpl['chartSettings']['legend'],\n annotations: HeatmapSettingsImpl['annotations'],\n columnValue: ColumnName,\n valueExtent: [number, number]\n ) {\n if (!legend.show) {\n this.legend = { width: 0, height: 0, items: [] };\n return;\n }\n const continuousHeight = Math.min(\n Math.max(this.chartSizes.chartHeight, MIN_LEGEND_GRADIENT_HEIGHT),\n MAX_LEGEND_GRADIENT_HEIGHT\n );\n const legendHeight = Math.max(this.chartSizes.chartHeight, continuousHeight);\n const legendItems: LegendItem[] = [];\n const emptySizes = { width: 0, height: 0, left: 0, top: 0 };\n\n const getDefaultLabels = (values: (string | number)[]) => values.reduce((res: Record<string, string>, v: string | number) => { res[v] = String(v); return res; }, {});\n if (valueType === 'continuous') {\n const scale = this.colorScale as ScaleLinear<string, string>;\n const values = getContinuousLegendTicks(scale, valueExtent);\n const tickPositionScale = scaleLinear([values[0], values[values.length - 1]], [continuousHeight, 0]); //TODO: update during adding log scale for heatmap\n const title = columnValue.label ?? columnValue.value;\n legendItems.push({\n ...emptySizes,\n type: 'continuous',\n id: 'heatmapValue',\n scale,\n values,\n title,\n tickPositionScale\n });\n } else if (valueType === 'discrete') {\n const scale = this.colorScale as ScaleOrdinal<string, string>;\n const title = columnValue.label ?? columnValue.value;\n const values = scale.domain();\n const labels = getDefaultLabels(values);\n\n legendItems.push({ ...emptySizes, type: 'discreteColor', id: 'heatmapValue', title, scale, values, labels });\n }\n annotations.forEach(item => {\n const title = item.valueColumn.label ?? item.valueColumn.value;\n if (item.type === 'continuous') {\n const scale = this.annotationColorScales[item.id].scale as ScaleLinear<string, string>;\n const values = getContinuousLegendTicks(scale, valueExtent);\n const tickPositionScale = scaleLinear([values[0], values[values.length - 1]], [continuousHeight, 0]); //TODO: update during adding log scale for heatmap\n\n legendItems.push({ ...emptySizes, type: 'continuous', id: item.id, tickPositionScale, title, scale, values });\n }\n if (item.type === 'discrete') {\n const scale = this.annotationColorScales[item.id].scale as ScaleOrdinal<string, string>;\n const values = scale.domain();\n const labels = getDefaultLabels(values);\n\n legendItems.push({ ...emptySizes, type: 'discreteColor', id: item.id, title, scale, values, labels });\n }\n });\n\n if (!legendItems.length) {\n this.legend = { width: 0, height: 0, items: [] };\n return;\n }\n\n const items = arrangeLegendParts(legendItems, this.chartSizes.chartHeight,continuousHeight);\n const maxRightEdge = items.reduce((max, item) => Math.max(max, item.left + item.width), 0);\n\n const legendWidth = maxRightEdge + LEGEND_OFFSET;\n\n this.legend = {\n width: legendWidth,\n height: legendHeight,\n items\n };\n }\n\n updateCaptionsSize(\n groupedCells: GroupedCellsHeatmap,\n xAxis: HeatmapSettingsImpl['chartSettings']['xAxis'],\n yAxis: HeatmapSettingsImpl['chartSettings']['yAxis'],\n facetSettings: HeatmapSettingsImpl['facetSettings']\n ) {\n const textMeasurer = new TextMeasurer('bold 16px Manrope');\n const { xGroupKeys, yGroupKeys, xGroupLabels, yGroupLabels, xKeysByGroups, yKeysByGroups, xLabels, yLabels } = groupedCells.meta;\n this.labelAngles = {\n xAxisLabels: xAxis.axisLabelsAngle,\n yAxisLabels: yAxis.axisLabelsAngle,\n xGroupLabels: xAxis.groupLabelsAngle,\n yGroupLabels: yAxis.groupLabelsAngle,\n };\n\n const maxXLabelSize = xGroupKeys.reduce((res, key) => Math.max(res, getMaxTextLength(xKeysByGroups[key], xLabels, textMeasurer)), 0);\n const maxYLabelSize = yGroupKeys.reduce((res, key) => Math.max(res, getMaxTextLength(yKeysByGroups[key], yLabels, textMeasurer)), 0);\n const maxXGroupLabelSize = getMaxTextLength(xGroupKeys, xGroupLabels, textMeasurer);\n const maxYGroupLabelSize = getMaxTextLength(yGroupKeys, yGroupLabels, textMeasurer);\n const { xCaptionTail, yCaptionTail } = calculateCaptionTails(\n this.labelAngles,\n facetSettings,\n this.scales,\n this.step,\n groupedCells,\n textMeasurer\n );\n this.captionsSizes = {\n xCaptionTail,\n yCaptionTail,\n xGroupCaptions: getCaptionHeight(maxXGroupLabelSize, this.labelAngles.xGroupLabels),\n yGroupCaptions: getCaptionHeight(maxYGroupLabelSize, this.labelAngles.yGroupLabels),\n xAxisCaptions: getCaptionHeight(maxXLabelSize, this.labelAngles.xAxisLabels),\n yAxisCaptions: getCaptionHeight(maxYLabelSize, this.labelAngles.yAxisLabels),\n };\n }\n\n updateChartDimensions(\n size: HeatmapSettingsImpl['chartSettings']['size'],\n facetKeys: string[],\n xGroupKeys: string[],\n yGroupKeys: string[],\n facetSettings: HeatmapSettingsImpl['facetSettings'],\n xAxis: HeatmapSettingsImpl['chartSettings']['xAxis'],\n yAxis: HeatmapSettingsImpl['chartSettings']['yAxis'],\n annotations: HeatmapSettingsImpl['annotations'],\n dendrogramX: HeatmapSettingsImpl['dendrogramX'],\n dendrogramY: HeatmapSettingsImpl['dendrogramY']\n ) {\n const facetCount = facetKeys.length;\n const maxNRows = Math.min(facetSettings.nRows ?? facetCount, facetCount);\n const maxNCols = Math.min(facetSettings.nCols ?? facetCount, facetCount);\n // Use columns/rows count from settings if some of them defined, else make 1 column\n this.columnsCount = facetSettings.nRows ? Math.ceil(facetCount / maxNRows) : maxNCols;\n this.rowsCount = Math.ceil(facetCount / this.columnsCount);\n const { sharedX, sharedY } = facetSettings;\n\n this.chartsDimensions = {};\n\n let currentLeft = 0;\n let currentTop = 0;\n facetKeys.forEach((key, index) => {\n const currentColumn = (index % this.columnsCount) + 1;\n const chartSides = getChartEdgeSides(index, facetKeys.length, this.columnsCount, this.rowsCount);\n const stepX = this.step.x[key];\n const stepY = this.step.y[key];\n const sideElementSizes = calculateChartSideElementSizes(\n xAxis,\n yAxis,\n this.captionsSizes,\n annotations,\n dendrogramX,\n dendrogramY,\n chartSides,\n sharedX,\n sharedY,\n facetKeys,\n xGroupKeys,\n yGroupKeys,\n stepX,\n stepY\n );\n const annotationsTitleSizes = calculateAnnotationTitleSizes(annotations, chartSides, sharedX, sharedY);\n function getPadding(side: 'left' | 'right' | 'top' | 'bottom') {\n return Math.max(\n CHART_SIDE_ELEMENTS[side].reduce((res, el) => res + sideElementSizes[side][el], 0),\n annotationsTitleSizes[side],\n size.innerOffset\n );\n }\n const padding = {\n left: getPadding('left'),\n right: getPadding('right'),\n top: getPadding('top'),\n bottom: getPadding('bottom'),\n };\n if (padding.left < this.captionsSizes.xCaptionTail) {\n padding.left = this.captionsSizes.xCaptionTail;\n }\n if (padding.bottom < this.captionsSizes.yCaptionTail) {\n padding.bottom = this.captionsSizes.yCaptionTail;\n }\n const sideElementBBoxes = calculateSideElementsBBoxes(sideElementSizes, this.chartSizes.chartWidth, this.chartSizes.chartHeight);\n const outerWidth = this.chartSizes.chartWidth + padding.left + padding.right;\n const outerHeight = this.chartSizes.chartHeight + padding.top + padding.bottom;\n this.chartsDimensions[key] = {\n left: currentLeft,\n top: currentTop,\n inner: { width: this.chartSizes.chartWidth, height: this.chartSizes.chartHeight },\n outer: { width: outerWidth, height: outerHeight },\n padding,\n sideElementBBoxes,\n chartEdgeSides: chartSides,\n };\n currentLeft += outerWidth;\n if (currentColumn === this.columnsCount) {\n currentLeft = 0;\n currentTop += outerHeight;\n }\n });\n\n // sum of widths of first row\n const chartsWidth = facetKeys\n .slice(0, this.columnsCount)\n .reduce((sum, key) => sum + this.chartsDimensions[key].outer.width, 0);\n // sum of heights of first column\n const chartsHeight = facetKeys\n .filter((_key, index) => index % this.columnsCount === 0)\n .reduce((sum, key) => sum + this.chartsDimensions[key].outer.height, 0);\n this.chartSizes.chartsWidth = chartsWidth;\n this.chartSizes.chartsHeight = chartsHeight;\n }\n\n updateChartsSizes(\n size: HeatmapSettingsImpl['chartSettings']['size'],\n groupedCells: GroupedCellsHeatmap,\n groupGap: number,\n ) {\n const { width, height, cellWidth, cellHeight } = size;\n const firstFacet = groupedCells.meta.facetKeys[0];\n if (cellWidth && firstFacet) {\n const keysCount = groupedCells.facets[firstFacet].xKeys.length;\n const groupsCount = groupedCells.meta.xGroupKeys.length;\n this.chartSizes.chartWidth = keysCount * cellWidth + groupGap * (groupsCount - 1);\n } else {\n this.chartSizes.chartWidth = width;\n }\n\n if (cellHeight && firstFacet) {\n const keysCount = groupedCells.facets[firstFacet].yKeys.length;\n const groupsCount = groupedCells.meta.yGroupKeys.length;\n this.chartSizes.chartHeight = keysCount * cellHeight + groupGap * (groupsCount - 1);\n } else {\n this.chartSizes.chartHeight = height;\n }\n }\n\n // update scales for cell positions, x and y for each facet\n updateScales(\n facetKeys: string[],\n groupedCells: GroupedCellsHeatmap,\n groupGap: number,\n facetSettings: HeatmapSettingsImpl['facetSettings'],\n size: HeatmapSettingsImpl['chartSettings']['size'],\n xAxis: HeatmapSettingsImpl['chartSettings']['xAxis'],\n yAxis: HeatmapSettingsImpl['chartSettings']['yAxis'],\n dendrogramX: HeatmapSettingsImpl['dendrogramX'],\n dendrogramY: HeatmapSettingsImpl['dendrogramY'],\n customOrder: {x: boolean, y: boolean, xGroup: boolean, yGroup: boolean},\n ) {\n const { width, height, cellWidth, cellHeight } = size;\n const { meta, facets } = groupedCells;\n const { sharedX, sharedY } = facetSettings;\n const sortX = (arr: string[], labels: Record<string, string> = {}) => {\n return arr.sort((a, b) => xAxis.sorting === '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 };\n const sortY = (arr: string[], labels: Record<string, string> = {}) => {\n return arr.sort((a, b) => yAxis.sorting === '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 };\n facetKeys.forEach(facetKey => {\n const facetGroup = facets[facetKey];\n const xGroupKeys = customOrder.xGroup ? meta.xGroupKeys : sortX(meta.xGroupKeys);\n const yGroupKeys = customOrder.yGroup ? meta.yGroupKeys : sortY(meta.yGroupKeys);\n const { xKeysByGroups } = sharedX ? meta : facetGroup;\n const { yKeysByGroups } = sharedY ? meta : facetGroup;\n // for shared facets max cells counts in group should be used\n const xCounts = xGroupKeys.map(xGroupKey => xKeysByGroups[xGroupKey].length);\n const yCounts = yGroupKeys.map(yGroupKey => yKeysByGroups[yGroupKey].length);\n const xCellsCount = xCounts.reduce((sum, count) => sum + count, 0);\n const yCellsCount = yCounts.reduce((sum, count) => sum + count, 0);\n const xStep = cellWidth ? cellWidth : (width - (xCounts.filter(count => count > 0).length - 1) * groupGap) / xCellsCount;\n const yStep = cellHeight ? cellHeight : (height - (yCounts.filter(count => count > 0).length - 1) * groupGap) / yCellsCount;\n\n const xPositions: number[] = [];\n let xKeys: string[] = [];\n let currentX = 0;\n xGroupKeys.forEach(xKey => {\n const axisKeys = dendrogramX || customOrder.x ? xKeysByGroups[xKey] : sortX(xKeysByGroups[xKey], meta.xLabels);\n xKeys = xKeys.concat(axisKeys);\n axisKeys.forEach(() => {\n xPositions.push(currentX);\n currentX += xStep;\n });\n // do not add offset for empty group\n if (axisKeys.length > 0) {\n currentX += groupGap;\n }\n });\n\n const yPositions: number[] = [];\n let yKeys: string[] = [];\n let currentY = 0;\n yGroupKeys.forEach(yKey => {\n const axisKeys = dendrogramY || customOrder.y ? yKeysByGroups[yKey] : sortY(yKeysByGroups[yKey], meta.yLabels);\n yKeys = yKeys.concat(axisKeys);\n axisKeys.forEach(() => {\n yPositions.push(currentY);\n currentY += yStep;\n });\n // do not add offset for empty group\n if (axisKeys.length > 0) {\n currentY += groupGap;\n }\n });\n\n this.scales.x[facetKey] = scaleOrdinal<string, number>().domain(xKeys).range(xPositions);\n this.scales.y[facetKey] = scaleOrdinal<string, number>().domain(yKeys).range(yPositions);\n this.step.x[facetKey] = xStep;\n this.step.y[facetKey] = yStep;\n });\n }\n\n updateAesScale(\n valueType: 'discrete' | 'continuous',\n valueExtent: [number, number],\n aes: HeatmapSettingsImpl['aes'],\n annotations: HeatmapSettingsImpl['annotations'],\n groupedCellsData: GroupedCellsHeatmap,\n cellUniqValues: DataValue[],\n normalization: HeatmapSettingsImpl['normalization']\n ) {\n if (valueType === 'continuous') {\n if (aes.valueColors) {\n this.colorScale = scaleLinear<string, string>()\n .domain(aes.valuesByColors ?? getContinuousColorRange(normalization, aes.valueColors.length, valueExtent))\n .range(aes.valueColors);\n } else if (aes.colorsList) {\n this.colorScale = scaleLinear<string, string>()\n .domain(getContinuousColorRange(normalization, aes.colorsList.length, valueExtent))\n .range(aes.colorsList);\n }\n } else {\n if (aes.colorsMap) {\n const valueKeys = Object.entries(aes.colorsMap);\n this.colorScale = scaleOrdinal<string, string>()\n .domain(valueKeys.map(v => v[0]))\n .range(valueKeys.map(v => v[1]))\n .unknown('#ccc');\n } else if (aes.colorsList) {\n this.colorScale = createDiscreteColorScale(aes.colorsList, cellUniqValues.map(String));\n }\n }\n\n const { xDataByKeys, yDataByKeys } = groupedCellsData.meta;\n annotations.forEach(item => {\n const { colors, type, axis, valueColumn } = item;\n const data = (axis === 'x' ? xDataByKeys : yDataByKeys)[valueColumn.valueLabels ?? valueColumn.value];\n if (type === 'discrete') {\n const discreteValues = lodash.uniq(Object.values(data).map(String)).sort();\n this.annotationColorScales[item.id] = {\n type: 'discrete',\n scale: createDiscreteRoundColorScale(colors, discreteValues),\n };\n } else {\n const values = Object.values(data).map(Number);\n if (!values.length) {\n return;\n }\n const [min = values[0], max = values[0]] = extent(values);\n this.annotationColorScales[item.id] = {\n type: 'continuous',\n scale: createContinuousColorScale(colors, min, max, 0, 0.5, 1),\n };\n }\n });\n }\n\n updateDendrogram(\n facetKeys: string[],\n xGroupKeys: string[],\n yGroupKeys: string[],\n groups: GroupedCellsHeatmap['facets'],\n dendrogramsData: DendrogramsData,\n dendrogramX: HeatmapSettingsImpl['dendrogramX'],\n dendrogramY: HeatmapSettingsImpl['dendrogramY']\n ) {\n facetKeys.forEach(facetKey => {\n this.dendrograms[facetKey] = { x: { treesByGroupKey: {}, data: dendrogramX }, y: { treesByGroupKey: {}, data: dendrogramY } };\n const { xKeysByGroups, yKeysByGroups } = groups[facetKey];\n if (dendrogramX) {\n const { hierarchyByGroupX } = dendrogramsData[facetKey];\n const maxHeightX = xGroupKeys.reduce((res, xKey) => Math.max(res, hierarchyByGroupX[xKey]?.data.height), 0);\n this.dendrograms[facetKey].x.treesByGroupKey = xGroupKeys.reduce((res, groupKey) => {\n const hierarchy = hierarchyByGroupX[groupKey];\n const xKeys = xKeysByGroups[groupKey];\n cluster()\n .separation(() => 1)\n .size([xKeys.length * this.step.x[facetKey], dendrogramX.size])(\n hierarchy as HierarchyNode<unknown>\n );\n const root = hierarchy as HierarchyPointNode<Cluster>;\n const heightScale = scaleLinear()\n .domain(dendrogramX.position === 'top' ? [0, maxHeightX] : [maxHeightX, 0])\n .range([dendrogramX.size, 0]);\n updateLinksHeight(root, heightScale, 'y');\n addShiftToLinkCoord(root, this.scales.x[facetKey](xKeys[0]), 'x');\n res[groupKey] = root;\n return res;\n }, {} as Record<string, HierarchyPointNode<Cluster>>);\n this.dendrograms[facetKey].x.data = dendrogramX;\n }\n if (dendrogramY) {\n const { hierarchyByGroupY } = dendrogramsData[facetKey];\n const maxHeightY = yGroupKeys.reduce((res, yKey) => Math.max(res, hierarchyByGroupY[yKey]?.data.height), 0);\n this.dendrograms[facetKey].y.treesByGroupKey = yGroupKeys.reduce((res, groupKey) => {\n const hierarchy = hierarchyByGroupY[groupKey];\n const yKeys = yKeysByGroups[groupKey];\n cluster()\n .separation(() => 1)\n .size([yKeys.length * this.step.y[facetKey], dendrogramY.size])(\n hierarchy as HierarchyNode<unknown>\n );\n const root = hierarchy as HierarchyPointNode<Cluster>;\n const heightScale = scaleLinear()\n .domain(dendrogramY.position === 'left' ? [0, maxHeightY] : [maxHeightY, 0])\n .range([dendrogramY.size, 0]);\n addShiftToLinkCoord(root, this.scales.y[facetKey](yKeys[0]), 'x', 'y');\n updateLinksHeight(root, heightScale, 'x');\n res[groupKey] = root;\n return res;\n }, {} as Record<string, HierarchyPointNode<Cluster>>);\n this.dendrograms[facetKey].y.data = dendrogramY;\n }\n });\n }\n\n updateDendrogramAesScales(inheritedAes: HeatmapSettingsImpl['inheritedDendrogramAes']) {\n if (!inheritedAes) {\n return;\n }\n const usedColumns = Object.keys(inheritedAes);\n this.dendrogramAesScales = usedColumns.reduce((res: DendrogramAesScales, columnName) => {\n const aesMap = inheritedAes[columnName];\n const columnValues: string[] = Object.keys(aesMap);\n res[columnName] = scaleOrdinal<string, AesItem, AesItem>()\n .domain(columnValues)\n .range(\n columnValues.map(value => ({\n ...DEFAULT_AES,\n ...aesMap[value],\n }))\n )\n .unknown(DEFAULT_AES);\n return res;\n }, {});\n }\n\n render(\n dataFrame: DataFrame,\n settingsId: string,\n chartSettings: HeatmapSettingsImpl['chartSettings'],\n facetSettings: HeatmapSettingsImpl['facetSettings'],\n aes: HeatmapSettingsImpl['aes'],\n groupedCellsData: GroupedCellsHeatmap,\n annotations: HeatmapSettingsImpl['annotations'],\n valueColumn: ColumnName,\n dendrogramX: HeatmapSettingsImpl['dendrogramX'],\n dendrogramY: HeatmapSettingsImpl['dendrogramY'],\n dendrogramsData: DendrogramsData,\n inheritedDendrogramAes: HeatmapSettingsImpl['inheritedDendrogramAes'],\n cellUniqValues: DataValue[],\n normalization: HeatmapSettingsImpl['normalization'],\n onTooltipHintSwitch: (v: boolean) => void,\n customOrder: {x: boolean, y: boolean, xGroup: boolean, yGroup: boolean},\n cellsRenderingMode: 'canvas' | 'svg'\n ) {\n const { meta, facets } = groupedCellsData;\n const { facetKeys, xGroupKeys, yGroupKeys, valueExtent } = meta;\n const { xAxis, yAxis, title, size, valueType } = chartSettings;\n this.updateChartsSizes(size, groupedCellsData, aes.groupGap);\n this.updateAesScale(valueType, valueExtent.dataSource, aes, annotations, groupedCellsData, cellUniqValues, normalization);\n this.updateScales(facetKeys, groupedCellsData, aes.groupGap, facetSettings, size, chartSettings.xAxis, chartSettings.yAxis, dendrogramX, dendrogramY, customOrder);\n // caption sizes are needed for chart paddings in chart dimensions\n this.updateCaptionsSize(groupedCellsData, xAxis, yAxis, facetSettings);\n this.updateChartDimensions(\n size,\n facetKeys,\n xGroupKeys,\n yGroupKeys,\n facetSettings,\n xAxis,\n yAxis,\n annotations,\n dendrogramX,\n dendrogramY\n );\n this.updateLegendSize(valueType, chartSettings.legend, annotations, valueColumn, valueExtent.dataSource);\n this.updateMargins(title, size);\n this.updateDendrogram(facetKeys, xGroupKeys, yGroupKeys, facets, dendrogramsData, dendrogramX, dendrogramY);\n this.updateDendrogramAesScales(inheritedDendrogramAes);\n const component = (\n <DataFrameProvider dataFrame={dataFrame}>\n <ChartsGroup\n aes={aes}\n annotations={annotations}\n annotationColorScales={this.annotationColorScales}\n captionsSizes={this.captionsSizes}\n cellsMeta={meta}\n columnsCount={this.columnsCount}\n chartsDimensions={this.chartsDimensions}\n chartSettings={chartSettings}\n chartSizes={this.chartSizes}\n colorScale={this.colorScale as (v: unknown) => string}\n dendrogramAesScales={this.dendrogramAesScales}\n dendrograms={this.dendrograms}\n facetKeys={facetKeys}\n facetSettings={facetSettings}\n groupedCells={facets}\n labelAngles={this.labelAngles}\n legend={this.legend}\n margins={this.margins}\n scales={this.scales}\n settingsId={settingsId}\n step={this.step}\n xGroupKeys={xGroupKeys}\n yGroupKeys={yGroupKeys}\n onTooltipHintSwitch={onTooltipHintSwitch}\n cellsRenderingMode={cellsRenderingMode}\n />\n </DataFrameProvider>\n );\n this.component = component;\n this.reactRoot?.render(component);\n }\n\n renderError(message: string) {\n this.reactRoot?.render(<Error message={message} />);\n }\n}\n\nexport default ChartRenderer;\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"ChartRenderer.js","names":[],"sources":["../../src/heatmap/ChartRenderer.tsx"],"sourcesContent":["import { extent } from 'd3-array';\nimport type { HierarchyNode, HierarchyPointNode } from 'd3-hierarchy';\nimport { cluster } from 'd3-hierarchy';\nimport type { ScaleLinear, ScaleOrdinal } from 'd3-scale';\nimport { scaleLinear, scaleOrdinal } from 'd3-scale';\nimport lodash from 'lodash';\nimport type { ReactElement } from 'react';\nimport type { Root } from 'react-dom/client';\nimport { createRoot } from 'react-dom/client';\nimport { Error } from '../common/Error';\nimport type { LegendData, LegendItem } from '../common/types';\nimport { DataFrameProvider } from '../common/useDataFrame';\nimport { DEFAULT_HEIGHT, DEFAULT_WIDTH, MAX_LEGEND_GRADIENT_HEIGHT, MIN_LEGEND_GRADIENT_HEIGHT, TITLE_LINE_HEIGHT, TITLE_MARGIN } from '../constants';\nimport type { DataFrame } from '../DataFrame';\nimport type { AesItem, ColumnName, DataValue } from '../types';\nimport { arrangeLegendParts } from '../utils/arrangeLegendParts';\nimport { getChartEdgeSides } from '../utils/getChartEdgeSides';\nimport { getContinuousLegendTicks } from '../utils/getContinuousLegendTicks';\nimport { TextMeasurer } from '../utils/TextMeasurer/TextMeasurer';\nimport { ChartsGroup } from './components/ChartsGroup';\nimport type {\n AnnotationColorScales,\n CaptionsSizes,\n ChartDendrograms,\n ChartDimensionsData,\n ChartSizes,\n ChartsScales,\n Cluster,\n DendrogramAesScales,\n LabelAngles,\n Margins,\n} from './components/types';\nimport { CHART_SIDE_ELEMENTS, DEFAULT_AES, LEGEND_OFFSET, MIN_MARGIN, TITLE_LINE } from './constants';\nimport type { GroupedCellsHeatmap } from './getCells';\nimport type { DendrogramsData } from './getDendrograms';\nimport type { HeatmapSettingsImpl } from './HeatmapSettingsImpl';\nimport {\n calculateAnnotationTitleSizes,\n calculateChartSideElementSizes,\n calculateSideElementsBBoxes,\n createContinuousColorScale,\n createDiscreteColorScale,\n createDiscreteRoundColorScale,\n} from './utils';\nimport { calculateCaptionTails } from './utils/calculateCaptionTails';\n\nconst COS_PI_4 = Math.cos(Math.PI / 4);\nconst INCLINE_OFFSET = 5; // height of little triangle of text for captions inclined 45deg\nfunction updateLinksHeight(root: HierarchyPointNode<Cluster>, scale: (v: number) => number, coord: 'x' | 'y') {\n function setHeight(d: HierarchyPointNode<Cluster>) {\n d[coord] = scale(d.data.height);\n if (d.children) d.children.forEach(setHeight);\n }\n setHeight(root);\n}\n\n// add shift to move nodes positions with group gaps\nfunction addShiftToLinkCoord(\n root: HierarchyPointNode<Cluster>,\n shift: number,\n coordFrom: 'x' | 'y',\n coordTo = coordFrom\n) {\n function setX(d: HierarchyPointNode<Cluster>) {\n d[coordTo] = d[coordFrom] + shift;\n if (d.children) d.children.forEach(setX);\n }\n setX(root);\n}\n\nconst getSteps = (count: number, valueExtent: number[]) => {\n const min = Math.min(...valueExtent);\n const max = Math.max(...valueExtent);\n if (min === max) {\n const steps = count % 2 === 0 ? [] : [min];\n for (let i = 1; i < count / 2 + 1; i++) {\n steps.push(min + i);\n steps.unshift(min - i);\n }\n return steps;\n }\n if (count < 2) {\n return [min, max];\n }\n const step = (max - min) / (count - 1);\n const steps = [];\n for (let i = 0; i < count - 1; i++) {\n steps.push(min + step * i);\n }\n steps.push(max);\n return steps;\n};\n\nfunction getContinuousColorRange(normalization: HeatmapSettingsImpl['normalization'], colorsCount: number, valueExtent: number[]) {\n let extent = valueExtent;\n if (normalization) {\n if (normalization.colorRange) {\n extent = normalization.colorRange;\n }\n if (normalization.method === 'standardScaling') {\n extent = [-2, 2];\n }\n if (normalization.method === 'meanNormalization') {\n extent = [-0.75, 0.75];\n }\n }\n return getSteps(colorsCount, extent);\n}\n\nfunction getMaxTextLength(keys: string[], labels: Record<string, string>, textMeasurer: TextMeasurer) {\n let maxLabelSize = 0;\n for (const key of keys) {\n if (labels[key] === undefined) continue;\n const l = textMeasurer.getTextWidth(labels[key]);\n if (l > maxLabelSize) maxLabelSize = l;\n }\n return maxLabelSize;\n}\n\nfunction getCaptionHeight(size: number, angle: number) {\n if (angle === 90) {\n return size;\n }\n if (angle === 45) {\n return size * COS_PI_4 + (size > 0 ? 2 * INCLINE_OFFSET : 0);\n }\n return TITLE_LINE;\n}\n\nclass ChartRenderer {\n reactRoot: Root | null = null;\n parentNode: HTMLElement | null = null;\n rootNode: HTMLElement | null = null;\n component: ReactElement = (<></>);\n chartsDimensions: Record<string, ChartDimensionsData> = {};\n chartSizes: ChartSizes = {\n chartWidth: DEFAULT_WIDTH, // width of single chart\n chartHeight: DEFAULT_HEIGHT, // height of single chart\n chartsWidth: DEFAULT_WIDTH, // width of all charts in charts row\n chartsHeight: DEFAULT_HEIGHT, // width of all charts in charts column, without axes\n totalWidth: DEFAULT_WIDTH, // width of all charts in charts row, plus left axis, plus legend\n totalHeight: DEFAULT_HEIGHT, // width of all charts in charts height, plus bottom axis, plus top title\n };\n margins: Margins = {\n top: MIN_MARGIN,\n bottom: MIN_MARGIN,\n left: MIN_MARGIN,\n right: MIN_MARGIN,\n };\n captionsSizes: CaptionsSizes = {\n xAxisCaptions: 100,\n yAxisCaptions: 100,\n xGroupCaptions: TITLE_LINE,\n yGroupCaptions: TITLE_LINE,\n xCaptionTail: 0,\n yCaptionTail: 0,\n };\n labelAngles: LabelAngles = {\n xAxisLabels: 0,\n yAxisLabels: 0,\n xGroupLabels: 0,\n yGroupLabels: 0,\n };\n columnsCount = 1;\n rowsCount = 1;\n scales: ChartsScales = {\n // scales grouped by facet\n x: { null: scaleOrdinal<string, number>().domain(['null']).range([1]) },\n y: { null: scaleOrdinal<string, number>().domain(['null']).range([1]) },\n };\n step: {\n x: Record<string, number>;\n y: Record<string, number>;\n } = { x: {}, y: {} };\n colorScale: ScaleLinear<string, string> | ScaleOrdinal<string, string, string> = scaleLinear<string, string>()\n .domain([0, 1])\n .range(['white', 'black']);\n annotationColorScales: AnnotationColorScales = {};\n dendrogramAesScales: DendrogramAesScales = {};\n legend: LegendData = {\n width: 0,\n height: 0,\n items: [],\n };\n dendrograms: Record<string, ChartDendrograms> = {};\n\n clear() {\n if (this.parentNode && this.rootNode) {\n this.parentNode?.removeChild(this.rootNode);\n this.parentNode = null;\n this.rootNode = null;\n }\n // timeout to avoid trying to unmount during rendering\n setTimeout(() => {\n this.reactRoot?.unmount();\n this.reactRoot = null;\n });\n }\n\n init(node: HTMLElement) {\n if (this.parentNode === null) {\n this.parentNode = node;\n this.rootNode = document.createElement('div');\n this.parentNode.appendChild(this.rootNode);\n this.reactRoot = createRoot(this.rootNode);\n }\n }\n\n updateMargins(title: HeatmapSettingsImpl['chartSettings']['title'], size: HeatmapSettingsImpl['chartSettings']['size']) {\n this.margins = {\n top: title.show ? TITLE_LINE_HEIGHT + TITLE_MARGIN * 2 : size.outerOffset,\n bottom: size.outerOffset,\n left: size.outerOffset,\n right: this.legend.width + size.outerOffset,\n };\n this.chartSizes.totalWidth = this.margins.left + this.chartSizes.chartsWidth + this.margins.right;\n this.chartSizes.totalHeight =\n this.margins.top + Math.max(this.chartSizes.chartsHeight + this.margins.bottom, this.legend.height);\n }\n\n updateLegendSize(\n valueType: HeatmapSettingsImpl['chartSettings']['valueType'],\n legend: HeatmapSettingsImpl['chartSettings']['legend'],\n annotations: HeatmapSettingsImpl['annotations'],\n columnValue: ColumnName,\n valueExtent: [number, number]\n ) {\n if (!legend.show) {\n this.legend = { width: 0, height: 0, items: [] };\n return;\n }\n const continuousHeight = Math.min(\n Math.max(this.chartSizes.chartHeight, MIN_LEGEND_GRADIENT_HEIGHT),\n MAX_LEGEND_GRADIENT_HEIGHT\n );\n const legendHeight = Math.max(this.chartSizes.chartHeight, continuousHeight);\n const legendItems: LegendItem[] = [];\n const emptySizes = { width: 0, height: 0, left: 0, top: 0 };\n\n const getDefaultLabels = (values: (string | number)[]) => values.reduce((res: Record<string, string>, v: string | number) => { res[v] = String(v); return res; }, {});\n if (valueType === 'continuous') {\n const scale = this.colorScale as ScaleLinear<string, string>;\n const values = getContinuousLegendTicks(scale, valueExtent);\n const tickPositionScale = scaleLinear([values[0], values[values.length - 1]], [continuousHeight, 0]); //TODO: update during adding log scale for heatmap\n const title = columnValue.label ?? columnValue.value;\n legendItems.push({\n ...emptySizes,\n type: 'continuous',\n id: 'heatmapValue',\n scale,\n values,\n title,\n tickPositionScale\n });\n } else if (valueType === 'discrete') {\n const scale = this.colorScale as ScaleOrdinal<string, string>;\n const title = columnValue.label ?? columnValue.value;\n const values = scale.domain();\n const labels = getDefaultLabels(values);\n\n legendItems.push({ ...emptySizes, type: 'discreteColor', id: 'heatmapValue', title, scale, values, labels });\n }\n annotations.forEach(item => {\n const title = item.valueColumn.label ?? item.valueColumn.value;\n if (item.type === 'continuous') {\n const scale = this.annotationColorScales[item.id].scale as ScaleLinear<string, string>;\n const values = getContinuousLegendTicks(scale, valueExtent);\n const tickPositionScale = scaleLinear([values[0], values[values.length - 1]], [continuousHeight, 0]); //TODO: update during adding log scale for heatmap\n\n legendItems.push({ ...emptySizes, type: 'continuous', id: item.id, tickPositionScale, title, scale, values });\n }\n if (item.type === 'discrete') {\n const scale = this.annotationColorScales[item.id].scale as ScaleOrdinal<string, string>;\n const values = scale.domain();\n const labels = getDefaultLabels(values);\n\n legendItems.push({ ...emptySizes, type: 'discreteColor', id: item.id, title, scale, values, labels });\n }\n });\n\n if (!legendItems.length) {\n this.legend = { width: 0, height: 0, items: [] };\n return;\n }\n\n const items = arrangeLegendParts(legendItems, this.chartSizes.chartHeight,continuousHeight);\n const maxRightEdge = items.reduce((max, item) => Math.max(max, item.left + item.width), 0);\n\n const legendWidth = maxRightEdge + LEGEND_OFFSET;\n\n this.legend = {\n width: legendWidth,\n height: legendHeight,\n items\n };\n }\n\n updateCaptionsSize(\n groupedCells: GroupedCellsHeatmap,\n xAxis: HeatmapSettingsImpl['chartSettings']['xAxis'],\n yAxis: HeatmapSettingsImpl['chartSettings']['yAxis'],\n facetSettings: HeatmapSettingsImpl['facetSettings']\n ) {\n const textMeasurer = new TextMeasurer('bold 16px Manrope');\n const { xGroupKeys, yGroupKeys, xGroupLabels, yGroupLabels, xKeysByGroups, yKeysByGroups, xLabels, yLabels } = groupedCells.meta;\n this.labelAngles = {\n xAxisLabels: xAxis.axisLabelsAngle,\n yAxisLabels: yAxis.axisLabelsAngle,\n xGroupLabels: xAxis.groupLabelsAngle,\n yGroupLabels: yAxis.groupLabelsAngle,\n };\n\n const maxXLabelSize = xGroupKeys.reduce((res, key) => Math.max(res, getMaxTextLength(xKeysByGroups[key], xLabels, textMeasurer)), 0);\n const maxYLabelSize = yGroupKeys.reduce((res, key) => Math.max(res, getMaxTextLength(yKeysByGroups[key], yLabels, textMeasurer)), 0);\n const maxXGroupLabelSize = getMaxTextLength(xGroupKeys, xGroupLabels, textMeasurer);\n const maxYGroupLabelSize = getMaxTextLength(yGroupKeys, yGroupLabels, textMeasurer);\n const { xCaptionTail, yCaptionTail } = calculateCaptionTails(\n this.labelAngles,\n facetSettings,\n this.scales,\n this.step,\n groupedCells,\n textMeasurer\n );\n this.captionsSizes = {\n xCaptionTail,\n yCaptionTail,\n xGroupCaptions: getCaptionHeight(maxXGroupLabelSize, this.labelAngles.xGroupLabels),\n yGroupCaptions: getCaptionHeight(maxYGroupLabelSize, this.labelAngles.yGroupLabels),\n xAxisCaptions: getCaptionHeight(maxXLabelSize, this.labelAngles.xAxisLabels),\n yAxisCaptions: getCaptionHeight(maxYLabelSize, this.labelAngles.yAxisLabels),\n };\n }\n\n updateChartDimensions(\n size: HeatmapSettingsImpl['chartSettings']['size'],\n facetKeys: string[],\n xGroupKeys: string[],\n yGroupKeys: string[],\n facetSettings: HeatmapSettingsImpl['facetSettings'],\n xAxis: HeatmapSettingsImpl['chartSettings']['xAxis'],\n yAxis: HeatmapSettingsImpl['chartSettings']['yAxis'],\n annotations: HeatmapSettingsImpl['annotations'],\n dendrogramX: HeatmapSettingsImpl['dendrogramX'],\n dendrogramY: HeatmapSettingsImpl['dendrogramY']\n ) {\n const facetCount = facetKeys.length;\n const maxNRows = Math.min(facetSettings.nRows ?? facetCount, facetCount);\n const maxNCols = Math.min(facetSettings.nCols ?? facetCount, facetCount);\n // Use columns/rows count from settings if some of them defined, else make 1 column\n this.columnsCount = facetSettings.nRows ? Math.ceil(facetCount / maxNRows) : maxNCols;\n this.rowsCount = Math.ceil(facetCount / this.columnsCount);\n const { sharedX, sharedY } = facetSettings;\n\n this.chartsDimensions = {};\n\n let currentLeft = 0;\n let currentTop = 0;\n facetKeys.forEach((key, index) => {\n const currentColumn = (index % this.columnsCount) + 1;\n const chartSides = getChartEdgeSides(index, facetKeys.length, this.columnsCount, this.rowsCount);\n const stepX = this.step.x[key];\n const stepY = this.step.y[key];\n const sideElementSizes = calculateChartSideElementSizes(\n xAxis,\n yAxis,\n this.captionsSizes,\n annotations,\n dendrogramX,\n dendrogramY,\n chartSides,\n sharedX,\n sharedY,\n facetKeys,\n xGroupKeys,\n yGroupKeys,\n stepX,\n stepY\n );\n const annotationsTitleSizes = calculateAnnotationTitleSizes(annotations, chartSides, sharedX, sharedY);\n function getPadding(side: 'left' | 'right' | 'top' | 'bottom') {\n return Math.max(\n CHART_SIDE_ELEMENTS[side].reduce((res, el) => res + sideElementSizes[side][el], 0),\n annotationsTitleSizes[side],\n size.innerOffset\n );\n }\n const padding = {\n left: getPadding('left'),\n right: getPadding('right'),\n top: getPadding('top'),\n bottom: getPadding('bottom'),\n };\n if (padding.left < this.captionsSizes.xCaptionTail) {\n padding.left = this.captionsSizes.xCaptionTail;\n }\n if (padding.bottom < this.captionsSizes.yCaptionTail) {\n padding.bottom = this.captionsSizes.yCaptionTail;\n }\n const sideElementBBoxes = calculateSideElementsBBoxes(sideElementSizes, this.chartSizes.chartWidth, this.chartSizes.chartHeight);\n const outerWidth = this.chartSizes.chartWidth + padding.left + padding.right;\n const outerHeight = this.chartSizes.chartHeight + padding.top + padding.bottom;\n this.chartsDimensions[key] = {\n left: currentLeft,\n top: currentTop,\n inner: { width: this.chartSizes.chartWidth, height: this.chartSizes.chartHeight },\n outer: { width: outerWidth, height: outerHeight },\n padding,\n sideElementBBoxes,\n chartEdgeSides: chartSides,\n };\n currentLeft += outerWidth;\n if (currentColumn === this.columnsCount) {\n currentLeft = 0;\n currentTop += outerHeight;\n }\n });\n\n // sum of widths of first row\n const chartsWidth = facetKeys\n .slice(0, this.columnsCount)\n .reduce((sum, key) => sum + this.chartsDimensions[key].outer.width, 0);\n // sum of heights of first column\n const chartsHeight = facetKeys\n .filter((_key, index) => index % this.columnsCount === 0)\n .reduce((sum, key) => sum + this.chartsDimensions[key].outer.height, 0);\n this.chartSizes.chartsWidth = chartsWidth;\n this.chartSizes.chartsHeight = chartsHeight;\n }\n\n updateChartsSizes(\n size: HeatmapSettingsImpl['chartSettings']['size'],\n groupedCells: GroupedCellsHeatmap,\n groupGap: number,\n ) {\n const { width, height, cellWidth, cellHeight } = size;\n const firstFacet = groupedCells.meta.facetKeys[0];\n if (cellWidth && firstFacet) {\n const keysCount = groupedCells.facets[firstFacet].xKeys.length;\n const nonEmptyXGroupsCount = groupedCells.meta.xGroupKeys.filter(\n k => (groupedCells.facets[firstFacet]?.xKeysByGroups[k]?.length ?? 0) > 0\n ).length;\n this.chartSizes.chartWidth = keysCount * cellWidth + groupGap * (nonEmptyXGroupsCount - 1);\n } else {\n this.chartSizes.chartWidth = width;\n }\n\n if (cellHeight && firstFacet) {\n const keysCount = groupedCells.facets[firstFacet].yKeys.length;\n const nonEmptyYGroupsCount = groupedCells.meta.yGroupKeys.filter(\n k => (groupedCells.facets[firstFacet]?.yKeysByGroups[k]?.length ?? 0) > 0\n ).length;\n this.chartSizes.chartHeight = keysCount * cellHeight + groupGap * (nonEmptyYGroupsCount - 1);\n } else {\n this.chartSizes.chartHeight = height;\n }\n }\n\n // update scales for cell positions, x and y for each facet\n updateScales(\n facetKeys: string[],\n groupedCells: GroupedCellsHeatmap,\n groupGap: number,\n facetSettings: HeatmapSettingsImpl['facetSettings'],\n size: HeatmapSettingsImpl['chartSettings']['size'],\n xAxis: HeatmapSettingsImpl['chartSettings']['xAxis'],\n yAxis: HeatmapSettingsImpl['chartSettings']['yAxis'],\n dendrogramX: HeatmapSettingsImpl['dendrogramX'],\n dendrogramY: HeatmapSettingsImpl['dendrogramY'],\n customOrder: {x: boolean, y: boolean, xGroup: boolean, yGroup: boolean},\n ) {\n const { width, height, cellWidth, cellHeight } = size;\n const { meta, facets } = groupedCells;\n const { sharedX, sharedY } = facetSettings;\n const sortX = (arr: string[], labels: Record<string, string> = {}) => {\n return arr.sort((a, b) => xAxis.sorting === '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 };\n const sortY = (arr: string[], labels: Record<string, string> = {}) => {\n return arr.sort((a, b) => yAxis.sorting === '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 };\n facetKeys.forEach(facetKey => {\n const facetGroup = facets[facetKey];\n const xGroupKeys = customOrder.xGroup ? meta.xGroupKeys : sortX(meta.xGroupKeys);\n const yGroupKeys = customOrder.yGroup ? meta.yGroupKeys : sortY(meta.yGroupKeys);\n const { xKeysByGroups } = sharedX ? meta : facetGroup;\n const { yKeysByGroups } = sharedY ? meta : facetGroup;\n // for shared facets max cells counts in group should be used\n const xCounts = xGroupKeys.map(xGroupKey => xKeysByGroups[xGroupKey].length);\n const yCounts = yGroupKeys.map(yGroupKey => yKeysByGroups[yGroupKey].length);\n const xCellsCount = xCounts.reduce((sum, count) => sum + count, 0);\n const yCellsCount = yCounts.reduce((sum, count) => sum + count, 0);\n const xStep = cellWidth ? cellWidth : (width - (xCounts.filter(count => count > 0).length - 1) * groupGap) / xCellsCount;\n const yStep = cellHeight ? cellHeight : (height - (yCounts.filter(count => count > 0).length - 1) * groupGap) / yCellsCount;\n\n const xPositions: number[] = [];\n let xKeys: string[] = [];\n let currentX = 0;\n const resolvedXGroups = xGroupKeys.map(xKey =>\n dendrogramX || customOrder.x ? xKeysByGroups[xKey] : sortX(xKeysByGroups[xKey], meta.xLabels)\n );\n resolvedXGroups.forEach((axisKeys, idx) => {\n xKeys = xKeys.concat(axisKeys);\n axisKeys.forEach(() => {\n xPositions.push(currentX);\n currentX += xStep;\n });\n // add gap only if a non-empty group follows (skip trailing gap after last visible group)\n const hasMoreNonEmpty = resolvedXGroups.slice(idx + 1).some(keys => keys.length > 0);\n if (axisKeys.length > 0 && hasMoreNonEmpty) {\n currentX += groupGap;\n }\n });\n\n const yPositions: number[] = [];\n let yKeys: string[] = [];\n let currentY = 0;\n const resolvedYGroups = yGroupKeys.map(yKey =>\n dendrogramY || customOrder.y ? yKeysByGroups[yKey] : sortY(yKeysByGroups[yKey], meta.yLabels)\n );\n resolvedYGroups.forEach((axisKeys, idx) => {\n yKeys = yKeys.concat(axisKeys);\n axisKeys.forEach(() => {\n yPositions.push(currentY);\n currentY += yStep;\n });\n // add gap only if a non-empty group follows (skip trailing gap after last visible group)\n const hasMoreNonEmpty = resolvedYGroups.slice(idx + 1).some(keys => keys.length > 0);\n if (axisKeys.length > 0 && hasMoreNonEmpty) {\n currentY += groupGap;\n }\n });\n\n this.scales.x[facetKey] = scaleOrdinal<string, number>().domain(xKeys).range(xPositions);\n this.scales.y[facetKey] = scaleOrdinal<string, number>().domain(yKeys).range(yPositions);\n this.step.x[facetKey] = xStep;\n this.step.y[facetKey] = yStep;\n });\n }\n\n updateAesScale(\n valueType: 'discrete' | 'continuous',\n valueExtent: [number, number],\n aes: HeatmapSettingsImpl['aes'],\n annotations: HeatmapSettingsImpl['annotations'],\n groupedCellsData: GroupedCellsHeatmap,\n cellUniqValues: DataValue[],\n normalization: HeatmapSettingsImpl['normalization']\n ) {\n if (valueType === 'continuous') {\n if (aes.valueColors) {\n this.colorScale = scaleLinear<string, string>()\n .domain(aes.valuesByColors ?? getContinuousColorRange(normalization, aes.valueColors.length, valueExtent))\n .range(aes.valueColors);\n } else if (aes.colorsList) {\n this.colorScale = scaleLinear<string, string>()\n .domain(getContinuousColorRange(normalization, aes.colorsList.length, valueExtent))\n .range(aes.colorsList);\n }\n } else {\n if (aes.colorsMap) {\n const valueKeys = Object.entries(aes.colorsMap);\n this.colorScale = scaleOrdinal<string, string>()\n .domain(valueKeys.map(v => v[0]))\n .range(valueKeys.map(v => v[1]))\n .unknown('#ccc');\n } else if (aes.colorsList) {\n this.colorScale = createDiscreteColorScale(aes.colorsList, cellUniqValues.map(String));\n }\n }\n\n const { xDataByKeys, yDataByKeys } = groupedCellsData.meta;\n annotations.forEach(item => {\n const { colors, type, axis, valueColumn } = item;\n const data = (axis === 'x' ? xDataByKeys : yDataByKeys)[valueColumn.valueLabels ?? valueColumn.value];\n if (type === 'discrete') {\n const discreteValues = lodash.uniq(Object.values(data).map(String)).sort();\n this.annotationColorScales[item.id] = {\n type: 'discrete',\n scale: createDiscreteRoundColorScale(colors, discreteValues),\n };\n } else {\n const values = Object.values(data).map(Number);\n if (!values.length) {\n return;\n }\n const [min = values[0], max = values[0]] = extent(values);\n this.annotationColorScales[item.id] = {\n type: 'continuous',\n scale: createContinuousColorScale(colors, min, max, 0, 0.5, 1),\n };\n }\n });\n }\n\n updateDendrogram(\n facetKeys: string[],\n xGroupKeys: string[],\n yGroupKeys: string[],\n groups: GroupedCellsHeatmap['facets'],\n dendrogramsData: DendrogramsData,\n dendrogramX: HeatmapSettingsImpl['dendrogramX'],\n dendrogramY: HeatmapSettingsImpl['dendrogramY']\n ) {\n facetKeys.forEach(facetKey => {\n this.dendrograms[facetKey] = { x: { treesByGroupKey: {}, data: dendrogramX }, y: { treesByGroupKey: {}, data: dendrogramY } };\n const { xKeysByGroups, yKeysByGroups } = groups[facetKey];\n if (dendrogramX) {\n const { hierarchyByGroupX } = dendrogramsData[facetKey];\n const maxHeightX = xGroupKeys.reduce((res, xKey) => Math.max(res, hierarchyByGroupX[xKey]?.data.height ?? 0), 0);\n this.dendrograms[facetKey].x.treesByGroupKey = xGroupKeys.reduce((res, groupKey) => {\n const hierarchy = hierarchyByGroupX[groupKey];\n if (!hierarchy) return res;\n const xKeys = xKeysByGroups[groupKey];\n cluster()\n .separation(() => 1)\n .size([hierarchy.leaves().length * this.step.x[facetKey], dendrogramX.size])(\n hierarchy as HierarchyNode<unknown>\n );\n const root = hierarchy as HierarchyPointNode<Cluster>;\n const heightScale = scaleLinear()\n .domain(dendrogramX.position === 'top' ? [0, maxHeightX] : [maxHeightX, 0])\n .range([dendrogramX.size, 0]);\n updateLinksHeight(root, heightScale, 'y');\n addShiftToLinkCoord(root, this.scales.x[facetKey](xKeys[0]), 'x');\n res[groupKey] = root;\n return res;\n }, {} as Record<string, HierarchyPointNode<Cluster>>);\n this.dendrograms[facetKey].x.data = dendrogramX;\n }\n if (dendrogramY) {\n const { hierarchyByGroupY } = dendrogramsData[facetKey];\n const maxHeightY = yGroupKeys.reduce((res, yKey) => Math.max(res, hierarchyByGroupY[yKey]?.data.height ?? 0), 0);\n this.dendrograms[facetKey].y.treesByGroupKey = yGroupKeys.reduce((res, groupKey) => {\n const hierarchy = hierarchyByGroupY[groupKey];\n if (!hierarchy) return res;\n const yKeys = yKeysByGroups[groupKey];\n cluster()\n .separation(() => 1)\n .size([hierarchy.leaves().length * this.step.y[facetKey], dendrogramY.size])(\n hierarchy as HierarchyNode<unknown>\n );\n const root = hierarchy as HierarchyPointNode<Cluster>;\n const heightScale = scaleLinear()\n .domain(dendrogramY.position === 'left' ? [0, maxHeightY] : [maxHeightY, 0])\n .range([dendrogramY.size, 0]);\n addShiftToLinkCoord(root, this.scales.y[facetKey](yKeys[0]), 'x', 'y');\n updateLinksHeight(root, heightScale, 'x');\n res[groupKey] = root;\n return res;\n }, {} as Record<string, HierarchyPointNode<Cluster>>);\n this.dendrograms[facetKey].y.data = dendrogramY;\n }\n });\n }\n\n updateDendrogramAesScales(inheritedAes: HeatmapSettingsImpl['inheritedDendrogramAes']) {\n if (!inheritedAes) {\n return;\n }\n const usedColumns = Object.keys(inheritedAes);\n this.dendrogramAesScales = usedColumns.reduce((res: DendrogramAesScales, columnName) => {\n const aesMap = inheritedAes[columnName];\n const columnValues: string[] = Object.keys(aesMap);\n res[columnName] = scaleOrdinal<string, AesItem, AesItem>()\n .domain(columnValues)\n .range(\n columnValues.map(value => ({\n ...DEFAULT_AES,\n ...aesMap[value],\n }))\n )\n .unknown(DEFAULT_AES);\n return res;\n }, {});\n }\n\n render(\n dataFrame: DataFrame,\n settingsId: string,\n chartSettings: HeatmapSettingsImpl['chartSettings'],\n facetSettings: HeatmapSettingsImpl['facetSettings'],\n aes: HeatmapSettingsImpl['aes'],\n groupedCellsData: GroupedCellsHeatmap,\n annotations: HeatmapSettingsImpl['annotations'],\n valueColumn: ColumnName,\n dendrogramX: HeatmapSettingsImpl['dendrogramX'],\n dendrogramY: HeatmapSettingsImpl['dendrogramY'],\n dendrogramsData: DendrogramsData,\n inheritedDendrogramAes: HeatmapSettingsImpl['inheritedDendrogramAes'],\n cellUniqValues: DataValue[],\n normalization: HeatmapSettingsImpl['normalization'],\n onTooltipHintSwitch: (v: boolean) => void,\n customOrder: {x: boolean, y: boolean, xGroup: boolean, yGroup: boolean},\n cellsRenderingMode: 'canvas' | 'svg'\n ) {\n const { meta, facets } = groupedCellsData;\n const { facetKeys, xGroupKeys, yGroupKeys, valueExtent } = meta;\n const { xAxis, yAxis, title, size, valueType } = chartSettings;\n this.updateChartsSizes(size, groupedCellsData, aes.groupGap);\n this.updateAesScale(valueType, valueExtent.dataSource, aes, annotations, groupedCellsData, cellUniqValues, normalization);\n this.updateScales(facetKeys, groupedCellsData, aes.groupGap, facetSettings, size, chartSettings.xAxis, chartSettings.yAxis, dendrogramX, dendrogramY, customOrder);\n // caption sizes are needed for chart paddings in chart dimensions\n this.updateCaptionsSize(groupedCellsData, xAxis, yAxis, facetSettings);\n this.updateChartDimensions(\n size,\n facetKeys,\n xGroupKeys,\n yGroupKeys,\n facetSettings,\n xAxis,\n yAxis,\n annotations,\n dendrogramX,\n dendrogramY\n );\n this.updateLegendSize(valueType, chartSettings.legend, annotations, valueColumn, valueExtent.dataSource);\n this.updateMargins(title, size);\n this.updateDendrogram(facetKeys, xGroupKeys, yGroupKeys, facets, dendrogramsData, dendrogramX, dendrogramY);\n this.updateDendrogramAesScales(inheritedDendrogramAes);\n const component = (\n <DataFrameProvider dataFrame={dataFrame}>\n <ChartsGroup\n aes={aes}\n annotations={annotations}\n annotationColorScales={this.annotationColorScales}\n captionsSizes={this.captionsSizes}\n cellsMeta={meta}\n columnsCount={this.columnsCount}\n chartsDimensions={this.chartsDimensions}\n chartSettings={chartSettings}\n chartSizes={this.chartSizes}\n colorScale={this.colorScale as (v: unknown) => string}\n dendrogramAesScales={this.dendrogramAesScales}\n dendrograms={this.dendrograms}\n facetKeys={facetKeys}\n facetSettings={facetSettings}\n groupedCells={facets}\n labelAngles={this.labelAngles}\n legend={this.legend}\n margins={this.margins}\n scales={this.scales}\n settingsId={settingsId}\n step={this.step}\n xGroupKeys={xGroupKeys}\n yGroupKeys={yGroupKeys}\n onTooltipHintSwitch={onTooltipHintSwitch}\n cellsRenderingMode={cellsRenderingMode}\n />\n </DataFrameProvider>\n );\n this.component = component;\n this.reactRoot?.render(component);\n }\n\n renderError(message: string) {\n this.reactRoot?.render(<Error message={message} />);\n }\n}\n\nexport default ChartRenderer;\n"],"mappings":"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"}
|
|
@@ -131,6 +131,8 @@ export declare class HeatmapSettingsImpl implements SettingsInterface {
|
|
|
131
131
|
readonly dendrogramY: HeatmapDendrogramSettingsY | null;
|
|
132
132
|
readonly inheritedDendrogramAes: Record<string, AesRecord> | null;
|
|
133
133
|
readonly NAValueAs: number | null;
|
|
134
|
+
readonly showEmptyRows: boolean;
|
|
135
|
+
readonly showEmptyColumns: boolean;
|
|
134
136
|
readonly cellsRenderingMode: 'canvas' | 'svg' | null;
|
|
135
137
|
constructor(settings: HeatmapSettings);
|
|
136
138
|
}
|