@adminiumjs/charts 0.1.0-rc.1
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/LICENSE +661 -0
- package/dist/components/AnomalyChart.d.ts +30 -0
- package/dist/components/AnomalyChart.d.ts.map +1 -0
- package/dist/components/AnomalyChart.js +32 -0
- package/dist/components/AnomalyChart.js.map +1 -0
- package/dist/components/BarChart.d.ts +33 -0
- package/dist/components/BarChart.d.ts.map +1 -0
- package/dist/components/BarChart.js +40 -0
- package/dist/components/BarChart.js.map +1 -0
- package/dist/components/BoxPlotChart.d.ts +23 -0
- package/dist/components/BoxPlotChart.d.ts.map +1 -0
- package/dist/components/BoxPlotChart.js +24 -0
- package/dist/components/BoxPlotChart.js.map +1 -0
- package/dist/components/BulletChart.d.ts +27 -0
- package/dist/components/BulletChart.d.ts.map +1 -0
- package/dist/components/BulletChart.js +24 -0
- package/dist/components/BulletChart.js.map +1 -0
- package/dist/components/BumpChart.d.ts +27 -0
- package/dist/components/BumpChart.d.ts.map +1 -0
- package/dist/components/BumpChart.js +17 -0
- package/dist/components/BumpChart.js.map +1 -0
- package/dist/components/CandlestickChart.d.ts +26 -0
- package/dist/components/CandlestickChart.d.ts.map +1 -0
- package/dist/components/CandlestickChart.js +22 -0
- package/dist/components/CandlestickChart.js.map +1 -0
- package/dist/components/ChartSurface.d.ts +52 -0
- package/dist/components/ChartSurface.d.ts.map +1 -0
- package/dist/components/ChartSurface.js +15 -0
- package/dist/components/ChartSurface.js.map +1 -0
- package/dist/components/Chord.d.ts +30 -0
- package/dist/components/Chord.d.ts.map +1 -0
- package/dist/components/Chord.js +14 -0
- package/dist/components/Chord.js.map +1 -0
- package/dist/components/ChoroplethGridChart.d.ts +32 -0
- package/dist/components/ChoroplethGridChart.d.ts.map +1 -0
- package/dist/components/ChoroplethGridChart.js +15 -0
- package/dist/components/ChoroplethGridChart.js.map +1 -0
- package/dist/components/CohortMatrixChart.d.ts +30 -0
- package/dist/components/CohortMatrixChart.d.ts.map +1 -0
- package/dist/components/CohortMatrixChart.js +13 -0
- package/dist/components/CohortMatrixChart.js.map +1 -0
- package/dist/components/CorrelationMatrixChart.d.ts +24 -0
- package/dist/components/CorrelationMatrixChart.d.ts.map +1 -0
- package/dist/components/CorrelationMatrixChart.js +29 -0
- package/dist/components/CorrelationMatrixChart.js.map +1 -0
- package/dist/components/DonutChart.d.ts +31 -0
- package/dist/components/DonutChart.d.ts.map +1 -0
- package/dist/components/DonutChart.js +19 -0
- package/dist/components/DonutChart.js.map +1 -0
- package/dist/components/ForecastChart.d.ts +37 -0
- package/dist/components/ForecastChart.d.ts.map +1 -0
- package/dist/components/ForecastChart.js +39 -0
- package/dist/components/ForecastChart.js.map +1 -0
- package/dist/components/Funnel.d.ts +27 -0
- package/dist/components/Funnel.d.ts.map +1 -0
- package/dist/components/Funnel.js +25 -0
- package/dist/components/Funnel.js.map +1 -0
- package/dist/components/HeatCalendarChart.d.ts +39 -0
- package/dist/components/HeatCalendarChart.d.ts.map +1 -0
- package/dist/components/HeatCalendarChart.js +37 -0
- package/dist/components/HeatCalendarChart.js.map +1 -0
- package/dist/components/HeatMonthChart.d.ts +30 -0
- package/dist/components/HeatMonthChart.d.ts.map +1 -0
- package/dist/components/HeatMonthChart.js +14 -0
- package/dist/components/HeatMonthChart.js.map +1 -0
- package/dist/components/HexbinChart.d.ts +22 -0
- package/dist/components/HexbinChart.d.ts.map +1 -0
- package/dist/components/HexbinChart.js +31 -0
- package/dist/components/HexbinChart.js.map +1 -0
- package/dist/components/LineAreaChart.d.ts +26 -0
- package/dist/components/LineAreaChart.d.ts.map +1 -0
- package/dist/components/LineAreaChart.js +62 -0
- package/dist/components/LineAreaChart.js.map +1 -0
- package/dist/components/MarimekkoChart.d.ts +24 -0
- package/dist/components/MarimekkoChart.d.ts.map +1 -0
- package/dist/components/MarimekkoChart.js +20 -0
- package/dist/components/MarimekkoChart.js.map +1 -0
- package/dist/components/MultiLineChart.d.ts +36 -0
- package/dist/components/MultiLineChart.d.ts.map +1 -0
- package/dist/components/MultiLineChart.js +62 -0
- package/dist/components/MultiLineChart.js.map +1 -0
- package/dist/components/ParallelCoordinatesChart.d.ts +22 -0
- package/dist/components/ParallelCoordinatesChart.d.ts.map +1 -0
- package/dist/components/ParallelCoordinatesChart.js +16 -0
- package/dist/components/ParallelCoordinatesChart.js.map +1 -0
- package/dist/components/ParetoChart.d.ts +26 -0
- package/dist/components/ParetoChart.d.ts.map +1 -0
- package/dist/components/ParetoChart.js +26 -0
- package/dist/components/ParetoChart.js.map +1 -0
- package/dist/components/Radar.d.ts +27 -0
- package/dist/components/Radar.d.ts.map +1 -0
- package/dist/components/Radar.js +19 -0
- package/dist/components/Radar.js.map +1 -0
- package/dist/components/RadialBar.d.ts +25 -0
- package/dist/components/RadialBar.d.ts.map +1 -0
- package/dist/components/RadialBar.js +12 -0
- package/dist/components/RadialBar.js.map +1 -0
- package/dist/components/RankingBars.d.ts +27 -0
- package/dist/components/RankingBars.d.ts.map +1 -0
- package/dist/components/RankingBars.js +25 -0
- package/dist/components/RankingBars.js.map +1 -0
- package/dist/components/RidgelineChart.d.ts +23 -0
- package/dist/components/RidgelineChart.d.ts.map +1 -0
- package/dist/components/RidgelineChart.js +20 -0
- package/dist/components/RidgelineChart.js.map +1 -0
- package/dist/components/SankeyChart.d.ts +29 -0
- package/dist/components/SankeyChart.d.ts.map +1 -0
- package/dist/components/SankeyChart.js +21 -0
- package/dist/components/SankeyChart.js.map +1 -0
- package/dist/components/ScatterBubbleChart.d.ts +26 -0
- package/dist/components/ScatterBubbleChart.d.ts.map +1 -0
- package/dist/components/ScatterBubbleChart.js +31 -0
- package/dist/components/ScatterBubbleChart.js.map +1 -0
- package/dist/components/SlopeChart.d.ts +28 -0
- package/dist/components/SlopeChart.d.ts.map +1 -0
- package/dist/components/SlopeChart.js +18 -0
- package/dist/components/SlopeChart.js.map +1 -0
- package/dist/components/Sparkline.d.ts +15 -0
- package/dist/components/Sparkline.d.ts.map +1 -0
- package/dist/components/Sparkline.js +27 -0
- package/dist/components/Sparkline.js.map +1 -0
- package/dist/components/StackedBar100.d.ts +30 -0
- package/dist/components/StackedBar100.d.ts.map +1 -0
- package/dist/components/StackedBar100.js +21 -0
- package/dist/components/StackedBar100.js.map +1 -0
- package/dist/components/StreamChart.d.ts +23 -0
- package/dist/components/StreamChart.d.ts.map +1 -0
- package/dist/components/StreamChart.js +56 -0
- package/dist/components/StreamChart.js.map +1 -0
- package/dist/components/Sunburst.d.ts +24 -0
- package/dist/components/Sunburst.d.ts.map +1 -0
- package/dist/components/Sunburst.js +13 -0
- package/dist/components/Sunburst.js.map +1 -0
- package/dist/components/TimelineLanesChart.d.ts +25 -0
- package/dist/components/TimelineLanesChart.d.ts.map +1 -0
- package/dist/components/TimelineLanesChart.js +41 -0
- package/dist/components/TimelineLanesChart.js.map +1 -0
- package/dist/components/Treemap.d.ts +28 -0
- package/dist/components/Treemap.d.ts.map +1 -0
- package/dist/components/Treemap.js +22 -0
- package/dist/components/Treemap.js.map +1 -0
- package/dist/components/ViolinChart.d.ts +22 -0
- package/dist/components/ViolinChart.d.ts.map +1 -0
- package/dist/components/ViolinChart.js +21 -0
- package/dist/components/ViolinChart.js.map +1 -0
- package/dist/components/WaterfallChart.d.ts +23 -0
- package/dist/components/WaterfallChart.d.ts.map +1 -0
- package/dist/components/WaterfallChart.js +29 -0
- package/dist/components/WaterfallChart.js.map +1 -0
- package/dist/components/WordCloud.d.ts +24 -0
- package/dist/components/WordCloud.d.ts.map +1 -0
- package/dist/components/WordCloud.js +22 -0
- package/dist/components/WordCloud.js.map +1 -0
- package/dist/demo/barsRanking.d.ts +26 -0
- package/dist/demo/barsRanking.d.ts.map +1 -0
- package/dist/demo/barsRanking.js +80 -0
- package/dist/demo/barsRanking.js.map +1 -0
- package/dist/demo/generators.d.ts +44 -0
- package/dist/demo/generators.d.ts.map +1 -0
- package/dist/demo/generators.js +72 -0
- package/dist/demo/generators.js.map +1 -0
- package/dist/demo/mulberry32.d.ts +10 -0
- package/dist/demo/mulberry32.d.ts.map +1 -0
- package/dist/demo/mulberry32.js +26 -0
- package/dist/demo/mulberry32.js.map +1 -0
- package/dist/geometry/anomaly.d.ts +22 -0
- package/dist/geometry/anomaly.d.ts.map +1 -0
- package/dist/geometry/anomaly.js +52 -0
- package/dist/geometry/anomaly.js.map +1 -0
- package/dist/geometry/bars.d.ts +46 -0
- package/dist/geometry/bars.d.ts.map +1 -0
- package/dist/geometry/bars.js +68 -0
- package/dist/geometry/bars.js.map +1 -0
- package/dist/geometry/bullet.d.ts +53 -0
- package/dist/geometry/bullet.d.ts.map +1 -0
- package/dist/geometry/bullet.js +67 -0
- package/dist/geometry/bullet.js.map +1 -0
- package/dist/geometry/bump.d.ts +42 -0
- package/dist/geometry/bump.d.ts.map +1 -0
- package/dist/geometry/bump.js +29 -0
- package/dist/geometry/bump.js.map +1 -0
- package/dist/geometry/candles.d.ts +39 -0
- package/dist/geometry/candles.d.ts.map +1 -0
- package/dist/geometry/candles.js +42 -0
- package/dist/geometry/candles.js.map +1 -0
- package/dist/geometry/chord.d.ts +53 -0
- package/dist/geometry/chord.d.ts.map +1 -0
- package/dist/geometry/chord.js +111 -0
- package/dist/geometry/chord.js.map +1 -0
- package/dist/geometry/choropleth.d.ts +58 -0
- package/dist/geometry/choropleth.d.ts.map +1 -0
- package/dist/geometry/choropleth.js +101 -0
- package/dist/geometry/choropleth.js.map +1 -0
- package/dist/geometry/cohort.d.ts +54 -0
- package/dist/geometry/cohort.d.ts.map +1 -0
- package/dist/geometry/cohort.js +70 -0
- package/dist/geometry/cohort.js.map +1 -0
- package/dist/geometry/correlation.d.ts +138 -0
- package/dist/geometry/correlation.d.ts.map +1 -0
- package/dist/geometry/correlation.js +161 -0
- package/dist/geometry/correlation.js.map +1 -0
- package/dist/geometry/distribution.d.ts +115 -0
- package/dist/geometry/distribution.d.ts.map +1 -0
- package/dist/geometry/distribution.js +131 -0
- package/dist/geometry/distribution.js.map +1 -0
- package/dist/geometry/donut.d.ts +37 -0
- package/dist/geometry/donut.d.ts.map +1 -0
- package/dist/geometry/donut.js +46 -0
- package/dist/geometry/donut.js.map +1 -0
- package/dist/geometry/forecast.d.ts +30 -0
- package/dist/geometry/forecast.d.ts.map +1 -0
- package/dist/geometry/forecast.js +75 -0
- package/dist/geometry/forecast.js.map +1 -0
- package/dist/geometry/funnel.d.ts +37 -0
- package/dist/geometry/funnel.d.ts.map +1 -0
- package/dist/geometry/funnel.js +42 -0
- package/dist/geometry/funnel.js.map +1 -0
- package/dist/geometry/heat.d.ts +34 -0
- package/dist/geometry/heat.d.ts.map +1 -0
- package/dist/geometry/heat.js +50 -0
- package/dist/geometry/heat.js.map +1 -0
- package/dist/geometry/heatCalendar.d.ts +43 -0
- package/dist/geometry/heatCalendar.d.ts.map +1 -0
- package/dist/geometry/heatCalendar.js +82 -0
- package/dist/geometry/heatCalendar.js.map +1 -0
- package/dist/geometry/heatMonth.d.ts +47 -0
- package/dist/geometry/heatMonth.d.ts.map +1 -0
- package/dist/geometry/heatMonth.js +72 -0
- package/dist/geometry/heatMonth.js.map +1 -0
- package/dist/geometry/lineArea.d.ts +17 -0
- package/dist/geometry/lineArea.d.ts.map +1 -0
- package/dist/geometry/lineArea.js +37 -0
- package/dist/geometry/lineArea.js.map +1 -0
- package/dist/geometry/marimekko.d.ts +43 -0
- package/dist/geometry/marimekko.d.ts.map +1 -0
- package/dist/geometry/marimekko.js +45 -0
- package/dist/geometry/marimekko.js.map +1 -0
- package/dist/geometry/multiLine.d.ts +19 -0
- package/dist/geometry/multiLine.d.ts.map +1 -0
- package/dist/geometry/multiLine.js +25 -0
- package/dist/geometry/multiLine.js.map +1 -0
- package/dist/geometry/pareto.d.ts +44 -0
- package/dist/geometry/pareto.d.ts.map +1 -0
- package/dist/geometry/pareto.js +65 -0
- package/dist/geometry/pareto.js.map +1 -0
- package/dist/geometry/radar.d.ts +60 -0
- package/dist/geometry/radar.d.ts.map +1 -0
- package/dist/geometry/radar.js +67 -0
- package/dist/geometry/radar.js.map +1 -0
- package/dist/geometry/radialBar.d.ts +31 -0
- package/dist/geometry/radialBar.d.ts.map +1 -0
- package/dist/geometry/radialBar.js +53 -0
- package/dist/geometry/radialBar.js.map +1 -0
- package/dist/geometry/ranking.d.ts +48 -0
- package/dist/geometry/ranking.d.ts.map +1 -0
- package/dist/geometry/ranking.js +42 -0
- package/dist/geometry/ranking.js.map +1 -0
- package/dist/geometry/sankey.d.ts +60 -0
- package/dist/geometry/sankey.d.ts.map +1 -0
- package/dist/geometry/sankey.js +130 -0
- package/dist/geometry/sankey.js.map +1 -0
- package/dist/geometry/scales.d.ts +14 -0
- package/dist/geometry/scales.d.ts.map +1 -0
- package/dist/geometry/scales.js +33 -0
- package/dist/geometry/scales.js.map +1 -0
- package/dist/geometry/slope.d.ts +34 -0
- package/dist/geometry/slope.d.ts.map +1 -0
- package/dist/geometry/slope.js +44 -0
- package/dist/geometry/slope.js.map +1 -0
- package/dist/geometry/sparkline.d.ts +20 -0
- package/dist/geometry/sparkline.d.ts.map +1 -0
- package/dist/geometry/sparkline.js +43 -0
- package/dist/geometry/sparkline.js.map +1 -0
- package/dist/geometry/stacked100.d.ts +33 -0
- package/dist/geometry/stacked100.d.ts.map +1 -0
- package/dist/geometry/stacked100.js +34 -0
- package/dist/geometry/stacked100.js.map +1 -0
- package/dist/geometry/streamStack.d.ts +32 -0
- package/dist/geometry/streamStack.d.ts.map +1 -0
- package/dist/geometry/streamStack.js +56 -0
- package/dist/geometry/streamStack.js.map +1 -0
- package/dist/geometry/sunburst.d.ts +37 -0
- package/dist/geometry/sunburst.d.ts.map +1 -0
- package/dist/geometry/sunburst.js +84 -0
- package/dist/geometry/sunburst.js.map +1 -0
- package/dist/geometry/timelineLanes.d.ts +46 -0
- package/dist/geometry/timelineLanes.d.ts.map +1 -0
- package/dist/geometry/timelineLanes.js +52 -0
- package/dist/geometry/timelineLanes.js.map +1 -0
- package/dist/geometry/treemap.d.ts +42 -0
- package/dist/geometry/treemap.d.ts.map +1 -0
- package/dist/geometry/treemap.js +134 -0
- package/dist/geometry/treemap.js.map +1 -0
- package/dist/geometry/waterfall.d.ts +40 -0
- package/dist/geometry/waterfall.d.ts.map +1 -0
- package/dist/geometry/waterfall.js +80 -0
- package/dist/geometry/waterfall.js.map +1 -0
- package/dist/geometry/wordcloud.d.ts +46 -0
- package/dist/geometry/wordcloud.d.ts.map +1 -0
- package/dist/geometry/wordcloud.js +79 -0
- package/dist/geometry/wordcloud.js.map +1 -0
- package/dist/hooks/useChartSize.d.ts +6 -0
- package/dist/hooks/useChartSize.d.ts.map +1 -0
- package/dist/hooks/useChartSize.js +32 -0
- package/dist/hooks/useChartSize.js.map +1 -0
- package/dist/hooks/useMountAnimation.d.ts +4 -0
- package/dist/hooks/useMountAnimation.d.ts.map +1 -0
- package/dist/hooks/useMountAnimation.js +40 -0
- package/dist/hooks/useMountAnimation.js.map +1 -0
- package/dist/hooks/useRtl.d.ts +7 -0
- package/dist/hooks/useRtl.d.ts.map +1 -0
- package/dist/hooks/useRtl.js +18 -0
- package/dist/hooks/useRtl.js.map +1 -0
- package/dist/index.d.ts +110 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +79 -0
- package/dist/index.js.map +1 -0
- package/dist/utils/format.d.ts +5 -0
- package/dist/utils/format.d.ts.map +1 -0
- package/dist/utils/format.js +24 -0
- package/dist/utils/format.js.map +1 -0
- package/dist/utils/stats.d.ts +23 -0
- package/dist/utils/stats.d.ts.map +1 -0
- package/dist/utils/stats.js +82 -0
- package/dist/utils/stats.js.map +1 -0
- package/package.json +36 -0
- package/src/styles.css +205 -0
|
@@ -0,0 +1,138 @@
|
|
|
1
|
+
export interface ScatterPointInput {
|
|
2
|
+
x: number;
|
|
3
|
+
y: number;
|
|
4
|
+
/** Optional bubble size dimension. */
|
|
5
|
+
r?: number | undefined;
|
|
6
|
+
/** Optional category for color legend. */
|
|
7
|
+
segment?: string | undefined;
|
|
8
|
+
}
|
|
9
|
+
export interface ScatterMark {
|
|
10
|
+
index: number;
|
|
11
|
+
cx: number;
|
|
12
|
+
cy: number;
|
|
13
|
+
r: number;
|
|
14
|
+
segment: string | undefined;
|
|
15
|
+
}
|
|
16
|
+
export interface ScatterTrend {
|
|
17
|
+
x1: number;
|
|
18
|
+
y1: number;
|
|
19
|
+
x2: number;
|
|
20
|
+
y2: number;
|
|
21
|
+
}
|
|
22
|
+
export interface ScatterLayout {
|
|
23
|
+
marks: ScatterMark[];
|
|
24
|
+
xTicks: number[];
|
|
25
|
+
yTicks: number[];
|
|
26
|
+
xFor: (value: number) => number;
|
|
27
|
+
yFor: (value: number) => number;
|
|
28
|
+
trend: ScatterTrend | null;
|
|
29
|
+
/** Distinct segments in first-seen order (legend/color assignment). */
|
|
30
|
+
segments: string[];
|
|
31
|
+
}
|
|
32
|
+
export interface ScatterLayoutOptions {
|
|
33
|
+
width: number;
|
|
34
|
+
height: number;
|
|
35
|
+
rtl: boolean;
|
|
36
|
+
/** [min, max] radius when sizing bubbles by `r` (default [3, 15]). */
|
|
37
|
+
radiusRange?: [number, number];
|
|
38
|
+
/** Fixed radius when no point carries `r` (default 4). */
|
|
39
|
+
fixedRadius?: number;
|
|
40
|
+
trendLine?: boolean;
|
|
41
|
+
tickCount?: number;
|
|
42
|
+
}
|
|
43
|
+
/**
|
|
44
|
+
* Scatter with an optional bubble-radius dimension, gridlines, distinct-segment
|
|
45
|
+
* legend, and a dashed least-squares trend line. The x value axis mirrors in
|
|
46
|
+
* RTL (range flip); y stays pixel-down. Bubble radius scales from the `r`
|
|
47
|
+
* extent so tests can assert a stable ordering.
|
|
48
|
+
*/
|
|
49
|
+
export declare function scatterLayout(points: readonly ScatterPointInput[], options: ScatterLayoutOptions): ScatterLayout;
|
|
50
|
+
export interface HexCell {
|
|
51
|
+
row: number;
|
|
52
|
+
col: number;
|
|
53
|
+
cx: number;
|
|
54
|
+
cy: number;
|
|
55
|
+
}
|
|
56
|
+
export interface HexbinLayout {
|
|
57
|
+
cells: HexCell[];
|
|
58
|
+
radius: number;
|
|
59
|
+
/** Pointy-top hexagon polygon points (SVG `points` attr) at a center. */
|
|
60
|
+
hexPoints: (cx: number, cy: number) => string;
|
|
61
|
+
}
|
|
62
|
+
export interface HexbinLayoutOptions {
|
|
63
|
+
rows: number;
|
|
64
|
+
cols: number;
|
|
65
|
+
width: number;
|
|
66
|
+
height: number;
|
|
67
|
+
rtl: boolean;
|
|
68
|
+
}
|
|
69
|
+
/**
|
|
70
|
+
* Pointy-top hex-grid centers fitted to the box. Odd rows offset by half a
|
|
71
|
+
* column so the tessellation interlocks; columns mirror in RTL. Callers map a
|
|
72
|
+
* per-cell count to fill alpha and omit sparse (null/0) cells (annex §2).
|
|
73
|
+
*/
|
|
74
|
+
export declare function hexbinLayout(options: HexbinLayoutOptions): HexbinLayout;
|
|
75
|
+
export interface MatrixCellRect {
|
|
76
|
+
row: number;
|
|
77
|
+
col: number;
|
|
78
|
+
x: number;
|
|
79
|
+
y: number;
|
|
80
|
+
w: number;
|
|
81
|
+
h: number;
|
|
82
|
+
}
|
|
83
|
+
export interface MatrixGridLayout {
|
|
84
|
+
cells: MatrixCellRect[];
|
|
85
|
+
cellW: number;
|
|
86
|
+
cellH: number;
|
|
87
|
+
colX: (col: number) => number;
|
|
88
|
+
rowY: (row: number) => number;
|
|
89
|
+
}
|
|
90
|
+
export interface MatrixGridOptions {
|
|
91
|
+
rows: number;
|
|
92
|
+
cols: number;
|
|
93
|
+
width: number;
|
|
94
|
+
height: number;
|
|
95
|
+
rtl: boolean;
|
|
96
|
+
gap?: number;
|
|
97
|
+
}
|
|
98
|
+
/** Uniform cell grid; column order mirrors in RTL, rows stay top→bottom. */
|
|
99
|
+
export declare function matrixGridLayout(options: MatrixGridOptions): MatrixGridLayout;
|
|
100
|
+
export interface ParallelAxisInput {
|
|
101
|
+
key: string;
|
|
102
|
+
label: string;
|
|
103
|
+
min: number;
|
|
104
|
+
max: number;
|
|
105
|
+
}
|
|
106
|
+
export interface ParallelRecordInput {
|
|
107
|
+
/** Values aligned positionally to the axes array. */
|
|
108
|
+
values: readonly number[];
|
|
109
|
+
segment?: string | undefined;
|
|
110
|
+
}
|
|
111
|
+
export interface ParallelPath {
|
|
112
|
+
index: number;
|
|
113
|
+
path: string;
|
|
114
|
+
segment: string | undefined;
|
|
115
|
+
}
|
|
116
|
+
export interface ParallelLayout {
|
|
117
|
+
axisX: number[];
|
|
118
|
+
yTop: number;
|
|
119
|
+
yBottom: number;
|
|
120
|
+
paths: ParallelPath[];
|
|
121
|
+
segments: string[];
|
|
122
|
+
yForAxis: (axisIndex: number, value: number) => number;
|
|
123
|
+
}
|
|
124
|
+
export interface ParallelLayoutOptions {
|
|
125
|
+
width: number;
|
|
126
|
+
height: number;
|
|
127
|
+
/** Inline-direction mirroring; defaults to LTR (false). */
|
|
128
|
+
rtl?: boolean;
|
|
129
|
+
/** Vertical inset for axis top/bottom (default 8). */
|
|
130
|
+
padY?: number;
|
|
131
|
+
}
|
|
132
|
+
/**
|
|
133
|
+
* Evenly spaced vertical axes with one polyline per record. Axis order mirrors
|
|
134
|
+
* in RTL (first axis at inline-start). Each value is normalised within its
|
|
135
|
+
* axis's [min, max] onto the shared vertical extent (pixel-down).
|
|
136
|
+
*/
|
|
137
|
+
export declare function parallelLayout(axes: readonly ParallelAxisInput[], records: readonly ParallelRecordInput[], options: ParallelLayoutOptions): ParallelLayout;
|
|
138
|
+
//# sourceMappingURL=correlation.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"correlation.d.ts","sourceRoot":"","sources":["../../src/geometry/correlation.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,161 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Pure, DOM-free layout for the correlation charts (research/widget-registry.md
|
|
3
|
+
* §2): `chart-scatter-bubble`, `chart-hexbin`, `chart-correlation-matrix`,
|
|
4
|
+
* `chart-parallel-coordinates`. Server-safe (04 §7.1). Horizontal value /
|
|
5
|
+
* grid / axis order mirrors in RTL; the vertical value axis stays pixel-down.
|
|
6
|
+
*/
|
|
7
|
+
import { linePath } from './lineArea.js';
|
|
8
|
+
import { extent, niceTicks } from '../utils/stats.js';
|
|
9
|
+
import { valueAxis } from './distribution.js';
|
|
10
|
+
/** Least-squares fit over data-space points; null when < 2 points or flat x. */
|
|
11
|
+
function leastSquares(points) {
|
|
12
|
+
const n = points.length;
|
|
13
|
+
if (n < 2)
|
|
14
|
+
return null;
|
|
15
|
+
let sx = 0;
|
|
16
|
+
let sy = 0;
|
|
17
|
+
let sxx = 0;
|
|
18
|
+
let sxy = 0;
|
|
19
|
+
for (const p of points) {
|
|
20
|
+
sx += p.x;
|
|
21
|
+
sy += p.y;
|
|
22
|
+
sxx += p.x * p.x;
|
|
23
|
+
sxy += p.x * p.y;
|
|
24
|
+
}
|
|
25
|
+
const denom = n * sxx - sx * sx;
|
|
26
|
+
if (denom === 0)
|
|
27
|
+
return null;
|
|
28
|
+
const slope = (n * sxy - sx * sy) / denom;
|
|
29
|
+
const intercept = (sy - slope * sx) / n;
|
|
30
|
+
return { slope, intercept };
|
|
31
|
+
}
|
|
32
|
+
/**
|
|
33
|
+
* Scatter with an optional bubble-radius dimension, gridlines, distinct-segment
|
|
34
|
+
* legend, and a dashed least-squares trend line. The x value axis mirrors in
|
|
35
|
+
* RTL (range flip); y stays pixel-down. Bubble radius scales from the `r`
|
|
36
|
+
* extent so tests can assert a stable ordering.
|
|
37
|
+
*/
|
|
38
|
+
export function scatterLayout(points, options) {
|
|
39
|
+
const { width, height, rtl, radiusRange = [3, 15], fixedRadius = 4, trendLine = true, tickCount = 4 } = options;
|
|
40
|
+
const xDomain = niceTicks(...(extent(points.map((p) => p.x)) ?? [0, 1]), tickCount);
|
|
41
|
+
const xLo = xDomain[0] ?? 0;
|
|
42
|
+
const xHi = xDomain.at(-1) ?? 1;
|
|
43
|
+
const xSpan = xHi - xLo || 1;
|
|
44
|
+
const xFor = (value) => {
|
|
45
|
+
const t = (value - xLo) / xSpan;
|
|
46
|
+
return rtl ? width - t * width : t * width;
|
|
47
|
+
};
|
|
48
|
+
const yAxis = valueAxis(points.map((p) => p.y), height, tickCount);
|
|
49
|
+
const sized = points.some((p) => typeof p.r === 'number');
|
|
50
|
+
const [rMin, rMax] = radiusRange;
|
|
51
|
+
const rExtent = extent(points.map((p) => p.r ?? 0));
|
|
52
|
+
const rLo = rExtent?.[0] ?? 0;
|
|
53
|
+
const rHi = rExtent?.[1] ?? 1;
|
|
54
|
+
const rSpan = rHi - rLo || 1;
|
|
55
|
+
const radiusFor = (r) => {
|
|
56
|
+
if (!sized || r === undefined)
|
|
57
|
+
return fixedRadius;
|
|
58
|
+
return rMin + ((r - rLo) / rSpan) * (rMax - rMin);
|
|
59
|
+
};
|
|
60
|
+
const segments = [];
|
|
61
|
+
const marks = points.map((p, index) => {
|
|
62
|
+
if (p.segment !== undefined && !segments.includes(p.segment))
|
|
63
|
+
segments.push(p.segment);
|
|
64
|
+
return { index, cx: xFor(p.x), cy: yAxis.yFor(p.y), r: radiusFor(p.r), segment: p.segment };
|
|
65
|
+
});
|
|
66
|
+
let trend = null;
|
|
67
|
+
if (trendLine) {
|
|
68
|
+
const fit = leastSquares(points);
|
|
69
|
+
if (fit !== null) {
|
|
70
|
+
trend = {
|
|
71
|
+
x1: xFor(xLo),
|
|
72
|
+
y1: yAxis.yFor(fit.slope * xLo + fit.intercept),
|
|
73
|
+
x2: xFor(xHi),
|
|
74
|
+
y2: yAxis.yFor(fit.slope * xHi + fit.intercept),
|
|
75
|
+
};
|
|
76
|
+
}
|
|
77
|
+
}
|
|
78
|
+
return { marks, xTicks: xDomain, yTicks: yAxis.yTicks, xFor, yFor: yAxis.yFor, trend, segments };
|
|
79
|
+
}
|
|
80
|
+
const SQRT3 = Math.sqrt(3);
|
|
81
|
+
/**
|
|
82
|
+
* Pointy-top hex-grid centers fitted to the box. Odd rows offset by half a
|
|
83
|
+
* column so the tessellation interlocks; columns mirror in RTL. Callers map a
|
|
84
|
+
* per-cell count to fill alpha and omit sparse (null/0) cells (annex §2).
|
|
85
|
+
*/
|
|
86
|
+
export function hexbinLayout(options) {
|
|
87
|
+
const { rows, cols, width, height, rtl } = options;
|
|
88
|
+
const safeCols = Math.max(1, cols);
|
|
89
|
+
const safeRows = Math.max(1, rows);
|
|
90
|
+
// Pointy-top: horizontal pitch = √3·r, vertical pitch = 1.5·r, odd-row shift = √3/2·r.
|
|
91
|
+
const rByWidth = width / (SQRT3 * (safeCols + 0.5));
|
|
92
|
+
const rByHeight = height / (1.5 * safeRows + 0.5);
|
|
93
|
+
const radius = Math.max(1, Math.min(rByWidth, rByHeight));
|
|
94
|
+
const hpitch = SQRT3 * radius;
|
|
95
|
+
const vpitch = 1.5 * radius;
|
|
96
|
+
const cells = [];
|
|
97
|
+
for (let row = 0; row < safeRows; row += 1) {
|
|
98
|
+
for (let col = 0; col < safeCols; col += 1) {
|
|
99
|
+
const offset = row % 2 === 1 ? hpitch / 2 : 0;
|
|
100
|
+
const rawX = radius * (SQRT3 / 2) + offset + col * hpitch;
|
|
101
|
+
const cx = rtl ? width - rawX : rawX;
|
|
102
|
+
const cy = radius + row * vpitch;
|
|
103
|
+
cells.push({ row, col, cx, cy });
|
|
104
|
+
}
|
|
105
|
+
}
|
|
106
|
+
const hexPoints = (cx, cy) => Array.from({ length: 6 }, (_, k) => {
|
|
107
|
+
const angle = (Math.PI / 180) * (60 * k - 90);
|
|
108
|
+
return `${(cx + radius * Math.cos(angle)).toFixed(3)},${(cy + radius * Math.sin(angle)).toFixed(3)}`;
|
|
109
|
+
}).join(' ');
|
|
110
|
+
return { cells, radius, hexPoints };
|
|
111
|
+
}
|
|
112
|
+
/** Uniform cell grid; column order mirrors in RTL, rows stay top→bottom. */
|
|
113
|
+
export function matrixGridLayout(options) {
|
|
114
|
+
const { rows, cols, width, height, rtl, gap = 2 } = options;
|
|
115
|
+
const safeCols = Math.max(1, cols);
|
|
116
|
+
const safeRows = Math.max(1, rows);
|
|
117
|
+
const cellW = (width - gap * (safeCols - 1)) / safeCols;
|
|
118
|
+
const cellH = (height - gap * (safeRows - 1)) / safeRows;
|
|
119
|
+
const colX = (col) => (rtl ? safeCols - 1 - col : col) * (cellW + gap);
|
|
120
|
+
const rowY = (row) => row * (cellH + gap);
|
|
121
|
+
const cells = [];
|
|
122
|
+
for (let row = 0; row < safeRows; row += 1) {
|
|
123
|
+
for (let col = 0; col < safeCols; col += 1) {
|
|
124
|
+
cells.push({ row, col, x: colX(col), y: rowY(row), w: Math.max(0, cellW), h: Math.max(0, cellH) });
|
|
125
|
+
}
|
|
126
|
+
}
|
|
127
|
+
return { cells, cellW, cellH, colX, rowY };
|
|
128
|
+
}
|
|
129
|
+
/**
|
|
130
|
+
* Evenly spaced vertical axes with one polyline per record. Axis order mirrors
|
|
131
|
+
* in RTL (first axis at inline-start). Each value is normalised within its
|
|
132
|
+
* axis's [min, max] onto the shared vertical extent (pixel-down).
|
|
133
|
+
*/
|
|
134
|
+
export function parallelLayout(axes, records, options) {
|
|
135
|
+
const { width, height, rtl = false, padY = 8 } = options;
|
|
136
|
+
const count = axes.length;
|
|
137
|
+
const yTop = padY;
|
|
138
|
+
const yBottom = height - padY;
|
|
139
|
+
const span = yBottom - yTop || 1;
|
|
140
|
+
const axisX = axes.map((_, i) => {
|
|
141
|
+
const t = count <= 1 ? 0.5 : i / (count - 1);
|
|
142
|
+
return rtl ? width - t * width : t * width;
|
|
143
|
+
});
|
|
144
|
+
const yForAxis = (axisIndex, value) => {
|
|
145
|
+
const axis = axes[axisIndex];
|
|
146
|
+
if (axis === undefined)
|
|
147
|
+
return yBottom;
|
|
148
|
+
const range = axis.max - axis.min || 1;
|
|
149
|
+
const t = (value - axis.min) / range;
|
|
150
|
+
return yBottom - t * span;
|
|
151
|
+
};
|
|
152
|
+
const segments = [];
|
|
153
|
+
const paths = records.map((record, index) => {
|
|
154
|
+
if (record.segment !== undefined && !segments.includes(record.segment))
|
|
155
|
+
segments.push(record.segment);
|
|
156
|
+
const points = axes.map((_, i) => ({ x: axisX[i] ?? 0, y: yForAxis(i, record.values[i] ?? 0) }));
|
|
157
|
+
return { index, path: linePath(points) ?? '', segment: record.segment };
|
|
158
|
+
});
|
|
159
|
+
return { axisX, yTop, yBottom, paths, segments, yForAxis };
|
|
160
|
+
}
|
|
161
|
+
//# sourceMappingURL=correlation.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"correlation.js","sourceRoot":"","sources":["../../src/geometry/correlation.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,115 @@
|
|
|
1
|
+
/** Shared value → pixel mapping (pixel-down) over a nice-tick domain. */
|
|
2
|
+
export interface ValueAxis {
|
|
3
|
+
yTicks: number[];
|
|
4
|
+
yFor: (value: number) => number;
|
|
5
|
+
domain: [number, number];
|
|
6
|
+
}
|
|
7
|
+
/** Linear, pixel-down value axis padded to round ticks. */
|
|
8
|
+
export declare function valueAxis(values: readonly number[], height: number, tickCount?: number): ValueAxis;
|
|
9
|
+
export interface BoxplotGroupInput {
|
|
10
|
+
label: string;
|
|
11
|
+
min: number;
|
|
12
|
+
q1: number;
|
|
13
|
+
med: number;
|
|
14
|
+
q3: number;
|
|
15
|
+
max: number;
|
|
16
|
+
}
|
|
17
|
+
export interface BoxplotBox {
|
|
18
|
+
label: string;
|
|
19
|
+
centerX: number;
|
|
20
|
+
boxX: number;
|
|
21
|
+
boxWidth: number;
|
|
22
|
+
yMin: number;
|
|
23
|
+
yQ1: number;
|
|
24
|
+
yMed: number;
|
|
25
|
+
yQ3: number;
|
|
26
|
+
yMax: number;
|
|
27
|
+
}
|
|
28
|
+
export interface BoxplotLayout {
|
|
29
|
+
boxes: BoxplotBox[];
|
|
30
|
+
yTicks: number[];
|
|
31
|
+
yFor: (value: number) => number;
|
|
32
|
+
bandwidth: number;
|
|
33
|
+
}
|
|
34
|
+
export interface BoxplotLayoutOptions {
|
|
35
|
+
width: number;
|
|
36
|
+
height: number;
|
|
37
|
+
rtl: boolean;
|
|
38
|
+
/** Box width as a fraction of the band (default 0.55). */
|
|
39
|
+
boxFraction?: number;
|
|
40
|
+
tickCount?: number;
|
|
41
|
+
}
|
|
42
|
+
/** Whisker/box/median geometry per category; value axis from all five stats. */
|
|
43
|
+
export declare function boxplotLayout(groups: readonly BoxplotGroupInput[], options: BoxplotLayoutOptions): BoxplotLayout;
|
|
44
|
+
export interface ViolinGroupInput {
|
|
45
|
+
label: string;
|
|
46
|
+
min: number;
|
|
47
|
+
max: number;
|
|
48
|
+
med: number;
|
|
49
|
+
density: readonly number[];
|
|
50
|
+
}
|
|
51
|
+
export interface ViolinShape {
|
|
52
|
+
label: string;
|
|
53
|
+
centerX: number;
|
|
54
|
+
/** Closed outline path (right side top→bottom, left side bottom→top, Z). */
|
|
55
|
+
path: string;
|
|
56
|
+
medY: number;
|
|
57
|
+
}
|
|
58
|
+
export interface ViolinLayout {
|
|
59
|
+
violins: ViolinShape[];
|
|
60
|
+
yTicks: number[];
|
|
61
|
+
yFor: (value: number) => number;
|
|
62
|
+
bandwidth: number;
|
|
63
|
+
}
|
|
64
|
+
export interface ViolinLayoutOptions {
|
|
65
|
+
width: number;
|
|
66
|
+
height: number;
|
|
67
|
+
rtl: boolean;
|
|
68
|
+
/** Max half-width as a fraction of the band (default 0.42). */
|
|
69
|
+
halfWidthFraction?: number;
|
|
70
|
+
tickCount?: number;
|
|
71
|
+
}
|
|
72
|
+
/**
|
|
73
|
+
* Mirrored density profile per group. Each density array is normalised by its
|
|
74
|
+
* own peak so every violin fills the band half-width; the sample index maps
|
|
75
|
+
* linearly across the group's [min, max] onto the shared value axis.
|
|
76
|
+
*/
|
|
77
|
+
export declare function violinLayout(groups: readonly ViolinGroupInput[], options: ViolinLayoutOptions): ViolinLayout;
|
|
78
|
+
export interface RidgeGroupInput {
|
|
79
|
+
label: string;
|
|
80
|
+
density: readonly number[];
|
|
81
|
+
}
|
|
82
|
+
export interface RidgeRow {
|
|
83
|
+
label: string;
|
|
84
|
+
areaPath: string;
|
|
85
|
+
linePath: string;
|
|
86
|
+
baselineY: number;
|
|
87
|
+
labelY: number;
|
|
88
|
+
/** Decreasing entrance/fill alpha from front (1) to back rows. */
|
|
89
|
+
alpha: number;
|
|
90
|
+
}
|
|
91
|
+
export interface RidgelineLayout {
|
|
92
|
+
rows: RidgeRow[];
|
|
93
|
+
/** Inline-start x where the density profile begins (gutter for labels). */
|
|
94
|
+
plotStart: number;
|
|
95
|
+
plotEnd: number;
|
|
96
|
+
}
|
|
97
|
+
export interface RidgelineLayoutOptions {
|
|
98
|
+
width: number;
|
|
99
|
+
height: number;
|
|
100
|
+
rtl: boolean;
|
|
101
|
+
/** Peak height as a multiple of the row step (overlap into rows above). */
|
|
102
|
+
overlap?: number;
|
|
103
|
+
/** Inline-start gutter reserved for group labels (default 52). */
|
|
104
|
+
labelGutter?: number;
|
|
105
|
+
/** Minimum ridge alpha for the back row (default 0.35). */
|
|
106
|
+
minAlpha?: number;
|
|
107
|
+
}
|
|
108
|
+
/**
|
|
109
|
+
* Overlapping filled density ridges, front row first. Densities share one
|
|
110
|
+
* global peak so ridges are comparable; the value axis runs across the plot
|
|
111
|
+
* width and mirrors in RTL. Rows stack top→bottom with the front (first) row
|
|
112
|
+
* at the bottom, so later ridges overlap upward with decreasing alpha.
|
|
113
|
+
*/
|
|
114
|
+
export declare function ridgelineLayout(groups: readonly RidgeGroupInput[], options: RidgelineLayoutOptions): RidgelineLayout;
|
|
115
|
+
//# sourceMappingURL=distribution.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"distribution.d.ts","sourceRoot":"","sources":["../../src/geometry/distribution.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,131 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Pure, DOM-free layout for the distribution charts (research/widget-registry.md
|
|
3
|
+
* §2): `chart-boxplot`, `chart-violin`, `chart-ridgeline`. Server-safe so
|
|
4
|
+
* scheduled-report workers reuse the exact path strings the browser renders
|
|
5
|
+
* (04 §7.1). Categorical group axes mirror in RTL via the shared band scale;
|
|
6
|
+
* the value axis stays pixel-down. d3-scale/d3-shape math only.
|
|
7
|
+
*/
|
|
8
|
+
import { categoricalBandScale } from './scales.js';
|
|
9
|
+
import { linePath } from './lineArea.js';
|
|
10
|
+
import { extent, niceTicks } from '../utils/stats.js';
|
|
11
|
+
/** Linear, pixel-down value axis padded to round ticks. */
|
|
12
|
+
export function valueAxis(values, height, tickCount = 4) {
|
|
13
|
+
const [lo, hi] = extent(values) ?? [0, 1];
|
|
14
|
+
const ticks = lo === hi ? [lo, lo + 1] : niceTicks(lo, hi, tickCount);
|
|
15
|
+
const domainLo = ticks[0] ?? lo;
|
|
16
|
+
const domainHi = ticks.at(-1) ?? hi + 1;
|
|
17
|
+
const span = domainHi - domainLo || 1;
|
|
18
|
+
return {
|
|
19
|
+
yTicks: ticks,
|
|
20
|
+
domain: [domainLo, domainHi],
|
|
21
|
+
yFor: (value) => height - ((value - domainLo) / span) * height,
|
|
22
|
+
};
|
|
23
|
+
}
|
|
24
|
+
/** Whisker/box/median geometry per category; value axis from all five stats. */
|
|
25
|
+
export function boxplotLayout(groups, options) {
|
|
26
|
+
const { width, height, rtl, boxFraction = 0.55, tickCount = 4 } = options;
|
|
27
|
+
const axis = valueAxis(groups.flatMap((g) => [g.min, g.max]), height, tickCount);
|
|
28
|
+
const band = categoricalBandScale(groups.map((g) => g.label), width, rtl, { paddingInner: 0.4, paddingOuter: 0.25 });
|
|
29
|
+
const bandwidth = band.bandwidth();
|
|
30
|
+
const boxWidth = Math.max(1, bandwidth * boxFraction);
|
|
31
|
+
const boxes = [];
|
|
32
|
+
for (const group of groups) {
|
|
33
|
+
const bandStart = band(group.label);
|
|
34
|
+
if (bandStart === undefined)
|
|
35
|
+
continue;
|
|
36
|
+
const centerX = bandStart + bandwidth / 2;
|
|
37
|
+
boxes.push({
|
|
38
|
+
label: group.label,
|
|
39
|
+
centerX,
|
|
40
|
+
boxX: centerX - boxWidth / 2,
|
|
41
|
+
boxWidth,
|
|
42
|
+
yMin: axis.yFor(group.min),
|
|
43
|
+
yQ1: axis.yFor(group.q1),
|
|
44
|
+
yMed: axis.yFor(group.med),
|
|
45
|
+
yQ3: axis.yFor(group.q3),
|
|
46
|
+
yMax: axis.yFor(group.max),
|
|
47
|
+
});
|
|
48
|
+
}
|
|
49
|
+
return { boxes, yTicks: axis.yTicks, yFor: axis.yFor, bandwidth };
|
|
50
|
+
}
|
|
51
|
+
/**
|
|
52
|
+
* Mirrored density profile per group. Each density array is normalised by its
|
|
53
|
+
* own peak so every violin fills the band half-width; the sample index maps
|
|
54
|
+
* linearly across the group's [min, max] onto the shared value axis.
|
|
55
|
+
*/
|
|
56
|
+
export function violinLayout(groups, options) {
|
|
57
|
+
const { width, height, rtl, halfWidthFraction = 0.42, tickCount = 4 } = options;
|
|
58
|
+
const axis = valueAxis(groups.flatMap((g) => [g.min, g.max]), height, tickCount);
|
|
59
|
+
const band = categoricalBandScale(groups.map((g) => g.label), width, rtl, { paddingInner: 0.35, paddingOuter: 0.2 });
|
|
60
|
+
const bandwidth = band.bandwidth();
|
|
61
|
+
const halfWidth = Math.max(1, (bandwidth / 2) * halfWidthFraction);
|
|
62
|
+
const violins = [];
|
|
63
|
+
for (const group of groups) {
|
|
64
|
+
const bandStart = band(group.label);
|
|
65
|
+
if (bandStart === undefined)
|
|
66
|
+
continue;
|
|
67
|
+
const centerX = bandStart + bandwidth / 2;
|
|
68
|
+
const n = group.density.length;
|
|
69
|
+
const peak = Math.max(...group.density, 1e-9);
|
|
70
|
+
const valueAt = (i) => n <= 1 ? group.min : group.min + (i / (n - 1)) * (group.max - group.min);
|
|
71
|
+
// Right side top→bottom, then left side bottom→top → closed polygon.
|
|
72
|
+
const right = group.density.map((d, i) => ({
|
|
73
|
+
x: centerX + (d / peak) * halfWidth,
|
|
74
|
+
y: axis.yFor(valueAt(i)),
|
|
75
|
+
}));
|
|
76
|
+
const left = [...group.density]
|
|
77
|
+
.map((d, i) => ({ x: centerX - (d / peak) * halfWidth, y: axis.yFor(valueAt(i)) }))
|
|
78
|
+
.reverse();
|
|
79
|
+
const outline = [...right, ...left];
|
|
80
|
+
const path = outline.length > 0 ? `${linePath(outline) ?? ''}Z` : '';
|
|
81
|
+
violins.push({ label: group.label, centerX, path, medY: axis.yFor(group.med) });
|
|
82
|
+
}
|
|
83
|
+
return { violins, yTicks: axis.yTicks, yFor: axis.yFor, bandwidth };
|
|
84
|
+
}
|
|
85
|
+
/**
|
|
86
|
+
* Overlapping filled density ridges, front row first. Densities share one
|
|
87
|
+
* global peak so ridges are comparable; the value axis runs across the plot
|
|
88
|
+
* width and mirrors in RTL. Rows stack top→bottom with the front (first) row
|
|
89
|
+
* at the bottom, so later ridges overlap upward with decreasing alpha.
|
|
90
|
+
*/
|
|
91
|
+
export function ridgelineLayout(groups, options) {
|
|
92
|
+
const { width, height, rtl, overlap = 1.5, labelGutter = 52, minAlpha = 0.35 } = options;
|
|
93
|
+
const count = groups.length;
|
|
94
|
+
const plotStart = rtl ? 0 : labelGutter;
|
|
95
|
+
const plotEnd = rtl ? width - labelGutter : width;
|
|
96
|
+
const plotWidth = Math.max(1, plotEnd - plotStart);
|
|
97
|
+
const globalPeak = Math.max(...groups.flatMap((g) => [...g.density]), 1e-9);
|
|
98
|
+
const rowStep = count > 0 ? height / count : height;
|
|
99
|
+
const peakHeight = rowStep * overlap;
|
|
100
|
+
const xAt = (i, n) => {
|
|
101
|
+
const t = n <= 1 ? 0 : i / (n - 1);
|
|
102
|
+
return rtl ? plotEnd - t * plotWidth : plotStart + t * plotWidth;
|
|
103
|
+
};
|
|
104
|
+
const rows = groups.map((group, g) => {
|
|
105
|
+
// Front row (g=0) sits lowest; rows stack upward.
|
|
106
|
+
const baselineY = height - g * rowStep;
|
|
107
|
+
const n = group.density.length;
|
|
108
|
+
const top = group.density.map((d, i) => ({
|
|
109
|
+
x: xAt(i, n),
|
|
110
|
+
y: baselineY - (d / globalPeak) * peakHeight,
|
|
111
|
+
}));
|
|
112
|
+
const line = linePath(top) ?? '';
|
|
113
|
+
// Area: top outline then back along the baseline, closed.
|
|
114
|
+
const first = top[0];
|
|
115
|
+
const last = top.at(-1);
|
|
116
|
+
const area = line === '' || first === undefined || last === undefined
|
|
117
|
+
? ''
|
|
118
|
+
: `${line}L${last.x},${baselineY}L${first.x},${baselineY}Z`;
|
|
119
|
+
const alpha = count <= 1 ? 1 : 1 - (g / (count - 1)) * (1 - minAlpha);
|
|
120
|
+
return {
|
|
121
|
+
label: group.label,
|
|
122
|
+
areaPath: area,
|
|
123
|
+
linePath: line,
|
|
124
|
+
baselineY,
|
|
125
|
+
labelY: baselineY - 4,
|
|
126
|
+
alpha,
|
|
127
|
+
};
|
|
128
|
+
});
|
|
129
|
+
return { rows, plotStart, plotEnd };
|
|
130
|
+
}
|
|
131
|
+
//# sourceMappingURL=distribution.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"distribution.js","sourceRoot":"","sources":["../../src/geometry/distribution.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
export interface DonutSliceInput {
|
|
2
|
+
label: string;
|
|
3
|
+
value: number;
|
|
4
|
+
}
|
|
5
|
+
export interface DonutArcDatum {
|
|
6
|
+
label: string;
|
|
7
|
+
value: number;
|
|
8
|
+
/** Fraction of total, 0..1. */
|
|
9
|
+
share: number;
|
|
10
|
+
/** SVG path centered on (0,0). */
|
|
11
|
+
path: string;
|
|
12
|
+
/** CSS color expression — `var(--viz-N)` cycling; the other bucket is neutral. */
|
|
13
|
+
colorVar: string;
|
|
14
|
+
isOther: boolean;
|
|
15
|
+
}
|
|
16
|
+
/** Aggregate slices beyond `maxSlices` into a trailing "other" bucket. */
|
|
17
|
+
export declare function bucketSlices(slices: readonly DonutSliceInput[], maxSlices: number, otherLabel?: string): {
|
|
18
|
+
slices: DonutSliceInput[];
|
|
19
|
+
otherIndex: number;
|
|
20
|
+
};
|
|
21
|
+
export interface DonutArcsOptions {
|
|
22
|
+
outerRadius: number;
|
|
23
|
+
/** Ring thickness in px. */
|
|
24
|
+
thickness: number;
|
|
25
|
+
padAngle?: number;
|
|
26
|
+
cornerRadius?: number;
|
|
27
|
+
maxSlices?: number;
|
|
28
|
+
otherLabel?: string;
|
|
29
|
+
}
|
|
30
|
+
/**
|
|
31
|
+
* Donut arcs in input order (no value sort — legend order matches data).
|
|
32
|
+
* Rotation is always clockwise from 12 o'clock; per the RTL rules
|
|
33
|
+
* (10-i18n-theming.md §5.5) rotation direction does NOT change in RTL — only
|
|
34
|
+
* the surrounding legend/center layout mirrors, which is plain flex/logical CSS.
|
|
35
|
+
*/
|
|
36
|
+
export declare function donutArcs(slices: readonly DonutSliceInput[], options: DonutArcsOptions): DonutArcDatum[];
|
|
37
|
+
//# sourceMappingURL=donut.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"donut.d.ts","sourceRoot":"","sources":["../../src/geometry/donut.ts"],"names":[],"mappings":"AAGA,MAAM,WAAW,eAAe;IAC9B,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,EAAE,MAAM,CAAC;CACf;AAED,MAAM,WAAW,aAAa;IAC5B,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,EAAE,MAAM,CAAC;IACd,+BAA+B;IAC/B,KAAK,EAAE,MAAM,CAAC;IACd,kCAAkC;IAClC,IAAI,EAAE,MAAM,CAAC;IACb,kFAAkF;IAClF,QAAQ,EAAE,MAAM,CAAC;IACjB,OAAO,EAAE,OAAO,CAAC;CAClB;AAED,0EAA0E;AAC1E,wBAAgB,YAAY,CAC1B,MAAM,EAAE,SAAS,eAAe,EAAE,EAClC,SAAS,EAAE,MAAM,EACjB,UAAU,SAAU,GACnB;IAAE,MAAM,EAAE,eAAe,EAAE,CAAC;IAAC,UAAU,EAAE,MAAM,CAAA;CAAE,CAOnD;AAED,MAAM,WAAW,gBAAgB;IAC/B,WAAW,EAAE,MAAM,CAAC;IACpB,4BAA4B;IAC5B,SAAS,EAAE,MAAM,CAAC;IAClB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB;AAED;;;;;GAKG;AACH,wBAAgB,SAAS,CAAC,MAAM,EAAE,SAAS,eAAe,EAAE,EAAE,OAAO,EAAE,gBAAgB,GAAG,aAAa,EAAE,CA4BxG"}
|