@milaboratories/miplots4 1.2.1 → 1.2.2
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/common/ContinuousGrid.d.ts.map +1 -1
- package/dist/common/ContinuousGrid.js +90 -56
- package/dist/common/ContinuousGrid.js.map +1 -1
- package/dist/histogram/ChartRenderer.d.ts.map +1 -1
- package/dist/histogram/ChartRenderer.js +6 -0
- package/dist/histogram/ChartRenderer.js.map +1 -1
- package/dist/histogram/HistogramSettingsImpl.d.ts +5 -1
- package/dist/histogram/HistogramSettingsImpl.d.ts.map +1 -1
- package/dist/histogram/HistogramSettingsImpl.js.map +1 -1
- package/dist/scatterplot/components/Grid.d.ts.map +1 -1
- package/dist/scatterplot/components/Grid.js +109 -71
- package/dist/scatterplot/components/Grid.js.map +1 -1
- package/dist/types/bubble.d.ts +8 -8
- package/dist/types/common.d.ts +62 -6
- package/dist/types/common.d.ts.map +1 -1
- package/dist/types/common.js +15 -6
- package/dist/types/common.js.map +1 -1
- package/dist/types/dendro.d.ts +6 -6
- package/dist/types/discrete.d.ts +41 -13
- package/dist/types/discrete.d.ts.map +1 -1
- package/dist/types/heatmap.d.ts +4 -4
- package/dist/types/histogram.d.ts +59 -10
- package/dist/types/histogram.d.ts.map +1 -1
- package/dist/types/histogram.js +60 -66
- package/dist/types/histogram.js.map +1 -1
- package/dist/types/scatterplot-umap.d.ts +74 -18
- package/dist/types/scatterplot-umap.d.ts.map +1 -1
- package/dist/types/scatterplot.d.ts +74 -18
- package/dist/types/scatterplot.d.ts.map +1 -1
- package/dist/types/selection.d.ts +8 -8
- package/dist/utils/getChartEdgeSides.d.ts +1 -1
- package/dist/utils/significantLinesStyle.d.ts +8 -0
- package/dist/utils/significantLinesStyle.d.ts.map +1 -0
- package/dist/utils/significantLinesStyle.js +12 -0
- package/dist/utils/significantLinesStyle.js.map +1 -0
- package/package.json +1 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ContinuousGrid.d.ts","sourceRoot":"","sources":["../../src/common/ContinuousGrid.tsx"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAC,sBAAsB,EAAE,SAAS,EAAC,MAAM,UAAU,CAAC;
|
|
1
|
+
{"version":3,"file":"ContinuousGrid.d.ts","sourceRoot":"","sources":["../../src/common/ContinuousGrid.tsx"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAC,sBAAsB,EAAE,SAAS,EAAC,MAAM,UAAU,CAAC;AAIhE,OAAO,KAAK,EAAC,WAAW,EAAE,gBAAgB,EAAE,WAAW,EAAC,MAAM,UAAU,CAAC;AAUzE,UAAU,SAAS;IACf,MAAM,EAAE,WAAW,CAAC,MAAM,EAAE,MAAM,CAAC,GAAG,gBAAgB,CAAC,MAAM,EAAE,MAAM,CAAC,GAAG,WAAW,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACrG,MAAM,EAAE,WAAW,CAAC,MAAM,EAAE,MAAM,CAAC,GAAG,gBAAgB,CAAC,MAAM,EAAE,MAAM,CAAC,GAAG,WAAW,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACrG,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,MAAM,CAAC;IACf,KAAK,EAAE,sBAAsB,CAAC;IAC9B,KAAK,EAAE,sBAAsB,CAAC;IAC9B,SAAS,EAAE,SAAS,CAAC;IACrB,WAAW,CAAC,EAAE,MAAM,CAAC;CACxB;AAED,wBAAgB,cAAc,CAAC,EAAC,MAAM,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,KAAK,EAAE,SAAS,EAAE,WAAgB,EAAC,EAAE,SAAS,2CAiHnH"}
|
|
@@ -1,92 +1,126 @@
|
|
|
1
1
|
import { BLACK as e, GRID_GRAY as t } from "../constants.js";
|
|
2
|
-
import {
|
|
3
|
-
import {
|
|
4
|
-
import {
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
2
|
+
import { numberFormat as n } from "../utils/numberFormat.js";
|
|
3
|
+
import { getLineShape as r } from "../utils/getLineShape.js";
|
|
4
|
+
import { resolveSignificantLinesStyle as i } from "../utils/significantLinesStyle.js";
|
|
5
|
+
import { useEffect as a, useState as o } from "react";
|
|
6
|
+
import { jsx as s, jsxs as c } from "react/jsx-runtime";
|
|
7
|
+
var l = 1, u = 11;
|
|
8
|
+
function d({ scaleX: d, scaleY: f, width: p, height: m, axisX: h, axisY: g, frameType: _, updatingKey: v = "" }) {
|
|
9
|
+
let [y, b] = o(d.ticks()), [x, S] = o(f.ticks()), { significantLines: C = [] } = h, { significantLines: w = [] } = g, T = i(h.significantLinesStyle, "x"), E = i(g.significantLinesStyle, "y");
|
|
10
|
+
return a(() => {
|
|
11
|
+
let e = d.ticks().filter((e) => !C.includes(e)), t = f.ticks().filter((e) => !w.includes(e));
|
|
12
|
+
b(e), S(t);
|
|
11
13
|
}, [
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
]), /* @__PURE__ */
|
|
14
|
+
d,
|
|
15
|
+
f,
|
|
16
|
+
v
|
|
17
|
+
]), /* @__PURE__ */ c("g", {
|
|
16
18
|
stroke: t,
|
|
17
19
|
children: [
|
|
18
|
-
|
|
19
|
-
let t =
|
|
20
|
-
return /* @__PURE__ */
|
|
20
|
+
h.showGrid && y.map((e) => {
|
|
21
|
+
let t = d(e);
|
|
22
|
+
return /* @__PURE__ */ s("line", {
|
|
21
23
|
x1: t,
|
|
22
24
|
x2: t,
|
|
23
25
|
y1: 0,
|
|
24
|
-
y2:
|
|
25
|
-
}, `x_${t}_${
|
|
26
|
+
y2: m
|
|
27
|
+
}, `x_${t}_${m}`);
|
|
26
28
|
}),
|
|
27
|
-
|
|
28
|
-
let t =
|
|
29
|
-
return /* @__PURE__ */
|
|
29
|
+
g.showGrid && x.map((e) => {
|
|
30
|
+
let t = f(e);
|
|
31
|
+
return /* @__PURE__ */ s("line", {
|
|
30
32
|
x1: 0,
|
|
31
|
-
x2:
|
|
33
|
+
x2: p,
|
|
32
34
|
y1: t,
|
|
33
35
|
y2: t
|
|
34
|
-
}, `y_${t}_${
|
|
36
|
+
}, `y_${t}_${p}`);
|
|
35
37
|
}),
|
|
36
|
-
/* @__PURE__ */
|
|
37
|
-
strokeDasharray:
|
|
38
|
+
/* @__PURE__ */ s("g", {
|
|
39
|
+
strokeDasharray: r(T.shape),
|
|
38
40
|
stroke: e,
|
|
39
|
-
children:
|
|
40
|
-
let t =
|
|
41
|
-
return t < 0 || t >
|
|
41
|
+
children: C.map((e) => {
|
|
42
|
+
let t = d(e);
|
|
43
|
+
return t < 0 || t > p ? null : /* @__PURE__ */ s("line", {
|
|
42
44
|
x1: t,
|
|
43
45
|
x2: t,
|
|
44
46
|
y1: 0,
|
|
45
|
-
y2:
|
|
46
|
-
}, `significant_${t}_${
|
|
47
|
+
y2: m
|
|
48
|
+
}, `significant_${t}_${m}`);
|
|
47
49
|
})
|
|
48
50
|
}),
|
|
49
|
-
/* @__PURE__ */
|
|
50
|
-
|
|
51
|
+
T.showLabel && /* @__PURE__ */ s("g", {
|
|
52
|
+
fill: "#110529",
|
|
53
|
+
fontSize: 10,
|
|
54
|
+
stroke: "none",
|
|
55
|
+
children: C.map((e) => {
|
|
56
|
+
let t = d(e);
|
|
57
|
+
if (t < 0 || t > p) return null;
|
|
58
|
+
let r = t < 24 ? "start" : t > p - 24 ? "end" : "middle", i = r === "start" ? 3 : r === "end" ? -3 : 0, a = T.labelPosition === "bottom" ? m - 3 : u;
|
|
59
|
+
return /* @__PURE__ */ s("text", {
|
|
60
|
+
x: t + i,
|
|
61
|
+
y: a,
|
|
62
|
+
textAnchor: r,
|
|
63
|
+
children: n(e)
|
|
64
|
+
}, `significant_label_${t}`);
|
|
65
|
+
})
|
|
66
|
+
}),
|
|
67
|
+
/* @__PURE__ */ s("g", {
|
|
68
|
+
strokeDasharray: r(E.shape),
|
|
51
69
|
stroke: e,
|
|
52
|
-
children:
|
|
53
|
-
let t =
|
|
54
|
-
return t < 0 || t >
|
|
70
|
+
children: w.map((e) => {
|
|
71
|
+
let t = f(e);
|
|
72
|
+
return t < 0 || t > m ? null : /* @__PURE__ */ s("line", {
|
|
55
73
|
x1: 0,
|
|
56
|
-
x2:
|
|
74
|
+
x2: p,
|
|
57
75
|
y1: t,
|
|
58
76
|
y2: t
|
|
59
|
-
}, `significant_${t}_${
|
|
77
|
+
}, `significant_${t}_${p}`);
|
|
78
|
+
})
|
|
79
|
+
}),
|
|
80
|
+
E.showLabel && /* @__PURE__ */ s("g", {
|
|
81
|
+
fill: "#110529",
|
|
82
|
+
fontSize: 10,
|
|
83
|
+
stroke: "none",
|
|
84
|
+
children: w.map((e) => {
|
|
85
|
+
let t = f(e);
|
|
86
|
+
if (t < 0 || t > m) return null;
|
|
87
|
+
let r = t < u + 3 ? t + u : (m - u, t - 3), i = E.labelPosition === "right";
|
|
88
|
+
return /* @__PURE__ */ s("text", {
|
|
89
|
+
x: i ? p - 4 : 4,
|
|
90
|
+
y: r,
|
|
91
|
+
textAnchor: i ? "end" : "start",
|
|
92
|
+
children: n(e)
|
|
93
|
+
}, `significant_label_${t}`);
|
|
60
94
|
})
|
|
61
95
|
}),
|
|
62
|
-
|
|
63
|
-
strokeWidth:
|
|
96
|
+
_ !== "empty" && /* @__PURE__ */ c("g", {
|
|
97
|
+
strokeWidth: l,
|
|
64
98
|
children: [
|
|
65
|
-
(
|
|
66
|
-
stroke:
|
|
99
|
+
(h.showGrid || _ !== "left") && /* @__PURE__ */ s("line", {
|
|
100
|
+
stroke: _ === "left" ? "#E1E3EB" : "#110529",
|
|
67
101
|
x1: "0",
|
|
68
|
-
x2:
|
|
69
|
-
y1:
|
|
70
|
-
y2:
|
|
102
|
+
x2: p,
|
|
103
|
+
y1: m,
|
|
104
|
+
y2: m
|
|
71
105
|
}),
|
|
72
|
-
(
|
|
73
|
-
stroke:
|
|
106
|
+
(h.showGrid || _ !== "bottom") && /* @__PURE__ */ s("line", {
|
|
107
|
+
stroke: _ === "bottom" ? "#E1E3EB" : "#110529",
|
|
74
108
|
x1: "0",
|
|
75
109
|
x2: "0",
|
|
76
110
|
y1: "0",
|
|
77
|
-
y2:
|
|
111
|
+
y2: m
|
|
78
112
|
}),
|
|
79
|
-
(
|
|
80
|
-
stroke:
|
|
81
|
-
x1:
|
|
82
|
-
x2:
|
|
113
|
+
(h.showGrid || _ === "full") && /* @__PURE__ */ s("line", {
|
|
114
|
+
stroke: _ === "full" ? "#110529" : "#E1E3EB",
|
|
115
|
+
x1: p,
|
|
116
|
+
x2: p,
|
|
83
117
|
y1: "0",
|
|
84
|
-
y2:
|
|
118
|
+
y2: m
|
|
85
119
|
}),
|
|
86
|
-
(
|
|
87
|
-
stroke:
|
|
120
|
+
(g.showGrid || _ === "full") && /* @__PURE__ */ s("line", {
|
|
121
|
+
stroke: _ === "full" ? "#110529" : "#E1E3EB",
|
|
88
122
|
x1: "0",
|
|
89
|
-
x2:
|
|
123
|
+
x2: p,
|
|
90
124
|
y1: "0",
|
|
91
125
|
y2: "0"
|
|
92
126
|
})
|
|
@@ -95,6 +129,6 @@ function c({ scaleX: c, scaleY: l, width: u, height: d, axisX: f, axisY: p, fram
|
|
|
95
129
|
]
|
|
96
130
|
});
|
|
97
131
|
}
|
|
98
|
-
export {
|
|
132
|
+
export { d as ContinuousGrid };
|
|
99
133
|
|
|
100
134
|
//# sourceMappingURL=ContinuousGrid.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ContinuousGrid.js","names":[],"sources":["../../src/common/ContinuousGrid.tsx"],"sourcesContent":["import {BLACK, GRID_GRAY} from '../constants';\nimport type {AxisSettingsContinuous, FrameType} from '../types';\nimport {getLineShape} from '../utils/getLineShape';\nimport type {ScaleLinear, ScaleLogarithmic, ScaleSymLog} from 'd3-scale';\nimport React from 'react';\nimport {useEffect, useState} from 'react';\n\nconst GRID_FRAME_WIDTH = 1;\n\ninterface GridProps {\n scaleY: ScaleLinear<number, number> | ScaleLogarithmic<number, number> | ScaleSymLog<number, number>;\n scaleX: ScaleLinear<number, number> | ScaleLogarithmic<number, number> | ScaleSymLog<number, number>;\n width: number;\n height: number;\n axisX: AxisSettingsContinuous;\n axisY: AxisSettingsContinuous;\n frameType: FrameType;\n updatingKey?: string;\n}\n\nexport function ContinuousGrid({scaleX, scaleY, width, height, axisX, axisY, frameType, updatingKey = ''}: GridProps) {\n const [ticksX, setTicksX] = useState<number[]>(scaleX.ticks());\n const [ticksY, setTicksY] = useState<number[]>(scaleY.ticks());\n\n const {significantLines: significantLinesX = []} = axisX;\n const {significantLines: significantLinesY = []} = axisY;\n\n useEffect(() => {\n const ticksX = scaleX.ticks().filter(t => !significantLinesX.includes(t));\n const ticksY = scaleY.ticks().filter(t => !significantLinesY.includes(t));\n setTicksX(ticksX);\n setTicksY(ticksY);\n }, [scaleX, scaleY, updatingKey]);\n\n return (\n <g stroke={GRID_GRAY}>\n {axisX.showGrid &&\n ticksX.map((tick) => {\n const x = scaleX(tick);\n return (\n <line key={`x_${x}_${height}`} x1={x} x2={x} y1={0} y2={height} />\n );\n })}\n {axisY.showGrid &&\n ticksY.map(tick => {\n const y = scaleY(tick);\n return (\n <line key={`y_${y}_${width}`} x1={0} x2={width} y1={y} y2={y} />\n );\n })}\n <g strokeDasharray={getLineShape(
|
|
1
|
+
{"version":3,"file":"ContinuousGrid.js","names":[],"sources":["../../src/common/ContinuousGrid.tsx"],"sourcesContent":["import {BLACK, GRID_GRAY} from '../constants';\nimport type {AxisSettingsContinuous, FrameType} from '../types';\nimport {getLineShape} from '../utils/getLineShape';\nimport {numberFormat} from '../utils/numberFormat';\nimport {resolveSignificantLinesStyle} from '../utils/significantLinesStyle';\nimport type {ScaleLinear, ScaleLogarithmic, ScaleSymLog} from 'd3-scale';\nimport React from 'react';\nimport {useEffect, useState} from 'react';\n\nconst GRID_FRAME_WIDTH = 1;\n// Label sits ~11px from the chart edge. Switch to inside placement\n// (`+11`) when the line is too close to the corresponding edge to fit\n// the outward label without clipping.\nconst LABEL_EDGE_OFFSET = 11;\n\ninterface GridProps {\n scaleY: ScaleLinear<number, number> | ScaleLogarithmic<number, number> | ScaleSymLog<number, number>;\n scaleX: ScaleLinear<number, number> | ScaleLogarithmic<number, number> | ScaleSymLog<number, number>;\n width: number;\n height: number;\n axisX: AxisSettingsContinuous;\n axisY: AxisSettingsContinuous;\n frameType: FrameType;\n updatingKey?: string;\n}\n\nexport function ContinuousGrid({scaleX, scaleY, width, height, axisX, axisY, frameType, updatingKey = ''}: GridProps) {\n const [ticksX, setTicksX] = useState<number[]>(scaleX.ticks());\n const [ticksY, setTicksY] = useState<number[]>(scaleY.ticks());\n\n const {significantLines: significantLinesX = []} = axisX;\n const {significantLines: significantLinesY = []} = axisY;\n\n const xStyle = resolveSignificantLinesStyle(axisX.significantLinesStyle, 'x');\n const yStyle = resolveSignificantLinesStyle(axisY.significantLinesStyle, 'y');\n\n useEffect(() => {\n const ticksX = scaleX.ticks().filter(t => !significantLinesX.includes(t));\n const ticksY = scaleY.ticks().filter(t => !significantLinesY.includes(t));\n setTicksX(ticksX);\n setTicksY(ticksY);\n }, [scaleX, scaleY, updatingKey]);\n\n return (\n <g stroke={GRID_GRAY}>\n {axisX.showGrid &&\n ticksX.map((tick) => {\n const x = scaleX(tick);\n return (\n <line key={`x_${x}_${height}`} x1={x} x2={x} y1={0} y2={height} />\n );\n })}\n {axisY.showGrid &&\n ticksY.map(tick => {\n const y = scaleY(tick);\n return (\n <line key={`y_${y}_${width}`} x1={0} x2={width} y1={y} y2={y} />\n );\n })}\n <g strokeDasharray={getLineShape(xStyle.shape)} stroke={BLACK}>\n {significantLinesX.map(v => {\n const x = scaleX(v);\n if (x < 0 || x > width) {\n return null;\n }\n return (\n <line key={`significant_${x}_${height}`} x1={x} x2={x} y1={0} y2={height} />\n );\n })}\n </g>\n {xStyle.showLabel && (\n <g fill={BLACK} fontSize={10} stroke=\"none\">\n {significantLinesX.map(v => {\n const x = scaleX(v);\n if (x < 0 || x > width) {\n return null;\n }\n const anchor = x < 24 ? 'start' : x > width - 24 ? 'end' : 'middle';\n const dx = anchor === 'start' ? 3 : anchor === 'end' ? -3 : 0;\n // 'top' = above plot area, 'bottom' = below.\n const y = xStyle.labelPosition === 'bottom'\n ? height - 3\n : LABEL_EDGE_OFFSET;\n return (\n <text key={`significant_label_${x}`} x={x + dx} y={y} textAnchor={anchor}>\n {numberFormat(v)}\n </text>\n );\n })}\n </g>\n )}\n <g strokeDasharray={getLineShape(yStyle.shape)} stroke={BLACK}>\n {significantLinesY.map(v => {\n const y = scaleY(v);\n if (y < 0 || y > height) {\n return null;\n }\n return (\n <line key={`significant_${y}_${width}`} x1={0} x2={width} y1={y} y2={y} />\n );\n })}\n </g>\n {yStyle.showLabel && (\n <g fill={BLACK} fontSize={10} stroke=\"none\">\n {significantLinesY.map(v => {\n const y = scaleY(v);\n if (y < 0 || y > height) {\n return null;\n }\n // Flip the label below the line when the line is\n // near the top of the chart, so the label is not\n // clipped above y=0. Symmetric for near-bottom.\n const labelY = y < LABEL_EDGE_OFFSET + 3\n ? y + LABEL_EDGE_OFFSET\n : y > height - LABEL_EDGE_OFFSET\n ? y - 3\n : y - 3;\n // 'left' = inside left edge of plot; 'right' =\n // inside right edge.\n const onRight = yStyle.labelPosition === 'right';\n const x = onRight ? width - 4 : 4;\n return (\n <text key={`significant_label_${y}`} x={x} y={labelY} textAnchor={onRight ? 'end' : 'start'}>\n {numberFormat(v)}\n </text>\n );\n })}\n </g>\n )}\n {frameType !== 'empty' && (\n <g strokeWidth={GRID_FRAME_WIDTH}>\n {(axisX.showGrid || frameType !== 'left') && <line stroke={frameType === 'left' ? GRID_GRAY : BLACK} x1=\"0\" x2={width} y1={height} y2={height} />}\n {(axisX.showGrid || frameType !== 'bottom') && <line stroke={frameType === 'bottom' ? GRID_GRAY : BLACK} x1=\"0\" x2=\"0\" y1=\"0\" y2={height} />}\n {(axisX.showGrid || frameType === 'full') && <line stroke={frameType === 'full' ? BLACK : GRID_GRAY} x1={width} x2={width} y1=\"0\" y2={height} />}\n {(axisY.showGrid || frameType === 'full') && <line stroke={frameType === 'full' ? BLACK : GRID_GRAY} x1=\"0\" x2={width} y1=\"0\" y2=\"0\" />}\n </g>\n )}\n </g>\n );\n}\n"],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ChartRenderer.d.ts","sourceRoot":"","sources":["../../src/histogram/ChartRenderer.tsx"],"names":[],"mappings":"AAEA,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,EAAY,MAAM,cAAc,CAAC;AAIxD,OAAO,KAAK,EAAW,UAAU,EAA+C,MAAM,UAAU,CAAC;AAKjG,OAAO,KAAK,EAAE,aAAa,EAAE,mBAAmB,EAAe,UAAU,EAAE,YAAY,EAAE,mBAAmB,EAAE,OAAO,EAAE,MAAM,oBAAoB,CAAC;AAQlJ,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,oBAAoB,CAAC;AAC/D,OAAO,KAAK,EAAE,cAAc,EAAE,qBAAqB,EAAE,MAAM,yBAAyB,CAAC;AA8FrF,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,OAAO,EAAE,OAAO,CAKd;IACF,gBAAgB,EAAE,MAAM,CAAC,MAAM,EAAE,mBAAmB,CAAC,CAAM;IAC3D,UAAU,EAAE,UAAU,CAOpB;IACF,YAAY,SAAK;IACjB,SAAS,SAAK;IACd,MAAM,EAAE,YAAY,CAGlB;IACF,aAAa,EAAE,aAAa,CAG1B;IACF,WAAW,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,EAAE,CAAC,CAAM;IAC3C,SAAS,EAAE,MAAM,EAAE,CAAM;IACzB,MAAM,EAAE,UAAU,CAIhB;IAEF,KAAK;IAaL,IAAI,CAAC,IAAI,EAAE,WAAW;IAStB,gBAAgB,CAAC,IAAI,EAAE,qBAAqB,CAAC,eAAe,CAAC,CAAC,MAAM,CAAC;IAKrE,qBAAqB,CACjB,SAAS,EAAE,MAAM,EAAE,EACnB,aAAa,EAAE,qBAAqB,CAAC,eAAe,CAAC,EACrD,KAAK,EAAE,qBAAqB,CAAC,eAAe,CAAC,CAAC,OAAO,CAAC,EACtD,KAAK,EAAE,qBAAqB,CAAC,eAAe,CAAC,CAAC,OAAO,CAAC;IA8C1D,cAAc,CACV,SAAS,EAAE,MAAM,EAAE,EACnB,aAAa,EAAE,qBAAqB,CAAC,eAAe,CAAC,EACrD,KAAK,EAAE,qBAAqB,CAAC,eAAe,CAAC,CAAC,OAAO,CAAC,EACtD,KAAK,EAAE,qBAAqB,CAAC,eAAe,CAAC,CAAC,OAAO,CAAC,EACtD,qBAAqB,EAAE,MAAM,CAAC,MAAM,EAAE,oBAAoB,CAAC,EAC3D,IAAI,EAAE,qBAAqB,CAAC,eAAe,CAAC,CAAC,MAAM,CAAC,EACpD,aAAa,EAAE,qBAAqB,CAAC,eAAe,CAAC;
|
|
1
|
+
{"version":3,"file":"ChartRenderer.d.ts","sourceRoot":"","sources":["../../src/histogram/ChartRenderer.tsx"],"names":[],"mappings":"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"}
|
|
@@ -135,6 +135,12 @@ var S = class {
|
|
|
135
135
|
}, {});
|
|
136
136
|
e.forEach((e) => {
|
|
137
137
|
let r = n.scale === "log" ? d() : l(), i = h[e], a = t.sharedX ? f : i.minX, o = t.sharedX ? p : i.maxX;
|
|
138
|
+
n.lowerValue !== void 0 && (a = Math.max(a, n.lowerValue)), n.upperValue !== void 0 && (o = Math.min(o, n.upperValue));
|
|
139
|
+
let s = n.significantLines ?? [];
|
|
140
|
+
if (s.length && o > a) {
|
|
141
|
+
let e = (o - a) * .05;
|
|
142
|
+
for (let t of s) t < a && (a = t - e), t > o && (o = t + e);
|
|
143
|
+
}
|
|
138
144
|
r.domain([a, o]).range([0, this.chartSizes.chartWidth]), this.scales.x[e] = r;
|
|
139
145
|
}), e.forEach((e) => {
|
|
140
146
|
let n = r.scale === "log" ? d() : l(), i = h[e], o = t.sharedY ? m : i.maxY, s = [this.chartSizes.chartHeight, 0], c = n.copy().domain([0, o]).range([this.chartSizes.chartHeight, a.innerOffset]);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ChartRenderer.js","names":[],"sources":["../../src/histogram/ChartRenderer.tsx"],"sourcesContent":["import type { ScaleLogarithmic, ScaleOrdinal } from 'd3-scale';\nimport { scaleLinear, scaleOrdinal, scaleSymlog } from 'd3-scale';\nimport type { ReactElement } from 'react';\nimport type { Root } from 'react-dom/client';\nimport { createRoot } from 'react-dom/client';\nimport { Error } from '../common/Error';\nimport type { LegendData, LegendItem } from '../common/types';\nimport { DataFrameProvider } from '../common/useDataFrame';\nimport { DEFAULT_HEIGHT, DEFAULT_WIDTH, TITLE_LINE_HEIGHT, TITLE_MARGIN } from '../constants';\nimport type { DataFrame, RowIndex } from '../DataFrame';\nimport { splitTextByWidth } from '../discrete/utils';\nimport { DEFAULT_COMMON_AES, LEGEND_OFFSET } from '../scatterplot/constants';\nimport { getTicksAndFormat } from '../scatterplot/utils/getTicksAndFormat';\nimport type { AesItem, ColumnName, ContinuousAesHistogram, InheritAesHistogram } from '../types';\nimport { arrangeLegendParts } from '../utils/arrangeLegendParts';\nimport { getContinuousColorScale } from '../utils/getContinuousColorScale';\nimport { TextMeasurer } from '../utils/TextMeasurer/TextMeasurer';\nimport { ChartsGroup } from './components/ChartsGroup';\nimport type { CaptionsSizes, ChartDimensionsData, ChartScales, ChartSizes, ChartsScales, HistogramLegendInfo, Margins } from './components/types';\nimport {\n DEFAULT_TICKS_SIZE, FACET_TITLE_LINE, FACET_TITLE_OFFSET,\n MIN_MARGIN,\n MIN_PADDING,\n TICK_OFFSET,\n TITLE_LINE\n} from './constants';\nimport type { GroupedHistogramData } from './getHistogramData';\nimport type { HistogramLayer, HistogramSettingsImpl } from './HistogramSettingsImpl';\n\nfunction getChartEdgeSides(index: number, facetsCount: number, columnsCount: number, rowsCount: number) {\n const chartSides: ('left' | 'right' | 'top' | 'bottom')[] = [];\n if (index % columnsCount === columnsCount - 1) {\n chartSides.push('right');\n }\n if (index % columnsCount === 0) {\n chartSides.push('left');\n }\n if (index < columnsCount) {\n chartSides.push('top');\n }\n if (\n Math.ceil((index + 1) / columnsCount) === rowsCount ||\n (Math.ceil((index + 1) / columnsCount) === rowsCount - 1 &&\n index % columnsCount > (facetsCount - 1) % columnsCount)\n ) {\n chartSides.push('bottom');\n }\n return chartSides;\n}\n\nfunction calculatePaddings(\n xAxis: HistogramSettingsImpl['chartSettings']['xAxis'],\n yAxis: HistogramSettingsImpl['chartSettings']['yAxis'],\n captionsSizes: CaptionsSizes,\n currentRowFacetKeys: string[],\n facetTitles: Record<string, string[]>,\n chartEdgeSides: ('left' | 'right' | 'top' | 'bottom')[],\n lastInRow: boolean,\n facetSettings?: HistogramSettingsImpl['facetSettings']\n) {\n const needLeftAxis = chartEdgeSides.includes('left') || !facetSettings?.sharedY;\n const needBottomAxis = chartEdgeSides.includes('bottom') || !facetSettings?.sharedX;\n const needBottomAxisTitle = chartEdgeSides.includes('bottom') && xAxis.title !== '';\n\n const yCaptions = captionsSizes.yAxisCaptionsWidth + 2 * TICK_OFFSET;\n const yTicks = (yAxis.showTicks ? DEFAULT_TICKS_SIZE : 0) + (yAxis.hiddenLabels ? 0 : TICK_OFFSET);\n\n const xCaptions = captionsSizes.xAxisCaptionsWidth + 2 * TICK_OFFSET;\n const xTicks = (xAxis.showTicks ? DEFAULT_TICKS_SIZE : 0) + (xAxis.hiddenLabels ? 0 : TICK_OFFSET);\n const xAxisTitle = needBottomAxisTitle ? TITLE_LINE : 0;\n\n const leftAxisElements = yCaptions + yTicks;\n const bottomAxisElements = xTicks + xCaptions + xAxisTitle;\n\n const facetTitlesLinesCount = Math.max(...currentRowFacetKeys.map(key => facetTitles[key].length));\n return {\n left: needLeftAxis ? leftAxisElements : MIN_PADDING,\n top: facetTitlesLinesCount === 0 ? 0 : FACET_TITLE_OFFSET * 2 + facetTitlesLinesCount * FACET_TITLE_LINE,\n bottom: needBottomAxis ? bottomAxisElements + 8 : MIN_PADDING,\n right: lastInRow ? 0 : MIN_PADDING,\n };\n}\n\n// facet keys grouped by rows\nfunction getFacetRows(facetKeys: string[], nRows: number, nColumns: number): string[][] {\n const result: string[][] = [];\n for (let i = 0; i < nRows; i++) {\n result.push(facetKeys.slice(i * nColumns, i * nColumns + nColumns));\n }\n return result;\n}\n\nfunction getRowColumn(idx: number, columnsCount: number) {\n const row = Math.floor(idx / columnsCount);\n const column = idx - row * columnsCount;\n return [row, column];\n}\n\nfunction isInheritedAes(v: InheritAesHistogram | unknown): v is InheritAesHistogram {\n return typeof v === 'object' && v !== null && 'type' in v && 'value' in v && v.type === 'grouping';\n}\nfunction isContinuousAes(v: ContinuousAesHistogram | unknown): v is ContinuousAesHistogram {\n return typeof v === 'object' && v !== null && 'range' in v;\n}\nfunction createAesGetter(dataFrame: DataFrame, aesData: HistogramSettingsImpl['inheritedAes'], field: keyof AesItem, defaultDomain:number[]) {\n return function (aesItem: string | InheritAesHistogram | ContinuousAesHistogram, idx: RowIndex, height:number) {\n if (isContinuousAes(aesItem)) {\n const {domain = defaultDomain, range, type = 'linear'} = aesItem;\n const scale = getContinuousColorScale(range as string[], domain, type);\n scale.clamp(true);\n return scale(height);\n }\n if (isInheritedAes(aesItem)) {\n const columnId = aesItem.value;\n const mapping = aesData[columnId];\n return (mapping?.[String(dataFrame.getColumnValue(columnId, idx))] ?? DEFAULT_COMMON_AES)?.[field] as string;\n }\n return aesItem;\n };\n}\n\nclass ChartRenderer {\n reactRoot: Root | null = null;\n parentNode: HTMLElement | null = null;\n rootNode: HTMLElement | null = null;\n component: ReactElement = (<></>);\n margins: Margins = {\n top: MIN_MARGIN,\n bottom: MIN_MARGIN,\n left: MIN_MARGIN,\n right: MIN_MARGIN,\n };\n chartsDimensions: Record<string, ChartDimensionsData> = {};\n chartSizes: ChartSizes = {\n chartWidth: DEFAULT_WIDTH, // width of single chart\n chartHeight: DEFAULT_HEIGHT, // height of single chart\n chartsWidth: DEFAULT_WIDTH, // width of all charts in charts row\n chartsHeight: DEFAULT_HEIGHT, // width of all charts in charts column, without axes\n totalWidth: DEFAULT_WIDTH, // width of all charts in charts row, plus left axis, plus legend\n totalHeight: DEFAULT_HEIGHT, // width of all charts in charts height, plus bottom axis, plus top title\n };\n columnsCount = 1;\n rowsCount = 1;\n scales: ChartsScales = {\n x: {null: scaleLinear().domain([0, 10]).range([0, DEFAULT_WIDTH])},\n y: {null: scaleLinear().domain([0, 10]).range([DEFAULT_HEIGHT, 0])},\n };\n captionsSizes: CaptionsSizes = {\n xAxisCaptionsWidth: 30,\n yAxisCaptionsWidth: 100,\n };\n facetTitles: Record<string, string[]> = {}; // can be multiline\n mainTitle: string[] = []; // can be multiline\n legend: LegendData = {\n width: 0,\n height: 0,\n items: [],\n };\n\n clear() {\n if (this.parentNode && this.rootNode) {\n this.parentNode?.removeChild(this.rootNode);\n this.parentNode = null;\n this.rootNode = null;\n }\n // timeout to avoid trying to unmount during rendering\n setTimeout(() => {\n this.reactRoot?.unmount();\n this.reactRoot = null;\n });\n }\n\n init(node: HTMLElement) {\n if (this.parentNode === null) {\n this.parentNode = node;\n this.rootNode = document.createElement('div');\n this.parentNode.appendChild(this.rootNode);\n this.reactRoot = createRoot(this.rootNode);\n }\n }\n\n updateChartSizes(size: HistogramSettingsImpl['chartSettings']['size']) {\n this.chartSizes.chartWidth = size.width;\n this.chartSizes.chartHeight = size.height;\n }\n\n updateChartDimensions(\n facetKeys: string[],\n facetSettings: HistogramSettingsImpl['facetSettings'],\n xAxis: HistogramSettingsImpl['chartSettings']['xAxis'],\n yAxis: HistogramSettingsImpl['chartSettings']['yAxis']\n ) {\n const {chartWidth, chartHeight} = this.chartSizes;\n let currentLeft = 0;\n let currentTop = 0;\n this.chartsDimensions = facetKeys.reduce((res: Record<string, ChartDimensionsData>, key: string, index) => {\n const [currentRow, currentColumn] = getRowColumn(index, this.columnsCount);\n const chartEdgeSides = getChartEdgeSides(index, facetKeys.length, this.columnsCount, this.rowsCount);\n const padding = calculatePaddings(\n xAxis,\n yAxis,\n this.captionsSizes,\n getFacetRows(facetKeys, this.rowsCount, this.columnsCount)[currentRow],\n this.facetTitles,\n chartEdgeSides,\n currentColumn === this.columnsCount - 1,\n facetSettings\n );\n const outerWidth = chartWidth + padding.left + padding.right;\n const outerHeight = chartHeight + padding.top + padding.bottom;\n res[key] = {\n left: currentLeft,\n top: currentTop,\n chartEdgeSides,\n padding,\n inner: {width: chartWidth, height: chartHeight},\n outer: {width: outerWidth, height: outerHeight},\n };\n currentLeft += outerWidth;\n if (currentColumn === this.columnsCount - 1) {\n currentLeft = 0;\n currentTop += outerHeight;\n }\n return res;\n }, {});\n\n const chartsWidth = Math.max(\n ...facetKeys.map(key => this.chartsDimensions[key].outer.width + this.chartsDimensions[key].left)\n );\n const chartsHeight = Math.max(\n ...facetKeys.map(key => this.chartsDimensions[key].outer.height + this.chartsDimensions[key].top)\n );\n this.chartSizes.chartsWidth = chartsWidth;\n this.chartSizes.chartsHeight = chartsHeight;\n }\n\n updateViewport(\n facetKeys: string[],\n facetSettings: HistogramSettingsImpl['facetSettings'],\n xAxis: HistogramSettingsImpl['chartSettings']['xAxis'],\n yAxis: HistogramSettingsImpl['chartSettings']['yAxis'],\n histogramDataByFacets: Record<string, GroupedHistogramData>,\n size: HistogramSettingsImpl['chartSettings']['size'],\n groupingStack: HistogramSettingsImpl['groupingStack'],\n ) {\n const facetCount = facetKeys.length;\n const maxNRows = Math.min(facetSettings.nRows ?? facetCount, facetCount);\n const maxNCols = Math.min(facetSettings.nCols ?? facetCount, facetCount);\n // Use columns/rows count from settings if some of them defined, else make 1 column\n this.columnsCount = facetSettings.nRows ? Math.ceil(facetCount / maxNRows) : maxNCols;\n this.rowsCount = Math.ceil(facetCount / this.columnsCount);\n\n let [minXAll, maxXAll] = [Infinity, -Infinity];\n let maxYAll = -Infinity;\n const histogramExtentsByKeys = facetKeys.reduce((res: Record<string, Record<string, number>>, key) => {\n const histogramData = histogramDataByFacets[key];\n const {minX, maxX, maxCount, maxCountFromGroups} = histogramData;\n minXAll = Math.min(minXAll, minX);\n maxXAll = Math.max(maxXAll, maxX);\n maxYAll = Math.max(maxYAll, groupingStack === 'vertical' ? maxCount : maxCountFromGroups);\n res[key] = {minX, maxX, maxY: groupingStack === 'vertical' ? maxCount : maxCountFromGroups};\n return res;\n }, {});\n\n facetKeys.forEach(key => {\n const scaleX: ChartScales['x'] = xAxis.scale === 'log' ? scaleSymlog() : scaleLinear();\n\n const extents = histogramExtentsByKeys[key];\n const minX = facetSettings.sharedX ? minXAll : extents.minX;\n const maxX = facetSettings.sharedX ? maxXAll : extents.maxX;\n\n (scaleX.domain([minX, maxX]) as ChartScales['x']).range([0, this.chartSizes.chartWidth]);\n this.scales.x[key] = scaleX;\n });\n facetKeys.forEach(key => {\n const scaleY = yAxis.scale === 'log' ? scaleSymlog() : scaleLinear();\n const extents = histogramExtentsByKeys[key];\n\n const minY = 0;\n const maxY = facetSettings.sharedY ? maxYAll : extents.maxY;\n\n const rangeV = [this.chartSizes.chartHeight, 0];\n // supporting scale, it needs to add offsets of fixed size in pixels to general scale Y\n const tempY: ChartScales['y'] = (scaleY.copy().domain([minY, maxY]) as ChartScales['y']).range([\n this.chartSizes.chartHeight,\n size.innerOffset,\n ]) as ChartScales['y'];\n (scaleY.domain([tempY.invert(this.chartSizes.chartHeight), tempY.invert(0)]) as ChartScales['y']).range(\n rangeV\n );\n this.scales.y[key] = scaleY;\n });\n }\n\n updateCaptionsSize(\n xAxis: HistogramSettingsImpl['chartSettings']['xAxis'],\n yAxis: HistogramSettingsImpl['chartSettings']['yAxis']\n ) {\n const textMeasurer = new TextMeasurer('600 14px Arial');\n\n let maxYTick = 0;\n\n function getMaxTickWidth(ticks: string[]) {\n return Math.max(...ticks.map(key => textMeasurer.getTextWidth(key)));\n }\n\n if (!yAxis.hiddenLabels) {\n Object.values(this.scales.y).forEach(scale => {\n const {ticks, format} = getTicksAndFormat(scale as ScaleLogarithmic<number, number>, false);\n maxYTick = Math.max(maxYTick, getMaxTickWidth(ticks.map(format)));\n });\n }\n this.captionsSizes = {\n xAxisCaptionsWidth: xAxis.hiddenLabels ? 0 : 20,\n yAxisCaptionsWidth: maxYTick,\n };\n }\n\n createMainTitle(facetKeys: string[], title: HistogramSettingsImpl['chartSettings']['title']) {\n const firstChart = this.chartsDimensions[facetKeys[0]];\n const lastChart = this.chartsDimensions[facetKeys[facetKeys.length - 1]];\n\n this.mainTitle = splitTextByWidth(\n title.name,\n this.chartSizes.chartsWidth - firstChart.padding.left - lastChart.padding.right,\n 20\n );\n }\n\n createFacetTitles(facetKeys: string[], facetLabels: string[][]) {\n this.facetTitles = facetKeys.reduce((res: Record<string, string[]>, key, idx) => {\n if (facetLabels[idx].length === 1 && facetLabels[idx][0] === 'null') {\n res[key] = [];\n } else {\n res[key] = splitTextByWidth(facetLabels[idx].join(', '), this.chartSizes.chartWidth, 14);\n }\n return res;\n }, {});\n }\n\n updateLegendSize(\n legend: HistogramSettingsImpl['chartSettings']['legend'],\n legendInfo: HistogramLegendInfo,\n grouping: ColumnName | null,\n layers: HistogramLayer[]\n ) {\n if (!legend.show) {\n this.legend = {width: 0, height: 0, items: []};\n return;\n }\n\n const legendItems: LegendItem[] = [];\n const emptySizes = {width:0, height:0, left:0, top: 0};\n\n layers.forEach(layer => {\n if (isInheritedAes(layer.aes.fillColor) && grouping) {\n const columnId = layer.aes.fillColor.value;\n const info = legendInfo[grouping.value];\n const title = grouping.label ?? grouping.value;\n const scale:ScaleOrdinal<string, string> = scaleOrdinal<string, string>()\n .domain(info.values)\n .range(info.values.map(value => info.aesMap[value]?.fillColor ?? DEFAULT_COMMON_AES.fillColor));\n legendItems.push({...emptySizes, id: columnId, type: 'discreteColor', title, scale, values: info.values, labels: info.labels});\n }\n });\n\n if (!legendItems.length) {\n this.legend = {width: 0, height: 0, items: []};\n return;\n }\n\n const items = arrangeLegendParts(legendItems, this.chartSizes.chartHeight);\n\n const maxRightEdge = items.reduce((max, item) => Math.max(max, item.left + item.width), 0);\n const legendWidth = maxRightEdge + LEGEND_OFFSET;\n const legendHeight = this.chartSizes.chartHeight;\n\n this.legend = {\n width: legendWidth,\n height: legendHeight,\n items,\n };\n }\n\n updateMargins(size:HistogramSettingsImpl['chartSettings']['size']) {\n const titleTextHeight = TITLE_LINE_HEIGHT * this.mainTitle.length;\n const titleHeight = titleTextHeight > 0 ? titleTextHeight + TITLE_MARGIN * 2 : 0;\n\n const minMargin = size.outerOffset;\n\n this.margins = {\n top: Math.max(titleHeight, minMargin),\n bottom: minMargin,\n left: minMargin,\n right: this.legend.width + minMargin,\n };\n this.chartSizes.totalWidth = this.margins.left + this.chartSizes.chartsWidth + this.margins.right;\n this.chartSizes.totalHeight = this.margins.top + this.chartSizes.chartsHeight + this.margins.bottom;\n }\n\n render(\n dataFrame: DataFrame,\n settingsId: string,\n chartSettings: HistogramSettingsImpl['chartSettings'],\n facetSettings: HistogramSettingsImpl['facetSettings'],\n facetKeys: string[],\n facetLabels: string[][],\n histogramDataByFacets: Record<string, GroupedHistogramData>,\n legendInfo: HistogramLegendInfo,\n layers: HistogramLayer[],\n inheritedAes: HistogramSettingsImpl['inheritedAes'],\n grouping: ColumnName | null,\n groupingStack: HistogramSettingsImpl['groupingStack'],\n groupingDirection: HistogramSettingsImpl['groupingDirection'],\n onTooltipHintSwitch: (v:boolean) => void,\n ) {\n const {xAxis, yAxis, size, title} = chartSettings;\n this.updateChartSizes(size);\n this.updateViewport(facetKeys, facetSettings, xAxis, yAxis, histogramDataByFacets, size, groupingStack);\n this.updateCaptionsSize(xAxis, yAxis);\n this.createFacetTitles(facetKeys, facetLabels);\n this.updateChartDimensions(facetKeys, facetSettings, xAxis, yAxis);\n this.createMainTitle(facetKeys, title);\n this.updateLegendSize(chartSettings.legend, legendInfo, grouping, layers);\n this.updateMargins(size);\n const minHeight = facetKeys.reduce((v, key) => {\n return Math.min(v, histogramDataByFacets[key].minX);\n }, Infinity);\n const maxHeight = facetKeys.reduce((v, key) => {\n return Math.max(v, histogramDataByFacets[key].maxX);\n }, -Infinity);\n const component = (\n <DataFrameProvider dataFrame={dataFrame}>\n <ChartsGroup\n settingsId={settingsId}\n chartSettings={chartSettings}\n facetKeys={facetKeys}\n facetSettings={facetSettings}\n chartSizes={this.chartSizes}\n chartsDimensions={this.chartsDimensions}\n scales={this.scales}\n columnsCount={this.columnsCount}\n margins={this.margins}\n mainTitle={this.mainTitle}\n facetTitles={this.facetTitles}\n captionsSizes={this.captionsSizes}\n histogramDataByFacets={histogramDataByFacets}\n layers={layers}\n aesColorGetter={createAesGetter(dataFrame, inheritedAes, 'fillColor', [minHeight, maxHeight])}\n groupingDirection={groupingDirection}\n groupingStack={groupingStack}\n groupingLabels={grouping ? legendInfo[grouping.value].labels : {}}\n legend={this.legend}\n onTooltipHintSwitch={onTooltipHintSwitch}\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/histogram/ChartRenderer.tsx"],"sourcesContent":["import type { ScaleLogarithmic, ScaleOrdinal } from 'd3-scale';\nimport { scaleLinear, scaleOrdinal, scaleSymlog } from 'd3-scale';\nimport type { ReactElement } from 'react';\nimport type { Root } from 'react-dom/client';\nimport { createRoot } from 'react-dom/client';\nimport { Error } from '../common/Error';\nimport type { LegendData, LegendItem } from '../common/types';\nimport { DataFrameProvider } from '../common/useDataFrame';\nimport { DEFAULT_HEIGHT, DEFAULT_WIDTH, TITLE_LINE_HEIGHT, TITLE_MARGIN } from '../constants';\nimport type { DataFrame, RowIndex } from '../DataFrame';\nimport { splitTextByWidth } from '../discrete/utils';\nimport { DEFAULT_COMMON_AES, LEGEND_OFFSET } from '../scatterplot/constants';\nimport { getTicksAndFormat } from '../scatterplot/utils/getTicksAndFormat';\nimport type { AesItem, ColumnName, ContinuousAesHistogram, InheritAesHistogram } from '../types';\nimport { arrangeLegendParts } from '../utils/arrangeLegendParts';\nimport { getContinuousColorScale } from '../utils/getContinuousColorScale';\nimport { TextMeasurer } from '../utils/TextMeasurer/TextMeasurer';\nimport { ChartsGroup } from './components/ChartsGroup';\nimport type { CaptionsSizes, ChartDimensionsData, ChartScales, ChartSizes, ChartsScales, HistogramLegendInfo, Margins } from './components/types';\nimport {\n DEFAULT_TICKS_SIZE, FACET_TITLE_LINE, FACET_TITLE_OFFSET,\n MIN_MARGIN,\n MIN_PADDING,\n TICK_OFFSET,\n TITLE_LINE\n} from './constants';\nimport type { GroupedHistogramData } from './getHistogramData';\nimport type { HistogramLayer, HistogramSettingsImpl } from './HistogramSettingsImpl';\n\nfunction getChartEdgeSides(index: number, facetsCount: number, columnsCount: number, rowsCount: number) {\n const chartSides: ('left' | 'right' | 'top' | 'bottom')[] = [];\n if (index % columnsCount === columnsCount - 1) {\n chartSides.push('right');\n }\n if (index % columnsCount === 0) {\n chartSides.push('left');\n }\n if (index < columnsCount) {\n chartSides.push('top');\n }\n if (\n Math.ceil((index + 1) / columnsCount) === rowsCount ||\n (Math.ceil((index + 1) / columnsCount) === rowsCount - 1 &&\n index % columnsCount > (facetsCount - 1) % columnsCount)\n ) {\n chartSides.push('bottom');\n }\n return chartSides;\n}\n\nfunction calculatePaddings(\n xAxis: HistogramSettingsImpl['chartSettings']['xAxis'],\n yAxis: HistogramSettingsImpl['chartSettings']['yAxis'],\n captionsSizes: CaptionsSizes,\n currentRowFacetKeys: string[],\n facetTitles: Record<string, string[]>,\n chartEdgeSides: ('left' | 'right' | 'top' | 'bottom')[],\n lastInRow: boolean,\n facetSettings?: HistogramSettingsImpl['facetSettings']\n) {\n const needLeftAxis = chartEdgeSides.includes('left') || !facetSettings?.sharedY;\n const needBottomAxis = chartEdgeSides.includes('bottom') || !facetSettings?.sharedX;\n const needBottomAxisTitle = chartEdgeSides.includes('bottom') && xAxis.title !== '';\n\n const yCaptions = captionsSizes.yAxisCaptionsWidth + 2 * TICK_OFFSET;\n const yTicks = (yAxis.showTicks ? DEFAULT_TICKS_SIZE : 0) + (yAxis.hiddenLabels ? 0 : TICK_OFFSET);\n\n const xCaptions = captionsSizes.xAxisCaptionsWidth + 2 * TICK_OFFSET;\n const xTicks = (xAxis.showTicks ? DEFAULT_TICKS_SIZE : 0) + (xAxis.hiddenLabels ? 0 : TICK_OFFSET);\n const xAxisTitle = needBottomAxisTitle ? TITLE_LINE : 0;\n\n const leftAxisElements = yCaptions + yTicks;\n const bottomAxisElements = xTicks + xCaptions + xAxisTitle;\n\n const facetTitlesLinesCount = Math.max(...currentRowFacetKeys.map(key => facetTitles[key].length));\n return {\n left: needLeftAxis ? leftAxisElements : MIN_PADDING,\n top: facetTitlesLinesCount === 0 ? 0 : FACET_TITLE_OFFSET * 2 + facetTitlesLinesCount * FACET_TITLE_LINE,\n bottom: needBottomAxis ? bottomAxisElements + 8 : MIN_PADDING,\n right: lastInRow ? 0 : MIN_PADDING,\n };\n}\n\n// facet keys grouped by rows\nfunction getFacetRows(facetKeys: string[], nRows: number, nColumns: number): string[][] {\n const result: string[][] = [];\n for (let i = 0; i < nRows; i++) {\n result.push(facetKeys.slice(i * nColumns, i * nColumns + nColumns));\n }\n return result;\n}\n\nfunction getRowColumn(idx: number, columnsCount: number) {\n const row = Math.floor(idx / columnsCount);\n const column = idx - row * columnsCount;\n return [row, column];\n}\n\nfunction isInheritedAes(v: InheritAesHistogram | unknown): v is InheritAesHistogram {\n return typeof v === 'object' && v !== null && 'type' in v && 'value' in v && v.type === 'grouping';\n}\nfunction isContinuousAes(v: ContinuousAesHistogram | unknown): v is ContinuousAesHistogram {\n return typeof v === 'object' && v !== null && 'range' in v;\n}\nfunction createAesGetter(dataFrame: DataFrame, aesData: HistogramSettingsImpl['inheritedAes'], field: keyof AesItem, defaultDomain:number[]) {\n return function (aesItem: string | InheritAesHistogram | ContinuousAesHistogram, idx: RowIndex, height:number) {\n if (isContinuousAes(aesItem)) {\n const {domain = defaultDomain, range, type = 'linear'} = aesItem;\n const scale = getContinuousColorScale(range as string[], domain, type);\n scale.clamp(true);\n return scale(height);\n }\n if (isInheritedAes(aesItem)) {\n const columnId = aesItem.value;\n const mapping = aesData[columnId];\n return (mapping?.[String(dataFrame.getColumnValue(columnId, idx))] ?? DEFAULT_COMMON_AES)?.[field] as string;\n }\n return aesItem;\n };\n}\n\nclass ChartRenderer {\n reactRoot: Root | null = null;\n parentNode: HTMLElement | null = null;\n rootNode: HTMLElement | null = null;\n component: ReactElement = (<></>);\n margins: Margins = {\n top: MIN_MARGIN,\n bottom: MIN_MARGIN,\n left: MIN_MARGIN,\n right: MIN_MARGIN,\n };\n chartsDimensions: Record<string, ChartDimensionsData> = {};\n chartSizes: ChartSizes = {\n chartWidth: DEFAULT_WIDTH, // width of single chart\n chartHeight: DEFAULT_HEIGHT, // height of single chart\n chartsWidth: DEFAULT_WIDTH, // width of all charts in charts row\n chartsHeight: DEFAULT_HEIGHT, // width of all charts in charts column, without axes\n totalWidth: DEFAULT_WIDTH, // width of all charts in charts row, plus left axis, plus legend\n totalHeight: DEFAULT_HEIGHT, // width of all charts in charts height, plus bottom axis, plus top title\n };\n columnsCount = 1;\n rowsCount = 1;\n scales: ChartsScales = {\n x: {null: scaleLinear().domain([0, 10]).range([0, DEFAULT_WIDTH])},\n y: {null: scaleLinear().domain([0, 10]).range([DEFAULT_HEIGHT, 0])},\n };\n captionsSizes: CaptionsSizes = {\n xAxisCaptionsWidth: 30,\n yAxisCaptionsWidth: 100,\n };\n facetTitles: Record<string, string[]> = {}; // can be multiline\n mainTitle: string[] = []; // can be multiline\n legend: LegendData = {\n width: 0,\n height: 0,\n items: [],\n };\n\n clear() {\n if (this.parentNode && this.rootNode) {\n this.parentNode?.removeChild(this.rootNode);\n this.parentNode = null;\n this.rootNode = null;\n }\n // timeout to avoid trying to unmount during rendering\n setTimeout(() => {\n this.reactRoot?.unmount();\n this.reactRoot = null;\n });\n }\n\n init(node: HTMLElement) {\n if (this.parentNode === null) {\n this.parentNode = node;\n this.rootNode = document.createElement('div');\n this.parentNode.appendChild(this.rootNode);\n this.reactRoot = createRoot(this.rootNode);\n }\n }\n\n updateChartSizes(size: HistogramSettingsImpl['chartSettings']['size']) {\n this.chartSizes.chartWidth = size.width;\n this.chartSizes.chartHeight = size.height;\n }\n\n updateChartDimensions(\n facetKeys: string[],\n facetSettings: HistogramSettingsImpl['facetSettings'],\n xAxis: HistogramSettingsImpl['chartSettings']['xAxis'],\n yAxis: HistogramSettingsImpl['chartSettings']['yAxis']\n ) {\n const {chartWidth, chartHeight} = this.chartSizes;\n let currentLeft = 0;\n let currentTop = 0;\n this.chartsDimensions = facetKeys.reduce((res: Record<string, ChartDimensionsData>, key: string, index) => {\n const [currentRow, currentColumn] = getRowColumn(index, this.columnsCount);\n const chartEdgeSides = getChartEdgeSides(index, facetKeys.length, this.columnsCount, this.rowsCount);\n const padding = calculatePaddings(\n xAxis,\n yAxis,\n this.captionsSizes,\n getFacetRows(facetKeys, this.rowsCount, this.columnsCount)[currentRow],\n this.facetTitles,\n chartEdgeSides,\n currentColumn === this.columnsCount - 1,\n facetSettings\n );\n const outerWidth = chartWidth + padding.left + padding.right;\n const outerHeight = chartHeight + padding.top + padding.bottom;\n res[key] = {\n left: currentLeft,\n top: currentTop,\n chartEdgeSides,\n padding,\n inner: {width: chartWidth, height: chartHeight},\n outer: {width: outerWidth, height: outerHeight},\n };\n currentLeft += outerWidth;\n if (currentColumn === this.columnsCount - 1) {\n currentLeft = 0;\n currentTop += outerHeight;\n }\n return res;\n }, {});\n\n const chartsWidth = Math.max(\n ...facetKeys.map(key => this.chartsDimensions[key].outer.width + this.chartsDimensions[key].left)\n );\n const chartsHeight = Math.max(\n ...facetKeys.map(key => this.chartsDimensions[key].outer.height + this.chartsDimensions[key].top)\n );\n this.chartSizes.chartsWidth = chartsWidth;\n this.chartSizes.chartsHeight = chartsHeight;\n }\n\n updateViewport(\n facetKeys: string[],\n facetSettings: HistogramSettingsImpl['facetSettings'],\n xAxis: HistogramSettingsImpl['chartSettings']['xAxis'],\n yAxis: HistogramSettingsImpl['chartSettings']['yAxis'],\n histogramDataByFacets: Record<string, GroupedHistogramData>,\n size: HistogramSettingsImpl['chartSettings']['size'],\n groupingStack: HistogramSettingsImpl['groupingStack'],\n ) {\n const facetCount = facetKeys.length;\n const maxNRows = Math.min(facetSettings.nRows ?? facetCount, facetCount);\n const maxNCols = Math.min(facetSettings.nCols ?? facetCount, facetCount);\n // Use columns/rows count from settings if some of them defined, else make 1 column\n this.columnsCount = facetSettings.nRows ? Math.ceil(facetCount / maxNRows) : maxNCols;\n this.rowsCount = Math.ceil(facetCount / this.columnsCount);\n\n let [minXAll, maxXAll] = [Infinity, -Infinity];\n let maxYAll = -Infinity;\n const histogramExtentsByKeys = facetKeys.reduce((res: Record<string, Record<string, number>>, key) => {\n const histogramData = histogramDataByFacets[key];\n const {minX, maxX, maxCount, maxCountFromGroups} = histogramData;\n minXAll = Math.min(minXAll, minX);\n maxXAll = Math.max(maxXAll, maxX);\n maxYAll = Math.max(maxYAll, groupingStack === 'vertical' ? maxCount : maxCountFromGroups);\n res[key] = {minX, maxX, maxY: groupingStack === 'vertical' ? maxCount : maxCountFromGroups};\n return res;\n }, {});\n\n facetKeys.forEach(key => {\n const scaleX: ChartScales['x'] = xAxis.scale === 'log' ? scaleSymlog() : scaleLinear();\n\n const extents = histogramExtentsByKeys[key];\n let minX = facetSettings.sharedX ? minXAll : extents.minX;\n let maxX = facetSettings.sharedX ? maxXAll : extents.maxX;\n // Hard bounds: narrow the data-derived range so values outside\n // [lowerValue, upperValue] are clipped from the visible domain.\n if (xAxis.lowerValue !== undefined) minX = Math.max(minX, xAxis.lowerValue);\n if (xAxis.upperValue !== undefined) maxX = Math.min(maxX, xAxis.upperValue);\n // Then expand to keep any significant line that falls outside\n // the current range visible, with 5% padding on the expanded\n // side so a line exactly at the bound is not hidden by the\n // chart frame.\n const significant = xAxis.significantLines ?? [];\n if (significant.length && maxX > minX) {\n const pad = (maxX - minX) * 0.05;\n for (const v of significant) {\n if (v < minX) minX = v - pad;\n if (v > maxX) maxX = v + pad;\n }\n }\n\n (scaleX.domain([minX, maxX]) as ChartScales['x']).range([0, this.chartSizes.chartWidth]);\n this.scales.x[key] = scaleX;\n });\n facetKeys.forEach(key => {\n const scaleY = yAxis.scale === 'log' ? scaleSymlog() : scaleLinear();\n const extents = histogramExtentsByKeys[key];\n\n const minY = 0;\n const maxY = facetSettings.sharedY ? maxYAll : extents.maxY;\n\n const rangeV = [this.chartSizes.chartHeight, 0];\n // supporting scale, it needs to add offsets of fixed size in pixels to general scale Y\n const tempY: ChartScales['y'] = (scaleY.copy().domain([minY, maxY]) as ChartScales['y']).range([\n this.chartSizes.chartHeight,\n size.innerOffset,\n ]) as ChartScales['y'];\n (scaleY.domain([tempY.invert(this.chartSizes.chartHeight), tempY.invert(0)]) as ChartScales['y']).range(\n rangeV\n );\n this.scales.y[key] = scaleY;\n });\n }\n\n updateCaptionsSize(\n xAxis: HistogramSettingsImpl['chartSettings']['xAxis'],\n yAxis: HistogramSettingsImpl['chartSettings']['yAxis']\n ) {\n const textMeasurer = new TextMeasurer('600 14px Arial');\n\n let maxYTick = 0;\n\n function getMaxTickWidth(ticks: string[]) {\n return Math.max(...ticks.map(key => textMeasurer.getTextWidth(key)));\n }\n\n if (!yAxis.hiddenLabels) {\n Object.values(this.scales.y).forEach(scale => {\n const {ticks, format} = getTicksAndFormat(scale as ScaleLogarithmic<number, number>, false);\n maxYTick = Math.max(maxYTick, getMaxTickWidth(ticks.map(format)));\n });\n }\n this.captionsSizes = {\n xAxisCaptionsWidth: xAxis.hiddenLabels ? 0 : 20,\n yAxisCaptionsWidth: maxYTick,\n };\n }\n\n createMainTitle(facetKeys: string[], title: HistogramSettingsImpl['chartSettings']['title']) {\n const firstChart = this.chartsDimensions[facetKeys[0]];\n const lastChart = this.chartsDimensions[facetKeys[facetKeys.length - 1]];\n\n this.mainTitle = splitTextByWidth(\n title.name,\n this.chartSizes.chartsWidth - firstChart.padding.left - lastChart.padding.right,\n 20\n );\n }\n\n createFacetTitles(facetKeys: string[], facetLabels: string[][]) {\n this.facetTitles = facetKeys.reduce((res: Record<string, string[]>, key, idx) => {\n if (facetLabels[idx].length === 1 && facetLabels[idx][0] === 'null') {\n res[key] = [];\n } else {\n res[key] = splitTextByWidth(facetLabels[idx].join(', '), this.chartSizes.chartWidth, 14);\n }\n return res;\n }, {});\n }\n\n updateLegendSize(\n legend: HistogramSettingsImpl['chartSettings']['legend'],\n legendInfo: HistogramLegendInfo,\n grouping: ColumnName | null,\n layers: HistogramLayer[]\n ) {\n if (!legend.show) {\n this.legend = {width: 0, height: 0, items: []};\n return;\n }\n\n const legendItems: LegendItem[] = [];\n const emptySizes = {width:0, height:0, left:0, top: 0};\n\n layers.forEach(layer => {\n if (isInheritedAes(layer.aes.fillColor) && grouping) {\n const columnId = layer.aes.fillColor.value;\n const info = legendInfo[grouping.value];\n const title = grouping.label ?? grouping.value;\n const scale:ScaleOrdinal<string, string> = scaleOrdinal<string, string>()\n .domain(info.values)\n .range(info.values.map(value => info.aesMap[value]?.fillColor ?? DEFAULT_COMMON_AES.fillColor));\n legendItems.push({...emptySizes, id: columnId, type: 'discreteColor', title, scale, values: info.values, labels: info.labels});\n }\n });\n\n if (!legendItems.length) {\n this.legend = {width: 0, height: 0, items: []};\n return;\n }\n\n const items = arrangeLegendParts(legendItems, this.chartSizes.chartHeight);\n\n const maxRightEdge = items.reduce((max, item) => Math.max(max, item.left + item.width), 0);\n const legendWidth = maxRightEdge + LEGEND_OFFSET;\n const legendHeight = this.chartSizes.chartHeight;\n\n this.legend = {\n width: legendWidth,\n height: legendHeight,\n items,\n };\n }\n\n updateMargins(size:HistogramSettingsImpl['chartSettings']['size']) {\n const titleTextHeight = TITLE_LINE_HEIGHT * this.mainTitle.length;\n const titleHeight = titleTextHeight > 0 ? titleTextHeight + TITLE_MARGIN * 2 : 0;\n\n const minMargin = size.outerOffset;\n\n this.margins = {\n top: Math.max(titleHeight, minMargin),\n bottom: minMargin,\n left: minMargin,\n right: this.legend.width + minMargin,\n };\n this.chartSizes.totalWidth = this.margins.left + this.chartSizes.chartsWidth + this.margins.right;\n this.chartSizes.totalHeight = this.margins.top + this.chartSizes.chartsHeight + this.margins.bottom;\n }\n\n render(\n dataFrame: DataFrame,\n settingsId: string,\n chartSettings: HistogramSettingsImpl['chartSettings'],\n facetSettings: HistogramSettingsImpl['facetSettings'],\n facetKeys: string[],\n facetLabels: string[][],\n histogramDataByFacets: Record<string, GroupedHistogramData>,\n legendInfo: HistogramLegendInfo,\n layers: HistogramLayer[],\n inheritedAes: HistogramSettingsImpl['inheritedAes'],\n grouping: ColumnName | null,\n groupingStack: HistogramSettingsImpl['groupingStack'],\n groupingDirection: HistogramSettingsImpl['groupingDirection'],\n onTooltipHintSwitch: (v:boolean) => void,\n ) {\n const {xAxis, yAxis, size, title} = chartSettings;\n this.updateChartSizes(size);\n this.updateViewport(facetKeys, facetSettings, xAxis, yAxis, histogramDataByFacets, size, groupingStack);\n this.updateCaptionsSize(xAxis, yAxis);\n this.createFacetTitles(facetKeys, facetLabels);\n this.updateChartDimensions(facetKeys, facetSettings, xAxis, yAxis);\n this.createMainTitle(facetKeys, title);\n this.updateLegendSize(chartSettings.legend, legendInfo, grouping, layers);\n this.updateMargins(size);\n const minHeight = facetKeys.reduce((v, key) => {\n return Math.min(v, histogramDataByFacets[key].minX);\n }, Infinity);\n const maxHeight = facetKeys.reduce((v, key) => {\n return Math.max(v, histogramDataByFacets[key].maxX);\n }, -Infinity);\n const component = (\n <DataFrameProvider dataFrame={dataFrame}>\n <ChartsGroup\n settingsId={settingsId}\n chartSettings={chartSettings}\n facetKeys={facetKeys}\n facetSettings={facetSettings}\n chartSizes={this.chartSizes}\n chartsDimensions={this.chartsDimensions}\n scales={this.scales}\n columnsCount={this.columnsCount}\n margins={this.margins}\n mainTitle={this.mainTitle}\n facetTitles={this.facetTitles}\n captionsSizes={this.captionsSizes}\n histogramDataByFacets={histogramDataByFacets}\n layers={layers}\n aesColorGetter={createAesGetter(dataFrame, inheritedAes, 'fillColor', [minHeight, maxHeight])}\n groupingDirection={groupingDirection}\n groupingStack={groupingStack}\n groupingLabels={grouping ? legendInfo[grouping.value].labels : {}}\n legend={this.legend}\n onTooltipHintSwitch={onTooltipHintSwitch}\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,4 +1,4 @@
|
|
|
1
|
-
import { ColumnName, FrameType, HistogramSettings, InheritAesHistogram, LegendPosition, BinsLayer as OuterBinsLayer, BinsLineLayer as OuterLineLayer, SettingsInterface, TitlePosition, AesRecord, ContinuousAesHistogram } from '../types';
|
|
1
|
+
import { ColumnName, FrameType, HistogramSettings, InheritAesHistogram, LegendPosition, BinsLayer as OuterBinsLayer, BinsLineLayer as OuterLineLayer, SettingsInterface, SignificantLinesStyle, TitlePosition, AesRecord, ContinuousAesHistogram } from '../types';
|
|
2
2
|
export declare class BinsLayer {
|
|
3
3
|
readonly type = "bins";
|
|
4
4
|
readonly aes: {
|
|
@@ -58,6 +58,10 @@ export declare class HistogramSettingsImpl implements SettingsInterface {
|
|
|
58
58
|
hiddenLabels: boolean;
|
|
59
59
|
title: string | ColumnName;
|
|
60
60
|
scale: 'linear' | 'log';
|
|
61
|
+
significantLines?: number[];
|
|
62
|
+
significantLinesStyle?: SignificantLinesStyle;
|
|
63
|
+
lowerValue?: number;
|
|
64
|
+
upperValue?: number;
|
|
61
65
|
};
|
|
62
66
|
readonly frame: {
|
|
63
67
|
type: FrameType;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"HistogramSettingsImpl.d.ts","sourceRoot":"","sources":["../../src/histogram/HistogramSettingsImpl.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EACR,UAAU,EACV,SAAS,EACT,iBAAiB,EACjB,mBAAmB,EACnB,cAAc,EACd,SAAS,IAAI,cAAc,EAC3B,aAAa,IAAI,cAAc,EAC/B,iBAAiB,EACjB,aAAa,EAChB,MAAM,UAAU,CAAC;AAClB,OAAO,EAAE,KAAK,SAAS,EAAE,KAAK,sBAAsB,EAA2B,MAAM,UAAU,CAAC;AAMhG,qBAAa,SAAS;IAClB,QAAQ,CAAC,IAAI,UAAU;IACvB,QAAQ,CAAC,GAAG,EAAE;QACV,SAAS,EAAE,mBAAmB,GAAG,MAAM,GAAG,sBAAsB,CAAC;QACjE,SAAS,EAAE,MAAM,CAAC;QAClB,OAAO,EAAE,MAAM,CAAC;KACnB,CAIC;gBAEU,KAAK,EAAE,cAAc;CAMpC;AAED,qBAAa,aAAa;IACtB,QAAQ,CAAC,IAAI,cAAc;IAC3B,QAAQ,CAAC,GAAG,EAAE;QACV,OAAO,EAAE,MAAM,CAAC;KACnB,CAEC;gBAEU,KAAK,EAAE,cAAc;CAMpC;AAED,MAAM,MAAM,cAAc,GAAG,SAAS,CAAC;AAEvC,qBAAa,qBAAsB,YAAW,iBAAiB;IAC3D,QAAQ,CAAC,EAAE,EAAE,MAAM,CAAC;IACpB,QAAQ,CAAC,IAAI,eAAe;IAC5B,QAAQ,CAAC,WAAW,EAAE,UAAU,CAAC;IACjC,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;IAC3B,QAAQ,CAAC,aAAa,EAAE;QACpB,OAAO,EAAE,OAAO,CAAC;QACjB,OAAO,EAAE,OAAO,CAAC;QACjB,KAAK,CAAC,EAAE,MAAM,CAAC;QACf,KAAK,CAAC,EAAE,MAAM,CAAC;QACf,aAAa,EAAE,MAAM,GAAG,QAAQ,GAAG,OAAO,CAAC;QAC3C,KAAK,EAAE,MAAM,EAAE,GAAG,IAAI,CAAC;KAC1B,CAAC;IACF,QAAQ,CAAC,OAAO,EAAE,UAAU,EAAE,CAAC;IAC/B,QAAQ,CAAC,QAAQ,EAAE,UAAU,GAAG,IAAI,CAAC;IACrC,QAAQ,CAAC,aAAa,EAAE,UAAU,GAAG,YAAY,CAAC;IAClD,QAAQ,CAAC,iBAAiB,EAAE,UAAU,GAAG,SAAS,CAAC;IACnD,QAAQ,CAAC,aAAa,EAAE,MAAM,EAAE,GAAG,IAAI,CAAC;IACxC,QAAQ,CAAC,aAAa,EAAE;QACpB,QAAQ,CAAC,IAAI,EAAE;YAAC,KAAK,EAAE,MAAM,CAAC;YAAC,MAAM,EAAE,MAAM,CAAC;YAAC,WAAW,EAAE,MAAM,CAAC;YAAC,WAAW,EAAE,MAAM,CAAA;SAAC,CAAC;QACzF,QAAQ,CAAC,KAAK,EAAE;YAAC,IAAI,EAAE,MAAM,CAAC;YAAC,IAAI,EAAE,OAAO,CAAC;YAAC,QAAQ,EAAE,aAAa,CAAA;SAAC,CAAC;QACvE,QAAQ,CAAC,KAAK,EAAE;YAAC,QAAQ,EAAE,OAAO,CAAC;YAAC,SAAS,EAAE,OAAO,CAAC;YAAC,YAAY,EAAE,OAAO,CAAC;YAAC,KAAK,EAAE,QAAQ,GAAG,KAAK,CAAA;SAAC,CAAC;QACxG,QAAQ,CAAC,KAAK,EAAE;
|
|
1
|
+
{"version":3,"file":"HistogramSettingsImpl.d.ts","sourceRoot":"","sources":["../../src/histogram/HistogramSettingsImpl.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"HistogramSettingsImpl.js","names":[],"sources":["../../src/histogram/HistogramSettingsImpl.ts"],"sourcesContent":["import lodash from 'lodash';\nimport { BLACK, DEFAULT_HEIGHT, DEFAULT_HEIGHT_SMALL, DEFAULT_WIDTH, DEFAULT_WIDTH_SMALL } from '../constants';\nimport type {\n ColumnName,\n FrameType,\n HistogramSettings,\n InheritAesHistogram,\n LegendPosition,\n BinsLayer as OuterBinsLayer,\n BinsLineLayer as OuterLineLayer,\n SettingsInterface,\n TitlePosition,\n} from '../types';\nimport { type AesRecord, type ContinuousAesHistogram, HistogramSettingsSchema } from '../types';\nimport { exhaustive } from '../utils';\nimport { MIN_MARGIN, PADDINGS } from './constants';\n\nconst DEFAULT_BINS_COUNT = 10;\n\nexport class BinsLayer {\n readonly type = 'bins';\n readonly aes: {\n fillColor: InheritAesHistogram | string | ContinuousAesHistogram;\n lineColor: string,\n opacity: number;\n } = {\n fillColor: 'white',\n lineColor: BLACK,\n opacity: 1,\n };\n\n constructor(layer: OuterBinsLayer) {\n this.aes = {\n ...this.aes,\n ...layer.aes,\n };\n }\n}\n\nexport class BinsLineLayer {\n readonly type = 'binsLine';\n readonly aes: {\n opacity: number;\n } = {\n opacity: 1,\n };\n\n constructor(layer: OuterLineLayer) {\n this.aes = {\n ...this.aes,\n ...layer.aes,\n };\n }\n}\n\nexport type HistogramLayer = BinsLayer;\n\nexport class HistogramSettingsImpl implements SettingsInterface {\n readonly id: string;\n readonly type = 'histogram';\n readonly valueColumn: ColumnName;\n readonly binsCount: number;\n readonly facetSettings: {\n sharedX: boolean;\n sharedY: boolean;\n nRows?: number;\n nCols?: number;\n titlePosition: 'left' | 'center' | 'right';\n order: string[] | null;\n };\n readonly facetBy: ColumnName[];\n readonly grouping: ColumnName | null;\n readonly groupingStack: 'vertical' | 'horizontal';\n readonly groupingDirection: 'straight' | 'reverse';\n readonly groupingOrder: string[] | null;\n readonly chartSettings: {\n readonly size: {width: number; height: number, innerOffset: number, outerOffset: number};\n readonly title: {name: string; show: boolean; position: TitlePosition};\n readonly yAxis: {showGrid: boolean; showTicks: boolean; hiddenLabels: boolean; scale: 'linear' | 'log'};\n readonly xAxis: {showGrid: boolean
|
|
1
|
+
{"version":3,"file":"HistogramSettingsImpl.js","names":[],"sources":["../../src/histogram/HistogramSettingsImpl.ts"],"sourcesContent":["import lodash from 'lodash';\nimport { BLACK, DEFAULT_HEIGHT, DEFAULT_HEIGHT_SMALL, DEFAULT_WIDTH, DEFAULT_WIDTH_SMALL } from '../constants';\nimport type {\n ColumnName,\n FrameType,\n HistogramSettings,\n InheritAesHistogram,\n LegendPosition,\n BinsLayer as OuterBinsLayer,\n BinsLineLayer as OuterLineLayer,\n SettingsInterface,\n SignificantLinesStyle,\n TitlePosition,\n} from '../types';\nimport { type AesRecord, type ContinuousAesHistogram, HistogramSettingsSchema } from '../types';\nimport { exhaustive } from '../utils';\nimport { MIN_MARGIN, PADDINGS } from './constants';\n\nconst DEFAULT_BINS_COUNT = 10;\n\nexport class BinsLayer {\n readonly type = 'bins';\n readonly aes: {\n fillColor: InheritAesHistogram | string | ContinuousAesHistogram;\n lineColor: string,\n opacity: number;\n } = {\n fillColor: 'white',\n lineColor: BLACK,\n opacity: 1,\n };\n\n constructor(layer: OuterBinsLayer) {\n this.aes = {\n ...this.aes,\n ...layer.aes,\n };\n }\n}\n\nexport class BinsLineLayer {\n readonly type = 'binsLine';\n readonly aes: {\n opacity: number;\n } = {\n opacity: 1,\n };\n\n constructor(layer: OuterLineLayer) {\n this.aes = {\n ...this.aes,\n ...layer.aes,\n };\n }\n}\n\nexport type HistogramLayer = BinsLayer;\n\nexport class HistogramSettingsImpl implements SettingsInterface {\n readonly id: string;\n readonly type = 'histogram';\n readonly valueColumn: ColumnName;\n readonly binsCount: number;\n readonly facetSettings: {\n sharedX: boolean;\n sharedY: boolean;\n nRows?: number;\n nCols?: number;\n titlePosition: 'left' | 'center' | 'right';\n order: string[] | null;\n };\n readonly facetBy: ColumnName[];\n readonly grouping: ColumnName | null;\n readonly groupingStack: 'vertical' | 'horizontal';\n readonly groupingDirection: 'straight' | 'reverse';\n readonly groupingOrder: string[] | null;\n readonly chartSettings: {\n readonly size: {width: number; height: number, innerOffset: number, outerOffset: number};\n readonly title: {name: string; show: boolean; position: TitlePosition};\n readonly yAxis: {showGrid: boolean; showTicks: boolean; hiddenLabels: boolean; scale: 'linear' | 'log'};\n readonly xAxis: {\n showGrid: boolean;\n showTicks: boolean;\n hiddenLabels: boolean;\n title: string | ColumnName;\n scale: 'linear' | 'log';\n significantLines?: number[];\n significantLinesStyle?: SignificantLinesStyle;\n // Hard bounds. ChartRenderer narrows the data-derived domain\n // to fit within [lowerValue, upperValue] when set. Significant\n // lines outside the resulting visible range still expand it\n // (with 5% padding) so they remain visible.\n lowerValue?: number;\n upperValue?: number;\n };\n readonly frame: {type: FrameType};\n readonly legend: {show: boolean; position: LegendPosition};\n };\n readonly inheritedAes: Record<string, AesRecord>;\n readonly layers: HistogramLayer[];\n\n constructor(settings: HistogramSettings) {\n HistogramSettingsSchema.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.valueColumn = settings.valueColumn;\n this.binsCount = settings.binsCount ?? DEFAULT_BINS_COUNT;\n this.facetBy = settings.facetBy ?? [];\n this.grouping = settings.grouping ?? null;\n this.groupingStack = settings.groupingStack ?? 'vertical';\n this.groupingDirection = settings.groupingDirection ?? 'straight';\n this.groupingOrder = settings.groupingOrder ?? null;\n this.chartSettings = {\n size: {\n width: settings?.size?.width ?? (this.facetBy.length ? DEFAULT_WIDTH_SMALL : DEFAULT_WIDTH),\n height: settings?.size?.height ?? (this.facetBy.length ? DEFAULT_HEIGHT_SMALL : DEFAULT_HEIGHT),\n outerOffset: settings?.size?.outerOffset ?? MIN_MARGIN,\n innerOffset: settings?.size?.innerOffset ?? PADDINGS.TOP\n },\n title: {\n position: 'center',\n show: true,\n ...settings.title,\n name: settings.title?.name ?? 'Chart',\n },\n yAxis: {\n showGrid: true,\n showTicks: true,\n scale: settings.xAxis?.scale ?? 'linear',\n hiddenLabels: false,\n ...settings.yAxis,\n },\n xAxis: {\n title: settings.valueColumn.label ?? settings.valueColumn.value ?? '',\n scale: settings.xAxis?.scale ?? 'linear',\n showGrid: settings.xAxis?.showGrid ?? true,\n showTicks: settings.xAxis?.showTicks ?? true,\n hiddenLabels: settings.xAxis?.hiddenLabels ?? false,\n ...settings.xAxis,\n },\n frame: {type: settings.frame?.type ?? 'full'},\n legend: {\n show: true,\n position: 'right',\n ...settings.legend,\n },\n };\n\n this.inheritedAes = settings.inheritedAes ?? {};\n\n this.layers = settings.layers\n .map(layer => {\n if (layer.type === 'bins') {\n return new BinsLayer(layer);\n }\n if (layer.type === 'binsLine') {\n return new BinsLineLayer(layer);\n }\n exhaustive(layer, 'Unknown layer type');\n })\n .filter(Boolean) as HistogramLayer[];\n }\n}\n"],"mappings":";;;;;;AAkBA,IAAM,IAAqB,IAEd,IAAb,MAAuB;CACnB,OAAgB;CAChB,MAII;EACA,WAAW;EACX,WAAW;EACX,SAAS;EACZ;CAED,YAAY,GAAuB;AAC/B,OAAK,MAAM;GACP,GAAG,KAAK;GACR,GAAG,EAAM;GACZ;;GAII,IAAb,MAA2B;CACvB,OAAgB;CAChB,MAEI,EACA,SAAS,GACZ;CAED,YAAY,GAAuB;AAC/B,OAAK,MAAM;GACP,GAAG,KAAK;GACR,GAAG,EAAM;GACZ;;GAMI,IAAb,MAAgE;CAC5D;CACA,OAAgB;CAChB;CACA;CACA;CAQA;CACA;CACA;CACA;CACA;CACA;CAsBA;CACA;CAEA,YAAY,GAA6B;AAiDrC,EAhDA,EAAwB,MAAM,EAAS,EACvC,KAAK,KAAK,EAAO,SAAS,WAAW,EACrC,KAAK,gBAAgB;GAAC,SAAS;GAAM,SAAS;GAAM,eAAe;GAAQ,OAAO,EAAS,eAAe,SAAS;GAAM,GAAG,EAAS;GAAc,EACnJ,KAAK,cAAc,EAAS,aAC5B,KAAK,YAAY,EAAS,aAAa,GACvC,KAAK,UAAU,EAAS,WAAW,EAAE,EACrC,KAAK,WAAW,EAAS,YAAY,MACrC,KAAK,gBAAgB,EAAS,iBAAiB,YAC/C,KAAK,oBAAoB,EAAS,qBAAqB,YACvD,KAAK,gBAAgB,EAAS,iBAAiB,MAC/C,KAAK,gBAAgB;GACjB,MAAM;IACF,OAAO,GAAU,MAAM,UAAU,KAAK,QAAQ,SAAA,MAAA;IAC9C,QAAQ,GAAU,MAAM,WAAW,KAAK,QAAQ,SAAA,MAAA;IAChD,aAAa,GAAU,MAAM,eAAA;IAC7B,aAAa,GAAU,MAAM,eAAe,EAAS;IACxD;GACD,OAAO;IACH,UAAU;IACV,MAAM;IACN,GAAG,EAAS;IACZ,MAAM,EAAS,OAAO,QAAQ;IACjC;GACD,OAAO;IACH,UAAU;IACV,WAAW;IACX,OAAO,EAAS,OAAO,SAAS;IAChC,cAAc;IACd,GAAG,EAAS;IACf;GACD,OAAO;IACH,OAAO,EAAS,YAAY,SAAS,EAAS,YAAY,SAAS;IACnE,OAAO,EAAS,OAAO,SAAS;IAChC,UAAU,EAAS,OAAO,YAAY;IACtC,WAAW,EAAS,OAAO,aAAa;IACxC,cAAc,EAAS,OAAO,gBAAgB;IAC9C,GAAG,EAAS;IACf;GACD,OAAO,EAAC,MAAM,EAAS,OAAO,QAAQ,QAAO;GAC7C,QAAQ;IACJ,MAAM;IACN,UAAU;IACV,GAAG,EAAS;IACf;GACJ,EAED,KAAK,eAAe,EAAS,gBAAgB,EAAE,EAE/C,KAAK,SAAS,EAAS,OAClB,KAAI,MAAS;AACV,OAAI,EAAM,SAAS,OACf,QAAO,IAAI,EAAU,EAAM;AAE/B,OAAI,EAAM,SAAS,WACf,QAAO,IAAI,EAAc,EAAM;AAEnC,KAAW,GAAO,qBAAqB;IACzC,CACD,OAAO,QAAQ"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Grid.d.ts","sourceRoot":"","sources":["../../../src/scatterplot/components/Grid.tsx"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,YAAY,EAA0B,SAAS,EAAE,MAAM,aAAa,CAAC;
|
|
1
|
+
{"version":3,"file":"Grid.d.ts","sourceRoot":"","sources":["../../../src/scatterplot/components/Grid.tsx"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,YAAY,EAA0B,SAAS,EAAE,MAAM,aAAa,CAAC;AAMnF,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,SAAS,CAAC;AAS3C,UAAU,SAAS;IACf,MAAM,EAAE,WAAW,CAAC,GAAG,CAAC,CAAC;IACzB,MAAM,EAAE,WAAW,CAAC,GAAG,CAAC,CAAC;IACzB,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,MAAM,CAAC;IACf,KAAK,EAAE,YAAY,CAAC;IACpB,KAAK,EAAE,YAAY,CAAC;IACpB,SAAS,EAAE,SAAS,CAAC;IACrB,WAAW,CAAC,EAAE,MAAM,CAAC;CACxB;AASD,wBAAgB,IAAI,CAAC,EAAE,MAAM,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,KAAK,EAAE,SAAS,EAAE,WAAgB,EAAE,EAAE,SAAS,2CA0G3G"}
|