@chipmobilesdk/rn-chart 0.4.0 → 0.5.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +111 -0
- package/README.md +1 -1
- package/lib/commonjs/a11y/summary.js +190 -0
- package/lib/commonjs/a11y/summary.js.map +1 -0
- package/lib/commonjs/contract/datasource.js +64 -0
- package/lib/commonjs/contract/datasource.js.map +1 -0
- package/lib/commonjs/contract/distribution.js +45 -0
- package/lib/commonjs/contract/distribution.js.map +1 -0
- package/lib/commonjs/contract/errors.js +88 -0
- package/lib/commonjs/contract/errors.js.map +1 -0
- package/lib/commonjs/contract/format.js +133 -0
- package/lib/commonjs/contract/format.js.map +1 -0
- package/lib/commonjs/contract/interaction.js +24 -0
- package/lib/commonjs/contract/interaction.js.map +1 -0
- package/lib/commonjs/contract/marker.js +55 -0
- package/lib/commonjs/contract/marker.js.map +1 -0
- package/lib/commonjs/contract/props.js +6 -0
- package/lib/commonjs/contract/props.js.map +1 -0
- package/lib/commonjs/contract/state.js +68 -0
- package/lib/commonjs/contract/state.js.map +1 -0
- package/lib/commonjs/contract/strings.js +54 -0
- package/lib/commonjs/contract/strings.js.map +1 -0
- package/lib/commonjs/contract/theme.js +116 -0
- package/lib/commonjs/contract/theme.js.map +1 -0
- package/lib/commonjs/contract/value.js +112 -0
- package/lib/commonjs/contract/value.js.map +1 -0
- package/lib/commonjs/geometry/bar.js +257 -0
- package/lib/commonjs/geometry/bar.js.map +1 -0
- package/lib/commonjs/geometry/distribution.js +197 -0
- package/lib/commonjs/geometry/distribution.js.map +1 -0
- package/lib/commonjs/geometry/heatmap.js +186 -0
- package/lib/commonjs/geometry/heatmap.js.map +1 -0
- package/lib/commonjs/geometry/hitTest.js +117 -0
- package/lib/commonjs/geometry/hitTest.js.map +1 -0
- package/lib/commonjs/geometry/layout.js +134 -0
- package/lib/commonjs/geometry/layout.js.map +1 -0
- package/lib/commonjs/geometry/markers.js +59 -0
- package/lib/commonjs/geometry/markers.js.map +1 -0
- package/lib/commonjs/geometry/path.js +166 -0
- package/lib/commonjs/geometry/path.js.map +1 -0
- package/lib/commonjs/geometry/progress.js +203 -0
- package/lib/commonjs/geometry/progress.js.map +1 -0
- package/lib/commonjs/geometry/scale.js +127 -0
- package/lib/commonjs/geometry/scale.js.map +1 -0
- package/lib/commonjs/geometry/ticks.js +120 -0
- package/lib/commonjs/geometry/ticks.js.map +1 -0
- package/lib/commonjs/geometry/timeSeries.js +157 -0
- package/lib/commonjs/geometry/timeSeries.js.map +1 -0
- package/lib/commonjs/geometry/types.js +43 -0
- package/lib/commonjs/geometry/types.js.map +1 -0
- package/lib/commonjs/index.js +284 -0
- package/lib/commonjs/index.js.map +1 -0
- package/lib/commonjs/package.json +1 -0
- package/lib/commonjs/react/ChartBoundary.js +82 -0
- package/lib/commonjs/react/ChartBoundary.js.map +1 -0
- package/lib/commonjs/react/ChartFrame.js +270 -0
- package/lib/commonjs/react/ChartFrame.js.map +1 -0
- package/lib/commonjs/react/ChartLegend.js +242 -0
- package/lib/commonjs/react/ChartLegend.js.map +1 -0
- package/lib/commonjs/react/ChartPlot.js +62 -0
- package/lib/commonjs/react/ChartPlot.js.map +1 -0
- package/lib/commonjs/react/ChartStateOverlay.js +89 -0
- package/lib/commonjs/react/ChartStateOverlay.js.map +1 -0
- package/lib/commonjs/react/ChartThemeProvider.js +51 -0
- package/lib/commonjs/react/ChartThemeProvider.js.map +1 -0
- package/lib/commonjs/react/charts.js +108 -0
- package/lib/commonjs/react/charts.js.map +1 -0
- package/lib/commonjs/react/pointEvent.js +35 -0
- package/lib/commonjs/react/pointEvent.js.map +1 -0
- package/lib/commonjs/react/useChartA11y.js +97 -0
- package/lib/commonjs/react/useChartA11y.js.map +1 -0
- package/lib/commonjs/react/useChartFormatters.js +66 -0
- package/lib/commonjs/react/useChartFormatters.js.map +1 -0
- package/lib/commonjs/react/useChartLayout.js +100 -0
- package/lib/commonjs/react/useChartLayout.js.map +1 -0
- package/lib/commonjs/react/useChartSelection.js +131 -0
- package/lib/commonjs/react/useChartSelection.js.map +1 -0
- package/lib/commonjs/react/useChartStatus.js +74 -0
- package/lib/commonjs/react/useChartStatus.js.map +1 -0
- package/lib/commonjs/render/Axis.js +88 -0
- package/lib/commonjs/render/Axis.js.map +1 -0
- package/lib/commonjs/render/Marks.js +184 -0
- package/lib/commonjs/render/Marks.js.map +1 -0
- package/lib/commonjs/validation/budgets.js +106 -0
- package/lib/commonjs/validation/budgets.js.map +1 -0
- package/lib/commonjs/validation/validateDatasource.js +189 -0
- package/lib/commonjs/validation/validateDatasource.js.map +1 -0
- package/lib/module/a11y/summary.js +184 -0
- package/lib/module/a11y/summary.js.map +1 -0
- package/lib/module/contract/datasource.js +57 -0
- package/lib/module/contract/datasource.js.map +1 -0
- package/lib/module/contract/distribution.js +40 -0
- package/lib/module/contract/distribution.js.map +1 -0
- package/lib/module/contract/errors.js +80 -0
- package/lib/module/contract/errors.js.map +1 -0
- package/lib/module/contract/format.js +123 -0
- package/lib/module/contract/format.js.map +1 -0
- package/lib/module/contract/interaction.js +20 -0
- package/lib/module/contract/interaction.js.map +1 -0
- package/lib/module/contract/marker.js +49 -0
- package/lib/module/contract/marker.js.map +1 -0
- package/lib/module/contract/props.js +4 -0
- package/lib/module/contract/props.js.map +1 -0
- package/lib/module/contract/state.js +61 -0
- package/lib/module/contract/state.js.map +1 -0
- package/lib/module/contract/strings.js +49 -0
- package/lib/module/contract/strings.js.map +1 -0
- package/lib/module/contract/theme.js +109 -0
- package/lib/module/contract/theme.js.map +1 -0
- package/lib/module/contract/value.js +101 -0
- package/lib/module/contract/value.js.map +1 -0
- package/lib/module/geometry/bar.js +253 -0
- package/lib/module/geometry/bar.js.map +1 -0
- package/lib/module/geometry/distribution.js +193 -0
- package/lib/module/geometry/distribution.js.map +1 -0
- package/lib/module/geometry/heatmap.js +182 -0
- package/lib/module/geometry/heatmap.js.map +1 -0
- package/lib/module/geometry/hitTest.js +110 -0
- package/lib/module/geometry/hitTest.js.map +1 -0
- package/lib/module/geometry/layout.js +122 -0
- package/lib/module/geometry/layout.js.map +1 -0
- package/lib/module/geometry/markers.js +53 -0
- package/lib/module/geometry/markers.js.map +1 -0
- package/lib/module/geometry/path.js +157 -0
- package/lib/module/geometry/path.js.map +1 -0
- package/lib/module/geometry/progress.js +199 -0
- package/lib/module/geometry/progress.js.map +1 -0
- package/lib/module/geometry/scale.js +119 -0
- package/lib/module/geometry/scale.js.map +1 -0
- package/lib/module/geometry/ticks.js +112 -0
- package/lib/module/geometry/ticks.js.map +1 -0
- package/lib/module/geometry/timeSeries.js +153 -0
- package/lib/module/geometry/timeSeries.js.map +1 -0
- package/lib/module/geometry/types.js +39 -0
- package/lib/module/geometry/types.js.map +1 -0
- package/lib/module/index.js +85 -0
- package/lib/module/index.js.map +1 -0
- package/lib/module/package.json +1 -0
- package/lib/module/react/ChartBoundary.js +75 -0
- package/lib/module/react/ChartBoundary.js.map +1 -0
- package/lib/module/react/ChartFrame.js +263 -0
- package/lib/module/react/ChartFrame.js.map +1 -0
- package/lib/module/react/ChartLegend.js +234 -0
- package/lib/module/react/ChartLegend.js.map +1 -0
- package/lib/module/react/ChartPlot.js +56 -0
- package/lib/module/react/ChartPlot.js.map +1 -0
- package/lib/module/react/ChartStateOverlay.js +82 -0
- package/lib/module/react/ChartStateOverlay.js.map +1 -0
- package/lib/module/react/ChartThemeProvider.js +44 -0
- package/lib/module/react/ChartThemeProvider.js.map +1 -0
- package/lib/module/react/charts.js +102 -0
- package/lib/module/react/charts.js.map +1 -0
- package/lib/module/react/pointEvent.js +30 -0
- package/lib/module/react/pointEvent.js.map +1 -0
- package/lib/module/react/useChartA11y.js +92 -0
- package/lib/module/react/useChartA11y.js.map +1 -0
- package/lib/module/react/useChartFormatters.js +61 -0
- package/lib/module/react/useChartFormatters.js.map +1 -0
- package/lib/module/react/useChartLayout.js +95 -0
- package/lib/module/react/useChartLayout.js.map +1 -0
- package/lib/module/react/useChartSelection.js +125 -0
- package/lib/module/react/useChartSelection.js.map +1 -0
- package/lib/module/react/useChartStatus.js +69 -0
- package/lib/module/react/useChartStatus.js.map +1 -0
- package/lib/module/render/Axis.js +80 -0
- package/lib/module/render/Axis.js.map +1 -0
- package/lib/module/render/Marks.js +173 -0
- package/lib/module/render/Marks.js.map +1 -0
- package/lib/module/validation/budgets.js +97 -0
- package/lib/module/validation/budgets.js.map +1 -0
- package/lib/module/validation/validateDatasource.js +184 -0
- package/lib/module/validation/validateDatasource.js.map +1 -0
- package/lib/typescript/commonjs/a11y/summary.d.ts +38 -0
- package/lib/typescript/commonjs/a11y/summary.d.ts.map +1 -0
- package/lib/typescript/commonjs/contract/datasource.d.ts +94 -0
- package/lib/typescript/commonjs/contract/datasource.d.ts.map +1 -0
- package/lib/typescript/commonjs/contract/distribution.d.ts +17 -0
- package/lib/typescript/commonjs/contract/distribution.d.ts.map +1 -0
- package/lib/typescript/commonjs/contract/errors.d.ts +53 -0
- package/lib/typescript/commonjs/contract/errors.d.ts.map +1 -0
- package/lib/typescript/commonjs/contract/format.d.ts +63 -0
- package/lib/typescript/commonjs/contract/format.d.ts.map +1 -0
- package/lib/typescript/commonjs/contract/interaction.d.ts +53 -0
- package/lib/typescript/commonjs/contract/interaction.d.ts.map +1 -0
- package/lib/typescript/commonjs/contract/marker.d.ts +39 -0
- package/lib/typescript/commonjs/contract/marker.d.ts.map +1 -0
- package/lib/typescript/commonjs/contract/props.d.ts +58 -0
- package/lib/typescript/commonjs/contract/props.d.ts.map +1 -0
- package/lib/typescript/commonjs/contract/state.d.ts +45 -0
- package/lib/typescript/commonjs/contract/state.d.ts.map +1 -0
- package/lib/typescript/commonjs/contract/strings.d.ts +39 -0
- package/lib/typescript/commonjs/contract/strings.d.ts.map +1 -0
- package/lib/typescript/commonjs/contract/theme.d.ts +85 -0
- package/lib/typescript/commonjs/contract/theme.d.ts.map +1 -0
- package/lib/typescript/commonjs/contract/value.d.ts +69 -0
- package/lib/typescript/commonjs/contract/value.d.ts.map +1 -0
- package/lib/typescript/commonjs/geometry/bar.d.ts +18 -0
- package/lib/typescript/commonjs/geometry/bar.d.ts.map +1 -0
- package/lib/typescript/commonjs/geometry/distribution.d.ts +23 -0
- package/lib/typescript/commonjs/geometry/distribution.d.ts.map +1 -0
- package/lib/typescript/commonjs/geometry/heatmap.d.ts +24 -0
- package/lib/typescript/commonjs/geometry/heatmap.d.ts.map +1 -0
- package/lib/typescript/commonjs/geometry/hitTest.d.ts +68 -0
- package/lib/typescript/commonjs/geometry/hitTest.d.ts.map +1 -0
- package/lib/typescript/commonjs/geometry/layout.d.ts +67 -0
- package/lib/typescript/commonjs/geometry/layout.d.ts.map +1 -0
- package/lib/typescript/commonjs/geometry/markers.d.ts +29 -0
- package/lib/typescript/commonjs/geometry/markers.d.ts.map +1 -0
- package/lib/typescript/commonjs/geometry/path.d.ts +66 -0
- package/lib/typescript/commonjs/geometry/path.d.ts.map +1 -0
- package/lib/typescript/commonjs/geometry/progress.d.ts +17 -0
- package/lib/typescript/commonjs/geometry/progress.d.ts.map +1 -0
- package/lib/typescript/commonjs/geometry/scale.d.ts +55 -0
- package/lib/typescript/commonjs/geometry/scale.d.ts.map +1 -0
- package/lib/typescript/commonjs/geometry/ticks.d.ts +48 -0
- package/lib/typescript/commonjs/geometry/ticks.d.ts.map +1 -0
- package/lib/typescript/commonjs/geometry/timeSeries.d.ts +20 -0
- package/lib/typescript/commonjs/geometry/timeSeries.d.ts.map +1 -0
- package/lib/typescript/commonjs/geometry/types.d.ts +91 -0
- package/lib/typescript/commonjs/geometry/types.d.ts.map +1 -0
- package/lib/typescript/commonjs/index.d.ts +47 -0
- package/lib/typescript/commonjs/index.d.ts.map +1 -0
- package/lib/typescript/commonjs/package.json +1 -0
- package/lib/typescript/commonjs/react/ChartBoundary.d.ts +47 -0
- package/lib/typescript/commonjs/react/ChartBoundary.d.ts.map +1 -0
- package/lib/typescript/commonjs/react/ChartFrame.d.ts +31 -0
- package/lib/typescript/commonjs/react/ChartFrame.d.ts.map +1 -0
- package/lib/typescript/commonjs/react/ChartLegend.d.ts +31 -0
- package/lib/typescript/commonjs/react/ChartLegend.d.ts.map +1 -0
- package/lib/typescript/commonjs/react/ChartPlot.d.ts +19 -0
- package/lib/typescript/commonjs/react/ChartPlot.d.ts.map +1 -0
- package/lib/typescript/commonjs/react/ChartStateOverlay.d.ts +25 -0
- package/lib/typescript/commonjs/react/ChartStateOverlay.d.ts.map +1 -0
- package/lib/typescript/commonjs/react/ChartThemeProvider.d.ts +21 -0
- package/lib/typescript/commonjs/react/ChartThemeProvider.d.ts.map +1 -0
- package/lib/typescript/commonjs/react/charts.d.ts +51 -0
- package/lib/typescript/commonjs/react/charts.d.ts.map +1 -0
- package/lib/typescript/commonjs/react/pointEvent.d.ts +13 -0
- package/lib/typescript/commonjs/react/pointEvent.d.ts.map +1 -0
- package/lib/typescript/commonjs/react/useChartA11y.d.ts +37 -0
- package/lib/typescript/commonjs/react/useChartA11y.d.ts.map +1 -0
- package/lib/typescript/commonjs/react/useChartFormatters.d.ts +21 -0
- package/lib/typescript/commonjs/react/useChartFormatters.d.ts.map +1 -0
- package/lib/typescript/commonjs/react/useChartLayout.d.ts +27 -0
- package/lib/typescript/commonjs/react/useChartLayout.d.ts.map +1 -0
- package/lib/typescript/commonjs/react/useChartSelection.d.ts +52 -0
- package/lib/typescript/commonjs/react/useChartSelection.d.ts.map +1 -0
- package/lib/typescript/commonjs/react/useChartStatus.d.ts +22 -0
- package/lib/typescript/commonjs/react/useChartStatus.d.ts.map +1 -0
- package/lib/typescript/commonjs/render/Axis.d.ts +31 -0
- package/lib/typescript/commonjs/render/Axis.d.ts.map +1 -0
- package/lib/typescript/commonjs/render/Marks.d.ts +44 -0
- package/lib/typescript/commonjs/render/Marks.d.ts.map +1 -0
- package/lib/typescript/commonjs/validation/budgets.d.ts +24 -0
- package/lib/typescript/commonjs/validation/budgets.d.ts.map +1 -0
- package/lib/typescript/commonjs/validation/validateDatasource.d.ts +26 -0
- package/lib/typescript/commonjs/validation/validateDatasource.d.ts.map +1 -0
- package/lib/typescript/module/a11y/summary.d.ts +38 -0
- package/lib/typescript/module/a11y/summary.d.ts.map +1 -0
- package/lib/typescript/module/contract/datasource.d.ts +94 -0
- package/lib/typescript/module/contract/datasource.d.ts.map +1 -0
- package/lib/typescript/module/contract/distribution.d.ts +17 -0
- package/lib/typescript/module/contract/distribution.d.ts.map +1 -0
- package/lib/typescript/module/contract/errors.d.ts +53 -0
- package/lib/typescript/module/contract/errors.d.ts.map +1 -0
- package/lib/typescript/module/contract/format.d.ts +63 -0
- package/lib/typescript/module/contract/format.d.ts.map +1 -0
- package/lib/typescript/module/contract/interaction.d.ts +53 -0
- package/lib/typescript/module/contract/interaction.d.ts.map +1 -0
- package/lib/typescript/module/contract/marker.d.ts +39 -0
- package/lib/typescript/module/contract/marker.d.ts.map +1 -0
- package/lib/typescript/module/contract/props.d.ts +58 -0
- package/lib/typescript/module/contract/props.d.ts.map +1 -0
- package/lib/typescript/module/contract/state.d.ts +45 -0
- package/lib/typescript/module/contract/state.d.ts.map +1 -0
- package/lib/typescript/module/contract/strings.d.ts +39 -0
- package/lib/typescript/module/contract/strings.d.ts.map +1 -0
- package/lib/typescript/module/contract/theme.d.ts +85 -0
- package/lib/typescript/module/contract/theme.d.ts.map +1 -0
- package/lib/typescript/module/contract/value.d.ts +69 -0
- package/lib/typescript/module/contract/value.d.ts.map +1 -0
- package/lib/typescript/module/geometry/bar.d.ts +18 -0
- package/lib/typescript/module/geometry/bar.d.ts.map +1 -0
- package/lib/typescript/module/geometry/distribution.d.ts +23 -0
- package/lib/typescript/module/geometry/distribution.d.ts.map +1 -0
- package/lib/typescript/module/geometry/heatmap.d.ts +24 -0
- package/lib/typescript/module/geometry/heatmap.d.ts.map +1 -0
- package/lib/typescript/module/geometry/hitTest.d.ts +68 -0
- package/lib/typescript/module/geometry/hitTest.d.ts.map +1 -0
- package/lib/typescript/module/geometry/layout.d.ts +67 -0
- package/lib/typescript/module/geometry/layout.d.ts.map +1 -0
- package/lib/typescript/module/geometry/markers.d.ts +29 -0
- package/lib/typescript/module/geometry/markers.d.ts.map +1 -0
- package/lib/typescript/module/geometry/path.d.ts +66 -0
- package/lib/typescript/module/geometry/path.d.ts.map +1 -0
- package/lib/typescript/module/geometry/progress.d.ts +17 -0
- package/lib/typescript/module/geometry/progress.d.ts.map +1 -0
- package/lib/typescript/module/geometry/scale.d.ts +55 -0
- package/lib/typescript/module/geometry/scale.d.ts.map +1 -0
- package/lib/typescript/module/geometry/ticks.d.ts +48 -0
- package/lib/typescript/module/geometry/ticks.d.ts.map +1 -0
- package/lib/typescript/module/geometry/timeSeries.d.ts +20 -0
- package/lib/typescript/module/geometry/timeSeries.d.ts.map +1 -0
- package/lib/typescript/module/geometry/types.d.ts +91 -0
- package/lib/typescript/module/geometry/types.d.ts.map +1 -0
- package/lib/typescript/module/index.d.ts +47 -0
- package/lib/typescript/module/index.d.ts.map +1 -0
- package/lib/typescript/module/package.json +1 -0
- package/lib/typescript/module/react/ChartBoundary.d.ts +47 -0
- package/lib/typescript/module/react/ChartBoundary.d.ts.map +1 -0
- package/lib/typescript/module/react/ChartFrame.d.ts +31 -0
- package/lib/typescript/module/react/ChartFrame.d.ts.map +1 -0
- package/lib/typescript/module/react/ChartLegend.d.ts +31 -0
- package/lib/typescript/module/react/ChartLegend.d.ts.map +1 -0
- package/lib/typescript/module/react/ChartPlot.d.ts +19 -0
- package/lib/typescript/module/react/ChartPlot.d.ts.map +1 -0
- package/lib/typescript/module/react/ChartStateOverlay.d.ts +25 -0
- package/lib/typescript/module/react/ChartStateOverlay.d.ts.map +1 -0
- package/lib/typescript/module/react/ChartThemeProvider.d.ts +21 -0
- package/lib/typescript/module/react/ChartThemeProvider.d.ts.map +1 -0
- package/lib/typescript/module/react/charts.d.ts +51 -0
- package/lib/typescript/module/react/charts.d.ts.map +1 -0
- package/lib/typescript/module/react/pointEvent.d.ts +13 -0
- package/lib/typescript/module/react/pointEvent.d.ts.map +1 -0
- package/lib/typescript/module/react/useChartA11y.d.ts +37 -0
- package/lib/typescript/module/react/useChartA11y.d.ts.map +1 -0
- package/lib/typescript/module/react/useChartFormatters.d.ts +21 -0
- package/lib/typescript/module/react/useChartFormatters.d.ts.map +1 -0
- package/lib/typescript/module/react/useChartLayout.d.ts +27 -0
- package/lib/typescript/module/react/useChartLayout.d.ts.map +1 -0
- package/lib/typescript/module/react/useChartSelection.d.ts +52 -0
- package/lib/typescript/module/react/useChartSelection.d.ts.map +1 -0
- package/lib/typescript/module/react/useChartStatus.d.ts +22 -0
- package/lib/typescript/module/react/useChartStatus.d.ts.map +1 -0
- package/lib/typescript/module/render/Axis.d.ts +31 -0
- package/lib/typescript/module/render/Axis.d.ts.map +1 -0
- package/lib/typescript/module/render/Marks.d.ts +44 -0
- package/lib/typescript/module/render/Marks.d.ts.map +1 -0
- package/lib/typescript/module/validation/budgets.d.ts +24 -0
- package/lib/typescript/module/validation/budgets.d.ts.map +1 -0
- package/lib/typescript/module/validation/validateDatasource.d.ts +26 -0
- package/lib/typescript/module/validation/validateDatasource.d.ts.map +1 -0
- package/package.json +40 -15
|
@@ -0,0 +1,257 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
Object.defineProperty(exports, "__esModule", {
|
|
4
|
+
value: true
|
|
5
|
+
});
|
|
6
|
+
exports.buildBarGeometry = buildBarGeometry;
|
|
7
|
+
var _value = require("../contract/value.js");
|
|
8
|
+
var _layout = require("./layout.js");
|
|
9
|
+
var _markers = require("./markers.js");
|
|
10
|
+
var _path = require("./path.js");
|
|
11
|
+
var _scale = require("./scale.js");
|
|
12
|
+
var _ticks = require("./ticks.js");
|
|
13
|
+
/**
|
|
14
|
+
* Bar geometry: one batched path per series, grouped or stacked.
|
|
15
|
+
*
|
|
16
|
+
* Bars measure length from zero, so the domain always includes it — otherwise
|
|
17
|
+
* a bar's length means nothing. Negative values place the baseline correctly
|
|
18
|
+
* rather than clamping to the plot floor.
|
|
19
|
+
*
|
|
20
|
+
* PURE. No React, no SVG.
|
|
21
|
+
*/
|
|
22
|
+
|
|
23
|
+
/**
|
|
24
|
+
* Bars accept both category and instant positions — that dual acceptance is
|
|
25
|
+
* what makes swapping a time-series chart for a bar chart free. Both collapse
|
|
26
|
+
* to a string key for the band scale.
|
|
27
|
+
*/
|
|
28
|
+
function categoryKey(position) {
|
|
29
|
+
switch (position.kind) {
|
|
30
|
+
case 'category':
|
|
31
|
+
return position.category;
|
|
32
|
+
case 'instant':
|
|
33
|
+
return String(position.at);
|
|
34
|
+
default:
|
|
35
|
+
return '';
|
|
36
|
+
}
|
|
37
|
+
}
|
|
38
|
+
function countExcluded(datasource) {
|
|
39
|
+
let excluded = 0;
|
|
40
|
+
for (const series of datasource.series) {
|
|
41
|
+
for (const point of series.points) {
|
|
42
|
+
if (!(0, _value.isKnown)(point.value)) {
|
|
43
|
+
excluded += 1;
|
|
44
|
+
}
|
|
45
|
+
}
|
|
46
|
+
}
|
|
47
|
+
return excluded;
|
|
48
|
+
}
|
|
49
|
+
function groupedDomainValues(datasource) {
|
|
50
|
+
const values = [];
|
|
51
|
+
for (const series of datasource.series) {
|
|
52
|
+
for (const point of series.points) {
|
|
53
|
+
if ((0, _value.isKnown)(point.value)) {
|
|
54
|
+
values.push(point.value.value);
|
|
55
|
+
}
|
|
56
|
+
}
|
|
57
|
+
}
|
|
58
|
+
return values;
|
|
59
|
+
}
|
|
60
|
+
|
|
61
|
+
/**
|
|
62
|
+
* A stacked axis must fit the stack totals, not the individual values.
|
|
63
|
+
* Positive and negative parts accumulate separately so a stack straddling zero
|
|
64
|
+
* still fits.
|
|
65
|
+
*/
|
|
66
|
+
function stackedDomainValues(categories, visible) {
|
|
67
|
+
const values = [];
|
|
68
|
+
|
|
69
|
+
// One pass over the points instead of a search per category and series.
|
|
70
|
+
const positive = new Map();
|
|
71
|
+
const negative = new Map();
|
|
72
|
+
for (const series of visible) {
|
|
73
|
+
const counted = new Set();
|
|
74
|
+
for (const point of series.points) {
|
|
75
|
+
const category = categoryKey(point.position);
|
|
76
|
+
// The first point of a series in a category is the one drawn there.
|
|
77
|
+
if (counted.has(category) || !(0, _value.isKnown)(point.value)) {
|
|
78
|
+
continue;
|
|
79
|
+
}
|
|
80
|
+
counted.add(category);
|
|
81
|
+
const sums = point.value.value >= 0 ? positive : negative;
|
|
82
|
+
sums.set(category, (sums.get(category) ?? 0) + point.value.value);
|
|
83
|
+
}
|
|
84
|
+
}
|
|
85
|
+
for (const category of categories) {
|
|
86
|
+
values.push(positive.get(category) ?? 0, negative.get(category) ?? 0);
|
|
87
|
+
}
|
|
88
|
+
return values;
|
|
89
|
+
}
|
|
90
|
+
function groupedBarX(bandStart, bandWidth, seriesIndex, seriesCount) {
|
|
91
|
+
const barWidth = bandWidth / Math.max(seriesCount, 1);
|
|
92
|
+
return {
|
|
93
|
+
barX: bandStart + seriesIndex * barWidth,
|
|
94
|
+
barWidth
|
|
95
|
+
};
|
|
96
|
+
}
|
|
97
|
+
|
|
98
|
+
/** Grows from the zero baseline, upward or downward as the sign requires. */
|
|
99
|
+
function groupedBarY(value, zeroY, project) {
|
|
100
|
+
const valueY = project(value);
|
|
101
|
+
return {
|
|
102
|
+
top: Math.min(zeroY, valueY),
|
|
103
|
+
height: Math.abs(valueY - zeroY)
|
|
104
|
+
};
|
|
105
|
+
}
|
|
106
|
+
|
|
107
|
+
/** Grows from wherever the running stack for this sign currently ends. */
|
|
108
|
+
function stackedBarY(value, category, stack, project) {
|
|
109
|
+
const base = stack.get(category) ?? 0;
|
|
110
|
+
const from = project(base);
|
|
111
|
+
const to = project(base + value);
|
|
112
|
+
stack.set(category, base + value);
|
|
113
|
+
return {
|
|
114
|
+
top: Math.min(from, to),
|
|
115
|
+
height: Math.abs(to - from)
|
|
116
|
+
};
|
|
117
|
+
}
|
|
118
|
+
function buildBarGeometry(datasource, input, options = {}) {
|
|
119
|
+
const grouping = options.grouping ?? 'grouped';
|
|
120
|
+
|
|
121
|
+
// Preserve first-seen order rather than sorting: the app chose this order.
|
|
122
|
+
const categories = [];
|
|
123
|
+
const seen = new Set();
|
|
124
|
+
for (const series of datasource.series) {
|
|
125
|
+
for (const point of series.points) {
|
|
126
|
+
const key = categoryKey(point.position);
|
|
127
|
+
if (key && !seen.has(key)) {
|
|
128
|
+
seen.add(key);
|
|
129
|
+
categories.push(key);
|
|
130
|
+
}
|
|
131
|
+
}
|
|
132
|
+
}
|
|
133
|
+
|
|
134
|
+
// Instants have an order of their own. First-seen order put Tuesday before
|
|
135
|
+
// Monday when one series started a day late, and disagreed with the
|
|
136
|
+
// time-series chart drawn from the same datasource (CHT-20).
|
|
137
|
+
if (datasource.positionKind === 'instant') {
|
|
138
|
+
categories.sort((a, b) => Number(a) - Number(b));
|
|
139
|
+
}
|
|
140
|
+
const visible = datasource.series.filter(s => !s.hidden);
|
|
141
|
+
const excluded = countExcluded(datasource);
|
|
142
|
+
const values = [...(grouping === 'stacked' ? stackedDomainValues(categories, visible) : groupedDomainValues(datasource)),
|
|
143
|
+
// A threshold above every bar must still be on the chart.
|
|
144
|
+
...(0, _markers.markerDomainValues)(datasource.markers)];
|
|
145
|
+
|
|
146
|
+
// Labels depend only on the domain, so they are known before any pixel is,
|
|
147
|
+
// and the plot can make room for them first.
|
|
148
|
+
// Bars grow from zero, so padding past zero on a side no bar reaches only
|
|
149
|
+
// adds a meaningless tick (-5.5 under all-positive data) crowding the 0.
|
|
150
|
+
const padded = (0, _scale.domainFrom)(values, {
|
|
151
|
+
includeZero: true,
|
|
152
|
+
padFraction: 0.05
|
|
153
|
+
});
|
|
154
|
+
const domain = (0, _scale.widenDegenerateDomain)({
|
|
155
|
+
min: values.some(v => v < 0) ? padded.min : Math.max(padded.min, 0),
|
|
156
|
+
max: values.some(v => v > 0) ? padded.max : Math.min(padded.max, 0)
|
|
157
|
+
});
|
|
158
|
+
// Round steps a reader can count in, not the padded extremes (105.3).
|
|
159
|
+
const yTickValues = (0, _ticks.niceTickValues)(domain, 4);
|
|
160
|
+
const xLabel = c => datasource.positionKind === 'instant' ? input.formatInstant(Number(c)) : input.formatCategory(c);
|
|
161
|
+
const plot = (0, _layout.insetForAxes)(input.plot, {
|
|
162
|
+
xLabels: categories.map(xLabel),
|
|
163
|
+
yLabels: yTickValues.map(input.formatValue),
|
|
164
|
+
fontSize: input.fontSize
|
|
165
|
+
});
|
|
166
|
+
const xBand = (0, _scale.bandScale)(categories, {
|
|
167
|
+
min: plot.x,
|
|
168
|
+
max: (0, _layout.plotRight)(plot)
|
|
169
|
+
}, 0.25);
|
|
170
|
+
const y = (0, _scale.linearScale)(domain, {
|
|
171
|
+
min: (0, _layout.plotBottom)(plot),
|
|
172
|
+
max: plot.y
|
|
173
|
+
});
|
|
174
|
+
const zeroY = y.project(0);
|
|
175
|
+
const paths = [];
|
|
176
|
+
const hitRegions = [];
|
|
177
|
+
|
|
178
|
+
// Running stack offsets, tracked separately per sign so negative bars grow
|
|
179
|
+
// downward from zero while positive bars grow upward.
|
|
180
|
+
const stackUp = new Map();
|
|
181
|
+
const stackDown = new Map();
|
|
182
|
+
visible.forEach((series, seriesIndex) => {
|
|
183
|
+
const rects = [];
|
|
184
|
+
for (const point of series.points) {
|
|
185
|
+
const category = categoryKey(point.position);
|
|
186
|
+
const bandStart = xBand.project(category);
|
|
187
|
+
if (bandStart === undefined || !(0, _value.isKnown)(point.value)) {
|
|
188
|
+
continue;
|
|
189
|
+
}
|
|
190
|
+
const value = point.value.value;
|
|
191
|
+
const {
|
|
192
|
+
barX,
|
|
193
|
+
barWidth
|
|
194
|
+
} = grouping === 'grouped' ? groupedBarX(bandStart, xBand.bandWidth, seriesIndex, visible.length) : {
|
|
195
|
+
barX: bandStart,
|
|
196
|
+
barWidth: xBand.bandWidth
|
|
197
|
+
};
|
|
198
|
+
const stack = value >= 0 ? stackUp : stackDown;
|
|
199
|
+
const {
|
|
200
|
+
top,
|
|
201
|
+
height
|
|
202
|
+
} = grouping === 'stacked' ? stackedBarY(value, category, stack, y.project) : groupedBarY(value, zeroY, y.project);
|
|
203
|
+
rects.push({
|
|
204
|
+
x: barX,
|
|
205
|
+
y: top,
|
|
206
|
+
width: barWidth,
|
|
207
|
+
height,
|
|
208
|
+
radius: options.radius ?? input.radius?.bar
|
|
209
|
+
});
|
|
210
|
+
hitRegions.push({
|
|
211
|
+
seriesId: series.id,
|
|
212
|
+
pointId: point.id,
|
|
213
|
+
x: barX + barWidth / 2,
|
|
214
|
+
y: top + height / 2,
|
|
215
|
+
bounds: {
|
|
216
|
+
x: barX,
|
|
217
|
+
y: top,
|
|
218
|
+
width: barWidth,
|
|
219
|
+
height
|
|
220
|
+
},
|
|
221
|
+
selectable: !(0, _value.isWithheld)(point.value)
|
|
222
|
+
});
|
|
223
|
+
}
|
|
224
|
+
if (rects.length > 0) {
|
|
225
|
+
paths.push({
|
|
226
|
+
key: `bars-${series.id}`,
|
|
227
|
+
seriesId: series.id,
|
|
228
|
+
d: (0, _path.rectBatchPath)(rects),
|
|
229
|
+
color: input.seriesColors[series.id],
|
|
230
|
+
pattern: series.pattern ?? 'solid',
|
|
231
|
+
filled: true
|
|
232
|
+
});
|
|
233
|
+
}
|
|
234
|
+
});
|
|
235
|
+
const xTicks = categories.map(c => ({
|
|
236
|
+
value: 0,
|
|
237
|
+
position: xBand.centerOf(c) ?? plot.x,
|
|
238
|
+
label: xLabel(c)
|
|
239
|
+
}));
|
|
240
|
+
const yTicks = yTickValues.map(v => ({
|
|
241
|
+
value: v,
|
|
242
|
+
position: y.project(v),
|
|
243
|
+
label: input.formatValue(v)
|
|
244
|
+
}));
|
|
245
|
+
const markers = (0, _markers.horizontalMarkers)(datasource.markers, plot, y.project);
|
|
246
|
+
return {
|
|
247
|
+
plot,
|
|
248
|
+
paths,
|
|
249
|
+
markers: markers.lines,
|
|
250
|
+
labels: markers.labels,
|
|
251
|
+
xTicks: (0, _ticks.thinTicks)(xTicks, input.fontSize, plot.width),
|
|
252
|
+
yTicks,
|
|
253
|
+
hitRegions,
|
|
254
|
+
incomplete: excluded > 0
|
|
255
|
+
};
|
|
256
|
+
}
|
|
257
|
+
//# sourceMappingURL=bar.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"names":["_value","require","_layout","_markers","_path","_scale","_ticks","categoryKey","position","kind","category","String","at","countExcluded","datasource","excluded","series","point","points","isKnown","value","groupedDomainValues","values","push","stackedDomainValues","categories","visible","positive","Map","negative","counted","Set","has","add","sums","set","get","groupedBarX","bandStart","bandWidth","seriesIndex","seriesCount","barWidth","Math","max","barX","groupedBarY","zeroY","project","valueY","top","min","height","abs","stackedBarY","stack","base","from","to","buildBarGeometry","input","options","grouping","seen","key","positionKind","sort","a","b","Number","filter","s","hidden","markerDomainValues","markers","padded","domainFrom","includeZero","padFraction","domain","widenDegenerateDomain","some","v","yTickValues","niceTickValues","xLabel","c","formatInstant","formatCategory","plot","insetForAxes","xLabels","map","yLabels","formatValue","fontSize","xBand","bandScale","x","plotRight","y","linearScale","plotBottom","paths","hitRegions","stackUp","stackDown","forEach","rects","undefined","length","width","radius","bar","seriesId","id","pointId","bounds","selectable","isWithheld","d","rectBatchPath","color","seriesColors","pattern","filled","xTicks","centerOf","label","yTicks","horizontalMarkers","lines","labels","thinTicks","incomplete"],"sourceRoot":"../../../src","sources":["geometry/bar.ts"],"mappings":";;;;;;AAUA,IAAAA,MAAA,GAAAC,OAAA;AAEA,IAAAC,OAAA,GAAAD,OAAA;AACA,IAAAE,QAAA,GAAAF,OAAA;AACA,IAAAG,KAAA,GAAAH,OAAA;AACA,IAAAI,MAAA,GAAAJ,OAAA;AACA,IAAAK,MAAA,GAAAL,OAAA;AAhBA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAkBA;AACA;AACA;AACA;AACA;AACA,SAASM,WAAWA,CAACC,QAAkB,EAAU;EAChD,QAAQA,QAAQ,CAACC,IAAI;IACpB,KAAK,UAAU;MACd,OAAOD,QAAQ,CAACE,QAAQ;IACzB,KAAK,SAAS;MACb,OAAOC,MAAM,CAACH,QAAQ,CAACI,EAAE,CAAC;IAC3B;MACC,OAAO,EAAE;EACX;AACD;AAEA,SAASC,aAAaA,CAAIC,UAA8B,EAAU;EACjE,IAAIC,QAAQ,GAAG,CAAC;EAChB,KAAK,MAAMC,MAAM,IAAIF,UAAU,CAACE,MAAM,EAAE;IACvC,KAAK,MAAMC,KAAK,IAAID,MAAM,CAACE,MAAM,EAAE;MAClC,IAAI,CAAC,IAAAC,cAAO,EAACF,KAAK,CAACG,KAAK,CAAC,EAAE;QAC1BL,QAAQ,IAAI,CAAC;MACd;IACD;EACD;EACA,OAAOA,QAAQ;AAChB;AAEA,SAASM,mBAAmBA,CAAIP,UAA8B,EAAY;EACzE,MAAMQ,MAAgB,GAAG,EAAE;EAC3B,KAAK,MAAMN,MAAM,IAAIF,UAAU,CAACE,MAAM,EAAE;IACvC,KAAK,MAAMC,KAAK,IAAID,MAAM,CAACE,MAAM,EAAE;MAClC,IAAI,IAAAC,cAAO,EAACF,KAAK,CAACG,KAAK,CAAC,EAAE;QACzBE,MAAM,CAACC,IAAI,CAACN,KAAK,CAACG,KAAK,CAACA,KAAK,CAAC;MAC/B;IACD;EACD;EACA,OAAOE,MAAM;AACd;;AAEA;AACA;AACA;AACA;AACA;AACA,SAASE,mBAAmBA,CAC3BC,UAA6B,EAC7BC,OAA6B,EAClB;EACX,MAAMJ,MAAgB,GAAG,EAAE;;EAE3B;EACA,MAAMK,QAAQ,GAAG,IAAIC,GAAG,CAAiB,CAAC;EAC1C,MAAMC,QAAQ,GAAG,IAAID,GAAG,CAAiB,CAAC;EAC1C,KAAK,MAAMZ,MAAM,IAAIU,OAAO,EAAE;IAC7B,MAAMI,OAAO,GAAG,IAAIC,GAAG,CAAS,CAAC;IACjC,KAAK,MAAMd,KAAK,IAAID,MAAM,CAACE,MAAM,EAAE;MAClC,MAAMR,QAAQ,GAAGH,WAAW,CAACU,KAAK,CAACT,QAAQ,CAAC;MAC5C;MACA,IAAIsB,OAAO,CAACE,GAAG,CAACtB,QAAQ,CAAC,IAAI,CAAC,IAAAS,cAAO,EAACF,KAAK,CAACG,KAAK,CAAC,EAAE;QACnD;MACD;MACAU,OAAO,CAACG,GAAG,CAACvB,QAAQ,CAAC;MACrB,MAAMwB,IAAI,GAAGjB,KAAK,CAACG,KAAK,CAACA,KAAK,IAAI,CAAC,GAAGO,QAAQ,GAAGE,QAAQ;MACzDK,IAAI,CAACC,GAAG,CAACzB,QAAQ,EAAE,CAACwB,IAAI,CAACE,GAAG,CAAC1B,QAAQ,CAAC,IAAI,CAAC,IAAIO,KAAK,CAACG,KAAK,CAACA,KAAK,CAAC;IAClE;EACD;EACA,KAAK,MAAMV,QAAQ,IAAIe,UAAU,EAAE;IAClCH,MAAM,CAACC,IAAI,CAACI,QAAQ,CAACS,GAAG,CAAC1B,QAAQ,CAAC,IAAI,CAAC,EAAEmB,QAAQ,CAACO,GAAG,CAAC1B,QAAQ,CAAC,IAAI,CAAC,CAAC;EACtE;EAEA,OAAOY,MAAM;AACd;AAEA,SAASe,WAAWA,CACnBC,SAAiB,EACjBC,SAAiB,EACjBC,WAAmB,EACnBC,WAAmB,EACkB;EACrC,MAAMC,QAAQ,GAAGH,SAAS,GAAGI,IAAI,CAACC,GAAG,CAACH,WAAW,EAAE,CAAC,CAAC;EACrD,OAAO;IAAEI,IAAI,EAAEP,SAAS,GAAGE,WAAW,GAAGE,QAAQ;IAAEA;EAAS,CAAC;AAC9D;;AAEA;AACA,SAASI,WAAWA,CACnB1B,KAAa,EACb2B,KAAa,EACbC,OAA8B,EACI;EAClC,MAAMC,MAAM,GAAGD,OAAO,CAAC5B,KAAK,CAAC;EAC7B,OAAO;IAAE8B,GAAG,EAAEP,IAAI,CAACQ,GAAG,CAACJ,KAAK,EAAEE,MAAM,CAAC;IAAEG,MAAM,EAAET,IAAI,CAACU,GAAG,CAACJ,MAAM,GAAGF,KAAK;EAAE,CAAC;AAC1E;;AAEA;AACA,SAASO,WAAWA,CACnBlC,KAAa,EACbV,QAAgB,EAChB6C,KAA0B,EAC1BP,OAA8B,EACI;EAClC,MAAMQ,IAAI,GAAGD,KAAK,CAACnB,GAAG,CAAC1B,QAAQ,CAAC,IAAI,CAAC;EACrC,MAAM+C,IAAI,GAAGT,OAAO,CAACQ,IAAI,CAAC;EAC1B,MAAME,EAAE,GAAGV,OAAO,CAACQ,IAAI,GAAGpC,KAAK,CAAC;EAChCmC,KAAK,CAACpB,GAAG,CAACzB,QAAQ,EAAE8C,IAAI,GAAGpC,KAAK,CAAC;EACjC,OAAO;IAAE8B,GAAG,EAAEP,IAAI,CAACQ,GAAG,CAACM,IAAI,EAAEC,EAAE,CAAC;IAAEN,MAAM,EAAET,IAAI,CAACU,GAAG,CAACK,EAAE,GAAGD,IAAI;EAAE,CAAC;AAChE;AAEO,SAASE,gBAAgBA,CAC/B7C,UAA8B,EAC9B8C,KAAoB,EACpBC,OAAmB,GAAG,CAAC,CAAC,EACL;EACnB,MAAMC,QAAqB,GAAGD,OAAO,CAACC,QAAQ,IAAI,SAAS;;EAE3D;EACA,MAAMrC,UAAoB,GAAG,EAAE;EAC/B,MAAMsC,IAAI,GAAG,IAAIhC,GAAG,CAAS,CAAC;EAC9B,KAAK,MAAMf,MAAM,IAAIF,UAAU,CAACE,MAAM,EAAE;IACvC,KAAK,MAAMC,KAAK,IAAID,MAAM,CAACE,MAAM,EAAE;MAClC,MAAM8C,GAAG,GAAGzD,WAAW,CAACU,KAAK,CAACT,QAAQ,CAAC;MACvC,IAAIwD,GAAG,IAAI,CAACD,IAAI,CAAC/B,GAAG,CAACgC,GAAG,CAAC,EAAE;QAC1BD,IAAI,CAAC9B,GAAG,CAAC+B,GAAG,CAAC;QACbvC,UAAU,CAACF,IAAI,CAACyC,GAAG,CAAC;MACrB;IACD;EACD;;EAEA;EACA;EACA;EACA,IAAIlD,UAAU,CAACmD,YAAY,KAAK,SAAS,EAAE;IAC1CxC,UAAU,CAACyC,IAAI,CAAC,CAACC,CAAC,EAAEC,CAAC,KAAKC,MAAM,CAACF,CAAC,CAAC,GAAGE,MAAM,CAACD,CAAC,CAAC,CAAC;EACjD;EAEA,MAAM1C,OAAO,GAAGZ,UAAU,CAACE,MAAM,CAACsD,MAAM,CAACC,CAAC,IAAI,CAACA,CAAC,CAACC,MAAM,CAAC;EACxD,MAAMzD,QAAQ,GAAGF,aAAa,CAACC,UAAU,CAAC;EAC1C,MAAMQ,MAAM,GAAG,CACd,IAAIwC,QAAQ,KAAK,SAAS,GACvBtC,mBAAmB,CAACC,UAAU,EAAEC,OAAO,CAAC,GACxCL,mBAAmB,CAACP,UAAU,CAAC,CAAC;EACnC;EACA,GAAG,IAAA2D,2BAAkB,EAAC3D,UAAU,CAAC4D,OAAO,CAAC,CACzC;;EAED;EACA;EACA;EACA;EACA,MAAMC,MAAM,GAAG,IAAAC,iBAAU,EAACtD,MAAM,EAAE;IAAEuD,WAAW,EAAE,IAAI;IAAEC,WAAW,EAAE;EAAK,CAAC,CAAC;EAC3E,MAAMC,MAAM,GAAG,IAAAC,4BAAqB,EAAC;IACpC7B,GAAG,EAAE7B,MAAM,CAAC2D,IAAI,CAACC,CAAC,IAAIA,CAAC,GAAG,CAAC,CAAC,GAAGP,MAAM,CAACxB,GAAG,GAAGR,IAAI,CAACC,GAAG,CAAC+B,MAAM,CAACxB,GAAG,EAAE,CAAC,CAAC;IACnEP,GAAG,EAAEtB,MAAM,CAAC2D,IAAI,CAACC,CAAC,IAAIA,CAAC,GAAG,CAAC,CAAC,GAAGP,MAAM,CAAC/B,GAAG,GAAGD,IAAI,CAACQ,GAAG,CAACwB,MAAM,CAAC/B,GAAG,EAAE,CAAC;EACnE,CAAC,CAAC;EACF;EACA,MAAMuC,WAAW,GAAG,IAAAC,qBAAc,EAACL,MAAM,EAAE,CAAC,CAAC;EAC7C,MAAMM,MAAM,GAAIC,CAAS,IACxBxE,UAAU,CAACmD,YAAY,KAAK,SAAS,GAClCL,KAAK,CAAC2B,aAAa,CAAClB,MAAM,CAACiB,CAAC,CAAC,CAAC,GAC9B1B,KAAK,CAAC4B,cAAc,CAACF,CAAC,CAAC;EAC3B,MAAMG,IAAI,GAAG,IAAAC,oBAAY,EAAC9B,KAAK,CAAC6B,IAAI,EAAE;IACrCE,OAAO,EAAElE,UAAU,CAACmE,GAAG,CAACP,MAAM,CAAC;IAC/BQ,OAAO,EAAEV,WAAW,CAACS,GAAG,CAAChC,KAAK,CAACkC,WAAW,CAAC;IAC3CC,QAAQ,EAAEnC,KAAK,CAACmC;EACjB,CAAC,CAAC;EAEF,MAAMC,KAAK,GAAG,IAAAC,gBAAS,EAACxE,UAAU,EAAE;IAAE0B,GAAG,EAAEsC,IAAI,CAACS,CAAC;IAAEtD,GAAG,EAAE,IAAAuD,iBAAS,EAACV,IAAI;EAAE,CAAC,EAAE,IAAI,CAAC;EAChF,MAAMW,CAAC,GAAG,IAAAC,kBAAW,EAACtB,MAAM,EAAE;IAAE5B,GAAG,EAAE,IAAAmD,kBAAU,EAACb,IAAI,CAAC;IAAE7C,GAAG,EAAE6C,IAAI,CAACW;EAAE,CAAC,CAAC;EACrE,MAAMrD,KAAK,GAAGqD,CAAC,CAACpD,OAAO,CAAC,CAAC,CAAC;EAE1B,MAAMuD,KAAiB,GAAG,EAAE;EAC5B,MAAMC,UAAuB,GAAG,EAAE;;EAElC;EACA;EACA,MAAMC,OAAO,GAAG,IAAI7E,GAAG,CAAiB,CAAC;EACzC,MAAM8E,SAAS,GAAG,IAAI9E,GAAG,CAAiB,CAAC;EAE3CF,OAAO,CAACiF,OAAO,CAAC,CAAC3F,MAAM,EAAEwB,WAAW,KAAK;IACxC,MAAMoE,KAAiB,GAAG,EAAE;IAE5B,KAAK,MAAM3F,KAAK,IAAID,MAAM,CAACE,MAAM,EAAE;MAClC,MAAMR,QAAQ,GAAGH,WAAW,CAACU,KAAK,CAACT,QAAQ,CAAC;MAC5C,MAAM8B,SAAS,GAAG0D,KAAK,CAAChD,OAAO,CAACtC,QAAQ,CAAC;MACzC,IAAI4B,SAAS,KAAKuE,SAAS,IAAI,CAAC,IAAA1F,cAAO,EAACF,KAAK,CAACG,KAAK,CAAC,EAAE;QACrD;MACD;MAEA,MAAMA,KAAK,GAAGH,KAAK,CAACG,KAAK,CAACA,KAAK;MAE/B,MAAM;QAAEyB,IAAI;QAAEH;MAAS,CAAC,GACvBoB,QAAQ,KAAK,SAAS,GACnBzB,WAAW,CAACC,SAAS,EAAE0D,KAAK,CAACzD,SAAS,EAAEC,WAAW,EAAEd,OAAO,CAACoF,MAAM,CAAC,GACpE;QAAEjE,IAAI,EAAEP,SAAS;QAAEI,QAAQ,EAAEsD,KAAK,CAACzD;MAAU,CAAC;MAElD,MAAMgB,KAAK,GAAGnC,KAAK,IAAI,CAAC,GAAGqF,OAAO,GAAGC,SAAS;MAC9C,MAAM;QAAExD,GAAG;QAAEE;MAAO,CAAC,GACpBU,QAAQ,KAAK,SAAS,GACnBR,WAAW,CAAClC,KAAK,EAAEV,QAAQ,EAAE6C,KAAK,EAAE6C,CAAC,CAACpD,OAAO,CAAC,GAC9CF,WAAW,CAAC1B,KAAK,EAAE2B,KAAK,EAAEqD,CAAC,CAACpD,OAAO,CAAC;MAExC4D,KAAK,CAACrF,IAAI,CAAC;QACV2E,CAAC,EAAErD,IAAI;QACPuD,CAAC,EAAElD,GAAG;QACN6D,KAAK,EAAErE,QAAQ;QACfU,MAAM;QACN4D,MAAM,EAAEnD,OAAO,CAACmD,MAAM,IAAIpD,KAAK,CAACoD,MAAM,EAAEC;MACzC,CAAC,CAAC;MAEFT,UAAU,CAACjF,IAAI,CAAC;QACf2F,QAAQ,EAAElG,MAAM,CAACmG,EAAE;QACnBC,OAAO,EAAEnG,KAAK,CAACkG,EAAE;QACjBjB,CAAC,EAAErD,IAAI,GAAGH,QAAQ,GAAG,CAAC;QACtB0D,CAAC,EAAElD,GAAG,GAAGE,MAAM,GAAG,CAAC;QACnBiE,MAAM,EAAE;UAAEnB,CAAC,EAAErD,IAAI;UAAEuD,CAAC,EAAElD,GAAG;UAAE6D,KAAK,EAAErE,QAAQ;UAAEU;QAAO,CAAC;QACpDkE,UAAU,EAAE,CAAC,IAAAC,iBAAU,EAACtG,KAAK,CAACG,KAAK;MACpC,CAAC,CAAC;IACH;IAEA,IAAIwF,KAAK,CAACE,MAAM,GAAG,CAAC,EAAE;MACrBP,KAAK,CAAChF,IAAI,CAAC;QACVyC,GAAG,EAAE,QAAQhD,MAAM,CAACmG,EAAE,EAAE;QACxBD,QAAQ,EAAElG,MAAM,CAACmG,EAAE;QACnBK,CAAC,EAAE,IAAAC,mBAAa,EAACb,KAAK,CAAC;QACvBc,KAAK,EAAE9D,KAAK,CAAC+D,YAAY,CAAC3G,MAAM,CAACmG,EAAE,CAAC;QACpCS,OAAO,EAAE5G,MAAM,CAAC4G,OAAO,IAAI,OAAO;QAClCC,MAAM,EAAE;MACT,CAAC,CAAC;IACH;EACD,CAAC,CAAC;EAEF,MAAMC,MAAc,GAAGrG,UAAU,CAACmE,GAAG,CAACN,CAAC,KAAK;IAC3ClE,KAAK,EAAE,CAAC;IACRZ,QAAQ,EAAEwF,KAAK,CAAC+B,QAAQ,CAACzC,CAAC,CAAC,IAAIG,IAAI,CAACS,CAAC;IACrC8B,KAAK,EAAE3C,MAAM,CAACC,CAAC;EAChB,CAAC,CAAC,CAAC;EAEH,MAAM2C,MAAc,GAAG9C,WAAW,CAACS,GAAG,CAACV,CAAC,KAAK;IAC5C9D,KAAK,EAAE8D,CAAC;IACR1E,QAAQ,EAAE4F,CAAC,CAACpD,OAAO,CAACkC,CAAC,CAAC;IACtB8C,KAAK,EAAEpE,KAAK,CAACkC,WAAW,CAACZ,CAAC;EAC3B,CAAC,CAAC,CAAC;EAEH,MAAMR,OAAO,GAAG,IAAAwD,0BAAiB,EAACpH,UAAU,CAAC4D,OAAO,EAAEe,IAAI,EAAEW,CAAC,CAACpD,OAAO,CAAC;EAEtE,OAAO;IACNyC,IAAI;IACJc,KAAK;IACL7B,OAAO,EAAEA,OAAO,CAACyD,KAAK;IACtBC,MAAM,EAAE1D,OAAO,CAAC0D,MAAM;IACtBN,MAAM,EAAE,IAAAO,gBAAS,EAACP,MAAM,EAAElE,KAAK,CAACmC,QAAQ,EAAEN,IAAI,CAACsB,KAAK,CAAC;IACrDkB,MAAM;IACNzB,UAAU;IACV8B,UAAU,EAAEvH,QAAQ,GAAG;EACxB,CAAC;AACF","ignoreList":[]}
|
|
@@ -0,0 +1,197 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
Object.defineProperty(exports, "__esModule", {
|
|
4
|
+
value: true
|
|
5
|
+
});
|
|
6
|
+
exports.buildDistributionGeometry = buildDistributionGeometry;
|
|
7
|
+
var _distribution = require("../contract/distribution.js");
|
|
8
|
+
var _theme = require("../contract/theme.js");
|
|
9
|
+
var _value = require("../contract/value.js");
|
|
10
|
+
var _path = require("./path.js");
|
|
11
|
+
/**
|
|
12
|
+
* Distribution geometry: proportions between groups.
|
|
13
|
+
*
|
|
14
|
+
* Segments that do not sum to the whole are **not** rescaled to force a full
|
|
15
|
+
* circle (FR-024). The arc stops short and the geometry reports `incomplete`,
|
|
16
|
+
* so the chart can say the data is partial rather than quietly implying it is
|
|
17
|
+
* complete.
|
|
18
|
+
*
|
|
19
|
+
* PURE. No React, no SVG.
|
|
20
|
+
*/
|
|
21
|
+
|
|
22
|
+
const TAU = Math.PI * 2;
|
|
23
|
+
function buildDistributionGeometry(datasource, input, options = {}) {
|
|
24
|
+
const {
|
|
25
|
+
plot
|
|
26
|
+
} = input;
|
|
27
|
+
const shape = options.shape ?? 'donut';
|
|
28
|
+
const segments = datasource.series.flatMap(series => series.points.map(point => ({
|
|
29
|
+
series,
|
|
30
|
+
point
|
|
31
|
+
})));
|
|
32
|
+
if (segments.length === 0 || plot.width <= 0 || plot.height <= 0) {
|
|
33
|
+
return {
|
|
34
|
+
plot,
|
|
35
|
+
paths: [],
|
|
36
|
+
markers: [],
|
|
37
|
+
labels: [],
|
|
38
|
+
xTicks: [],
|
|
39
|
+
yTicks: [],
|
|
40
|
+
hitRegions: [],
|
|
41
|
+
incomplete: false
|
|
42
|
+
};
|
|
43
|
+
}
|
|
44
|
+
const total = (0, _value.sumKnown)(segments.map(s => s.point.value));
|
|
45
|
+
// Nothing known: there is no distribution to draw, and drawing a full grey
|
|
46
|
+
// circle would imply a shape the data does not support.
|
|
47
|
+
if (total.countedPoints === 0 || total.total <= 0) {
|
|
48
|
+
return {
|
|
49
|
+
plot,
|
|
50
|
+
paths: [],
|
|
51
|
+
markers: [],
|
|
52
|
+
labels: [],
|
|
53
|
+
xTicks: [],
|
|
54
|
+
yTicks: [],
|
|
55
|
+
hitRegions: [],
|
|
56
|
+
incomplete: true
|
|
57
|
+
};
|
|
58
|
+
}
|
|
59
|
+
|
|
60
|
+
// Proportions supplied directly (each in 0..1, summing to ~1) are honoured
|
|
61
|
+
// as given; absolute values are normalised by their own total. Either way we
|
|
62
|
+
// never stretch a short sum to fill the circle.
|
|
63
|
+
const suppliedAsProportions = (0, _distribution.resolveDistributionValues)(datasource, options.valuesAre) === 'proportions';
|
|
64
|
+
// Shares declared as proportions that add up past the whole are normalised
|
|
65
|
+
// rather than drawn over one another.
|
|
66
|
+
const denominator = suppliedAsProportions ? Math.max(1, total.total) : total.total;
|
|
67
|
+
const coverage = total.total / denominator;
|
|
68
|
+
const incomplete = total.incomplete || coverage < 0.999;
|
|
69
|
+
const paths = [];
|
|
70
|
+
const labels = [];
|
|
71
|
+
const hitRegions = [];
|
|
72
|
+
const colorOf = (seriesId, pointId) => input.segmentColors?.[(0, _theme.segmentKey)(seriesId, pointId)] ?? input.seriesColors[seriesId];
|
|
73
|
+
if (shape === 'segmentedBar') {
|
|
74
|
+
const barHeight = Math.min(plot.height, 28);
|
|
75
|
+
const barY = plot.y + (plot.height - barHeight) / 2;
|
|
76
|
+
let cursor = plot.x;
|
|
77
|
+
for (const {
|
|
78
|
+
series,
|
|
79
|
+
point
|
|
80
|
+
} of segments) {
|
|
81
|
+
if (!(0, _value.isKnown)(point.value) || point.value.value < 0) {
|
|
82
|
+
continue;
|
|
83
|
+
}
|
|
84
|
+
const fraction = point.value.value / denominator;
|
|
85
|
+
const width = plot.width * fraction;
|
|
86
|
+
paths.push({
|
|
87
|
+
key: `seg-${series.id}-${point.id}`,
|
|
88
|
+
seriesId: series.id,
|
|
89
|
+
d: (0, _path.rectSubpath)({
|
|
90
|
+
x: cursor,
|
|
91
|
+
y: barY,
|
|
92
|
+
width,
|
|
93
|
+
height: barHeight
|
|
94
|
+
}),
|
|
95
|
+
color: colorOf(series.id, point.id),
|
|
96
|
+
pattern: 'solid',
|
|
97
|
+
filled: true
|
|
98
|
+
});
|
|
99
|
+
hitRegions.push({
|
|
100
|
+
seriesId: series.id,
|
|
101
|
+
pointId: point.id,
|
|
102
|
+
x: cursor + width / 2,
|
|
103
|
+
y: barY + barHeight / 2,
|
|
104
|
+
bounds: {
|
|
105
|
+
x: cursor,
|
|
106
|
+
y: barY,
|
|
107
|
+
width,
|
|
108
|
+
height: barHeight
|
|
109
|
+
},
|
|
110
|
+
selectable: !(0, _value.isWithheld)(point.value)
|
|
111
|
+
});
|
|
112
|
+
cursor += width;
|
|
113
|
+
}
|
|
114
|
+
return {
|
|
115
|
+
plot,
|
|
116
|
+
paths,
|
|
117
|
+
markers: [],
|
|
118
|
+
labels,
|
|
119
|
+
xTicks: [],
|
|
120
|
+
yTicks: [],
|
|
121
|
+
hitRegions,
|
|
122
|
+
incomplete
|
|
123
|
+
};
|
|
124
|
+
}
|
|
125
|
+
const cx = plot.x + plot.width / 2;
|
|
126
|
+
const cy = plot.y + plot.height / 2;
|
|
127
|
+
const outerRadius = Math.min(plot.width, plot.height) / 2;
|
|
128
|
+
const innerRadius = shape === 'pie' ? 0 : outerRadius * (options.innerRadiusRatio ?? 0.6);
|
|
129
|
+
let angle = 0;
|
|
130
|
+
for (const {
|
|
131
|
+
series,
|
|
132
|
+
point
|
|
133
|
+
} of segments) {
|
|
134
|
+
if (!(0, _value.isKnown)(point.value) || point.value.value < 0) {
|
|
135
|
+
continue;
|
|
136
|
+
}
|
|
137
|
+
const fraction = point.value.value / denominator;
|
|
138
|
+
const sweep = fraction * TAU;
|
|
139
|
+
const start = angle;
|
|
140
|
+
const end = angle + sweep;
|
|
141
|
+
angle = end;
|
|
142
|
+
paths.push({
|
|
143
|
+
key: `arc-${series.id}-${point.id}`,
|
|
144
|
+
seriesId: series.id,
|
|
145
|
+
d: (0, _path.arcPath)({
|
|
146
|
+
cx,
|
|
147
|
+
cy,
|
|
148
|
+
outerRadius,
|
|
149
|
+
innerRadius,
|
|
150
|
+
startAngle: start,
|
|
151
|
+
endAngle: end
|
|
152
|
+
}),
|
|
153
|
+
color: colorOf(series.id, point.id),
|
|
154
|
+
pattern: 'solid',
|
|
155
|
+
filled: true
|
|
156
|
+
});
|
|
157
|
+
|
|
158
|
+
// Label at the segment's midpoint, on the ring between the two radii.
|
|
159
|
+
const mid = start + sweep / 2 - Math.PI / 2;
|
|
160
|
+
const labelRadius = (outerRadius + innerRadius) / 2;
|
|
161
|
+
labels.push({
|
|
162
|
+
key: `arc-label-${series.id}-${point.id}`,
|
|
163
|
+
text: `${Math.round(fraction * 100)}%`,
|
|
164
|
+
x: cx + labelRadius * Math.cos(mid),
|
|
165
|
+
y: cy + labelRadius * Math.sin(mid),
|
|
166
|
+
anchor: 'middle',
|
|
167
|
+
// Hide labels on slivers where the text would not fit anyway.
|
|
168
|
+
muted: fraction < 0.05
|
|
169
|
+
});
|
|
170
|
+
hitRegions.push({
|
|
171
|
+
seriesId: series.id,
|
|
172
|
+
pointId: point.id,
|
|
173
|
+
x: cx + labelRadius * Math.cos(mid),
|
|
174
|
+
y: cy + labelRadius * Math.sin(mid),
|
|
175
|
+
arc: {
|
|
176
|
+
cx,
|
|
177
|
+
cy,
|
|
178
|
+
innerRadius,
|
|
179
|
+
outerRadius,
|
|
180
|
+
startAngle: start,
|
|
181
|
+
endAngle: end
|
|
182
|
+
},
|
|
183
|
+
selectable: !(0, _value.isWithheld)(point.value)
|
|
184
|
+
});
|
|
185
|
+
}
|
|
186
|
+
return {
|
|
187
|
+
plot,
|
|
188
|
+
paths,
|
|
189
|
+
markers: [],
|
|
190
|
+
labels,
|
|
191
|
+
xTicks: [],
|
|
192
|
+
yTicks: [],
|
|
193
|
+
hitRegions,
|
|
194
|
+
incomplete
|
|
195
|
+
};
|
|
196
|
+
}
|
|
197
|
+
//# sourceMappingURL=distribution.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"names":["_distribution","require","_theme","_value","_path","TAU","Math","PI","buildDistributionGeometry","datasource","input","options","plot","shape","segments","series","flatMap","points","map","point","length","width","height","paths","markers","labels","xTicks","yTicks","hitRegions","incomplete","total","sumKnown","s","value","countedPoints","suppliedAsProportions","resolveDistributionValues","valuesAre","denominator","max","coverage","colorOf","seriesId","pointId","segmentColors","segmentKey","seriesColors","barHeight","min","barY","y","cursor","x","isKnown","fraction","push","key","id","d","rectSubpath","color","pattern","filled","bounds","selectable","isWithheld","cx","cy","outerRadius","innerRadius","innerRadiusRatio","angle","sweep","start","end","arcPath","startAngle","endAngle","mid","labelRadius","text","round","cos","sin","anchor","muted","arc"],"sourceRoot":"../../../src","sources":["geometry/distribution.ts"],"mappings":"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","ignoreList":[]}
|
|
@@ -0,0 +1,186 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
Object.defineProperty(exports, "__esModule", {
|
|
4
|
+
value: true
|
|
5
|
+
});
|
|
6
|
+
exports.buildHeatmapGeometry = buildHeatmapGeometry;
|
|
7
|
+
var _value = require("../contract/value.js");
|
|
8
|
+
var _layout = require("./layout.js");
|
|
9
|
+
var _path = require("./path.js");
|
|
10
|
+
var _ticks = require("./ticks.js");
|
|
11
|
+
/**
|
|
12
|
+
* Heatmap geometry: a matrix of cells, batched by intensity bucket.
|
|
13
|
+
*
|
|
14
|
+
* This is where batching pays off most. A thousand cells become roughly eight
|
|
15
|
+
* paths — one per intensity bucket, plus one per non-value class — instead of a
|
|
16
|
+
* thousand elements. Cell count no longer drives element count at all
|
|
17
|
+
* (research.md R2).
|
|
18
|
+
*
|
|
19
|
+
* Empty, zero, and unavailable cells are distinct by construction (FR-027): a
|
|
20
|
+
* genuine zero lands in the lowest ramp bucket, while unknown, not-applicable,
|
|
21
|
+
* and withheld each get their own texture.
|
|
22
|
+
*
|
|
23
|
+
* PURE. No React, no SVG.
|
|
24
|
+
*/
|
|
25
|
+
|
|
26
|
+
function buildHeatmapGeometry(datasource, input, options = {}) {
|
|
27
|
+
const rows = [];
|
|
28
|
+
const columns = [];
|
|
29
|
+
const rowSeen = new Set();
|
|
30
|
+
const colSeen = new Set();
|
|
31
|
+
for (const series of datasource.series) {
|
|
32
|
+
for (const point of series.points) {
|
|
33
|
+
if (point.position.kind !== 'matrix') {
|
|
34
|
+
continue;
|
|
35
|
+
}
|
|
36
|
+
if (!rowSeen.has(point.position.row)) {
|
|
37
|
+
rowSeen.add(point.position.row);
|
|
38
|
+
rows.push(point.position.row);
|
|
39
|
+
}
|
|
40
|
+
if (!colSeen.has(point.position.column)) {
|
|
41
|
+
colSeen.add(point.position.column);
|
|
42
|
+
columns.push(point.position.column);
|
|
43
|
+
}
|
|
44
|
+
}
|
|
45
|
+
}
|
|
46
|
+
if (rows.length === 0 || columns.length === 0 || input.plot.width <= 0) {
|
|
47
|
+
return {
|
|
48
|
+
plot: input.plot,
|
|
49
|
+
paths: [],
|
|
50
|
+
markers: [],
|
|
51
|
+
labels: [],
|
|
52
|
+
xTicks: [],
|
|
53
|
+
yTicks: [],
|
|
54
|
+
hitRegions: [],
|
|
55
|
+
incomplete: false
|
|
56
|
+
};
|
|
57
|
+
}
|
|
58
|
+
|
|
59
|
+
// Row and column names are the heatmap's axes. The plot makes room for
|
|
60
|
+
// them; they were computed before and never drawn (CHT-15).
|
|
61
|
+
const columnLabels = columns.map(input.formatCategory);
|
|
62
|
+
const rowLabels = rows.map(input.formatCategory);
|
|
63
|
+
const plot = (0, _layout.insetForAxes)(input.plot, {
|
|
64
|
+
xLabels: columnLabels,
|
|
65
|
+
yLabels: rowLabels,
|
|
66
|
+
fontSize: input.fontSize
|
|
67
|
+
});
|
|
68
|
+
const columnIndex = new Map(columns.map((column, index) => [column, index]));
|
|
69
|
+
const rowIndex = new Map(rows.map((row, index) => [row, index]));
|
|
70
|
+
const gap = options.cellGap ?? 2;
|
|
71
|
+
const cellWidth = plot.width / columns.length;
|
|
72
|
+
const cellHeight = plot.height / rows.length;
|
|
73
|
+
const ramp = input.heatmapRamp;
|
|
74
|
+
const bucketCount = Math.max(2, Math.min(options.buckets ?? ramp.length, ramp.length));
|
|
75
|
+
let min = Infinity;
|
|
76
|
+
let max = -Infinity;
|
|
77
|
+
for (const series of datasource.series) {
|
|
78
|
+
for (const point of series.points) {
|
|
79
|
+
if ((0, _value.isKnown)(point.value)) {
|
|
80
|
+
min = Math.min(min, point.value.value);
|
|
81
|
+
max = Math.max(max, point.value.value);
|
|
82
|
+
}
|
|
83
|
+
}
|
|
84
|
+
}
|
|
85
|
+
const hasKnown = Number.isFinite(min) && Number.isFinite(max);
|
|
86
|
+
const span = max - min;
|
|
87
|
+
|
|
88
|
+
// Rects grouped by the path they will join.
|
|
89
|
+
const byBucket = new Map();
|
|
90
|
+
const byTexture = new Map();
|
|
91
|
+
const hitRegions = [];
|
|
92
|
+
let excluded = 0;
|
|
93
|
+
for (const series of datasource.series) {
|
|
94
|
+
if (series.hidden) {
|
|
95
|
+
continue;
|
|
96
|
+
}
|
|
97
|
+
for (const point of series.points) {
|
|
98
|
+
if (point.position.kind !== 'matrix') {
|
|
99
|
+
continue;
|
|
100
|
+
}
|
|
101
|
+
const col = columnIndex.get(point.position.column);
|
|
102
|
+
const row = rowIndex.get(point.position.row);
|
|
103
|
+
if (col === undefined || row === undefined) {
|
|
104
|
+
continue;
|
|
105
|
+
}
|
|
106
|
+
const rect = {
|
|
107
|
+
x: plot.x + col * cellWidth + gap / 2,
|
|
108
|
+
y: plot.y + row * cellHeight + gap / 2,
|
|
109
|
+
width: Math.max(0, cellWidth - gap),
|
|
110
|
+
height: Math.max(0, cellHeight - gap),
|
|
111
|
+
radius: options.cellRadius ?? input.radius?.cell
|
|
112
|
+
};
|
|
113
|
+
if ((0, _value.isKnown)(point.value)) {
|
|
114
|
+
// A zero lands in bucket 0 rather than being treated as absent —
|
|
115
|
+
// "logged nothing" and "we do not know" must not look alike.
|
|
116
|
+
const t = hasKnown && span > 0 ? (point.value.value - min) / span : 0;
|
|
117
|
+
const bucket = Math.min(bucketCount - 1, Math.floor(t * (bucketCount - 1) + 0.5));
|
|
118
|
+
const list = byBucket.get(bucket) ?? [];
|
|
119
|
+
list.push(rect);
|
|
120
|
+
byBucket.set(bucket, list);
|
|
121
|
+
} else {
|
|
122
|
+
excluded += 1;
|
|
123
|
+
const kind = point.value.kind;
|
|
124
|
+
const list = byTexture.get(kind) ?? [];
|
|
125
|
+
list.push(rect);
|
|
126
|
+
byTexture.set(kind, list);
|
|
127
|
+
}
|
|
128
|
+
hitRegions.push({
|
|
129
|
+
seriesId: series.id,
|
|
130
|
+
pointId: point.id,
|
|
131
|
+
x: rect.x + rect.width / 2,
|
|
132
|
+
y: rect.y + rect.height / 2,
|
|
133
|
+
bounds: rect,
|
|
134
|
+
selectable: !(0, _value.isWithheld)(point.value)
|
|
135
|
+
});
|
|
136
|
+
}
|
|
137
|
+
}
|
|
138
|
+
const paths = [];
|
|
139
|
+
for (const [bucket, rects] of byBucket) {
|
|
140
|
+
paths.push({
|
|
141
|
+
key: `cells-${bucket}`,
|
|
142
|
+
seriesId: datasource.series[0]?.id ?? 'heatmap',
|
|
143
|
+
d: (0, _path.rectBatchPath)(rects),
|
|
144
|
+
color: ramp[Math.min(bucket, ramp.length - 1)],
|
|
145
|
+
pattern: 'solid',
|
|
146
|
+
filled: true
|
|
147
|
+
});
|
|
148
|
+
}
|
|
149
|
+
for (const [kind, rects] of byTexture) {
|
|
150
|
+
paths.push({
|
|
151
|
+
key: `cells-${kind}`,
|
|
152
|
+
seriesId: datasource.series[0]?.id ?? 'heatmap',
|
|
153
|
+
d: (0, _path.rectBatchPath)(rects),
|
|
154
|
+
color: ramp[0],
|
|
155
|
+
pattern: 'solid',
|
|
156
|
+
filled: true,
|
|
157
|
+
texture: input.nonValueTextures[kind]
|
|
158
|
+
});
|
|
159
|
+
}
|
|
160
|
+
return {
|
|
161
|
+
plot,
|
|
162
|
+
paths,
|
|
163
|
+
markers: [],
|
|
164
|
+
labels: [],
|
|
165
|
+
xTicks: (0, _ticks.thinTicks)(columnLabels.map((label, i) => ({
|
|
166
|
+
value: i,
|
|
167
|
+
position: plot.x + i * cellWidth + cellWidth / 2,
|
|
168
|
+
label
|
|
169
|
+
})), input.fontSize, plot.width),
|
|
170
|
+
yTicks: rowLabels.map((label, i) => ({
|
|
171
|
+
value: i,
|
|
172
|
+
position: plot.y + i * cellHeight + cellHeight / 2,
|
|
173
|
+
label
|
|
174
|
+
})),
|
|
175
|
+
hitRegions,
|
|
176
|
+
...(hasKnown ? {
|
|
177
|
+
colorScale: {
|
|
178
|
+
min,
|
|
179
|
+
max,
|
|
180
|
+
colors: ramp.slice(0, bucketCount)
|
|
181
|
+
}
|
|
182
|
+
} : {}),
|
|
183
|
+
incomplete: excluded > 0
|
|
184
|
+
};
|
|
185
|
+
}
|
|
186
|
+
//# sourceMappingURL=heatmap.js.map
|