@fundar/data-chart-telling 1.1.0 → 1.2.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 +32 -0
- package/README.md +6 -6
- package/dist/configuration/config.svelte.d.ts +1 -1
- package/dist/configuration/config.svelte.js +165 -100
- package/dist/configuration/themes/index.d.ts +5 -1428
- package/dist/index.d.ts +23 -14
- package/dist/index.js +20 -11
- package/dist/layout/base/BasePlotLayout.svelte +115 -50
- package/dist/layout/base/BasePlotLayout.svelte.d.ts +1 -38
- package/dist/layout/coordinates/CoordinatesLayout.svelte +42 -40
- package/dist/layout/coordinates/CoordinatesLayout.svelte.d.ts +0 -2
- package/dist/layout/coordinates/ProjectionZoom.svelte +48 -0
- package/dist/layout/coordinates/ProjectionZoom.svelte.d.ts +10 -0
- package/dist/layout/coordinates/ZoomedProjection.d.ts +11 -0
- package/dist/layout/coordinates/ZoomedProjection.js +24 -0
- package/dist/layout/coordinates/camera.svelte.js +11 -8
- package/dist/layout/coordinates/projections/argentina.js +1 -1
- package/dist/layout/coordinates/projections/fit.d.ts +1 -1
- package/dist/layout/coordinates/projections/fit.js +1 -1
- package/dist/layout/coordinates/zoom.svelte.d.ts +4 -5
- package/dist/layout/coordinates/zoom.svelte.js +4 -5
- package/dist/layout/facet/FacetLayout.svelte +1 -1
- package/dist/layout/facet/config.js +1 -1
- package/dist/layout/figure/Figure.svelte +2 -0
- package/dist/layout/geometry/GeometryLayout.svelte +14 -9
- package/dist/layout/geometry/GeometryLayout.svelte.d.ts +0 -3
- package/dist/layout/geometry/MarkerOffset.svelte +28 -0
- package/dist/layout/geometry/MarkerOffset.svelte.d.ts +13 -0
- package/dist/layout/grid/GridCell.svelte +6 -8
- package/dist/layout/legend/ContinuousSection.svelte +44 -9
- package/dist/layout/legend/DiscreteBadgeItem.svelte +2 -2
- package/dist/layout/legend/DiscreteSection.svelte +2 -2
- package/dist/layout/legend/DiscreteSymbolIcon.svelte +1 -1
- package/dist/layout/legend/LegendChannels.js +36 -12
- package/dist/layout/legend/LegendLayout.svelte +9 -1
- package/dist/layout/legend/LegendState.svelte.d.ts +4 -0
- package/dist/layout/legend/LegendState.svelte.js +20 -3
- package/dist/layout/legend/SizeSection.svelte +1 -1
- package/dist/layout/margins/PlotMargins.svelte.d.ts +2 -5
- package/dist/layout/margins/PlotMargins.svelte.js +4 -8
- package/dist/layout/plot/Slice.d.ts +5 -1
- package/dist/layout/plot/Slice.js +14 -4
- package/dist/layout/scales/NiceTicks.d.ts +3 -0
- package/dist/layout/scales/NiceTicks.js +4 -0
- package/dist/layout/scales/ScalesLayout.svelte +72 -7
- package/dist/layout/scales/ScalesLayout.svelte.d.ts +5 -0
- package/dist/layout/scales/SveltePlotScale.d.ts +2 -2
- package/dist/layout/scales/SveltePlotScale.js +13 -6
- package/dist/layout/scales/TickLabels.d.ts +32 -0
- package/dist/layout/scales/TickLabels.js +55 -0
- package/dist/layout/styles/StylesLayout.svelte +2 -2
- package/dist/layout/styles/ValueLabels.d.ts +33 -5
- package/dist/layout/styles/ValueLabels.js +80 -21
- package/dist/layout/timeline/TimelineLayout.svelte +1 -1
- package/dist/layout/tooltip/Tooltip.svelte +4 -4
- package/dist/layout/tooltip/Tooltip.svelte.d.ts +4 -4
- package/dist/layout/tooltip/TooltipState.svelte.js +1 -1
- package/dist/markers/MarkerKinds.d.ts +5 -0
- package/dist/markers/MarkerKinds.js +1 -0
- package/dist/markers/area/AreaMarker.svelte +15 -63
- package/dist/markers/arrow/ArrowMarker.svelte +51 -9
- package/dist/markers/bar/BarMarker.svelte +8 -4
- package/dist/markers/bollinger/BollingerMarker.svelte +33 -18
- package/dist/markers/box/BoxMarker.svelte +40 -9
- package/dist/markers/delta/Delta.js +1 -1
- package/dist/markers/dot/DotMarker.svelte +24 -27
- package/dist/markers/image/ImageMarker.svelte +17 -12
- package/dist/markers/inset/InsetMarker.svelte +2 -2
- package/dist/markers/line/LineMarker.svelte +1 -0
- package/dist/markers/link/LinkMarker.svelte +174 -29
- package/dist/markers/regression/RegressionMarker.svelte +16 -33
- package/dist/markers/rule/RuleMarker.svelte +9 -3
- package/dist/markers/text/Declutter.d.ts +4 -0
- package/dist/markers/text/Declutter.js +26 -11
- package/dist/markers/text/TextMarker.svelte +91 -48
- package/dist/markers/tick/TickMarker.svelte +27 -25
- package/dist/markers/utils/MarkerChannels.d.ts +24 -0
- package/dist/markers/utils/MarkerChannels.js +42 -7
- package/dist/markers/utils/RowOffset.d.ts +23 -0
- package/dist/markers/utils/RowOffset.js +23 -0
- package/dist/markers/utils/RowOffsetMarks.svelte +30 -0
- package/dist/markers/utils/RowOffsetMarks.svelte.d.ts +33 -0
- package/dist/markers/utils/RowStroke.d.ts +31 -0
- package/dist/markers/utils/RowStroke.js +28 -0
- package/dist/markers/violin/ViolinMarker.svelte +75 -0
- package/dist/markers/violin/ViolinMarker.svelte.d.ts +7 -0
- package/dist/markers/violin/ViolinProfiles.d.ts +29 -0
- package/dist/markers/violin/ViolinProfiles.js +55 -0
- package/dist/markers/waffle/WaffleMarker.svelte +17 -37
- package/dist/phases/Pipeline.d.ts +5 -0
- package/dist/phases/Pipeline.js +5 -0
- package/dist/phases/data/DataPhase.js +3 -3
- package/dist/phases/data/PlotAxes.d.ts +10 -0
- package/dist/phases/data/PlotAxes.js +14 -1
- package/dist/phases/facet/FacetPanels.d.ts +1 -0
- package/dist/phases/facet/FacetPanels.js +1 -0
- package/dist/phases/mapping/MappingPhase.js +1 -1
- package/dist/phases/markers/MarkersPhase.js +2 -1
- package/dist/phases/scales/CategoryOrder.d.ts +23 -0
- package/dist/phases/scales/CategoryOrder.js +73 -0
- package/dist/phases/scales/ScalesPhase.js +21 -7
- package/dist/phases/sharedScales/SharedScalesPhase.d.ts +3 -2
- package/dist/phases/sharedScales/SharedScalesPhase.js +5 -2
- package/dist/phases/statistics/Statistics.d.ts +10 -6
- package/dist/phases/statistics/Statistics.js +20 -10
- package/dist/phases/statistics/StatisticsPhase.js +7 -2
- package/dist/phases/statistics/methods/BollingerStatistic.d.ts +1 -1
- package/dist/phases/statistics/methods/BollingerStatistic.js +13 -11
- package/dist/phases/statistics/methods/BoxStatistic.d.ts +1 -1
- package/dist/phases/statistics/methods/BoxStatistic.js +14 -12
- package/dist/phases/statistics/methods/Density2dStatistic.d.ts +1 -1
- package/dist/phases/statistics/methods/Density2dStatistic.js +13 -11
- package/dist/phases/statistics/methods/DensityStatistic.d.ts +1 -1
- package/dist/phases/statistics/methods/DensityStatistic.js +11 -9
- package/dist/phases/statistics/methods/DeviationStatistic.d.ts +8 -0
- package/dist/phases/statistics/methods/DeviationStatistic.js +111 -0
- package/dist/phases/statistics/methods/MovingAverageStatistic.d.ts +1 -1
- package/dist/phases/statistics/methods/MovingAverageStatistic.js +11 -9
- package/dist/phases/statistics/methods/RegressionStatistic.d.ts +1 -1
- package/dist/phases/statistics/methods/RegressionStatistic.js +16 -14
- package/dist/phases/transforms/ProcessedPositions.js +1 -1
- package/dist/phases/transforms/TransformsPhase.js +49 -3
- package/dist/phases/transforms/ValueSelection.d.ts +30 -0
- package/dist/phases/transforms/ValueSelection.js +53 -0
- package/dist/plots/{heatmap → correlation/heatmap}/Plot.svelte +5 -2
- package/dist/plots/{heatmap → correlation/heatmap}/Plot.svelte.d.ts +2 -2
- package/dist/plots/{heatmap → correlation/heatmap}/defaults.d.ts +2 -2
- package/dist/plots/{heatmap → correlation/heatmap}/defaults.js +5 -5
- package/dist/plots/{heatmap → correlation/heatmap}/markers.d.ts +4 -4
- package/dist/plots/{heatmap → correlation/heatmap}/markers.js +3 -3
- package/dist/plots/{scatter → correlation/scatter}/Plot.svelte +5 -2
- package/dist/plots/{scatter → correlation/scatter}/Plot.svelte.d.ts +2 -2
- package/dist/plots/{scatter → correlation/scatter}/defaults.d.ts +2 -2
- package/dist/plots/{scatter → correlation/scatter}/defaults.js +4 -4
- package/dist/plots/{scatter → correlation/scatter}/markers.d.ts +4 -4
- package/dist/plots/{scatter → correlation/scatter}/markers.js +3 -3
- package/dist/plots/{box → distribution/box}/BoxSummaries.d.ts +2 -2
- package/dist/plots/{box → distribution/box}/BoxSummaries.js +6 -6
- package/dist/plots/{box → distribution/box}/Plot.svelte +2 -2
- package/dist/plots/{box → distribution/box}/Plot.svelte.d.ts +2 -2
- package/dist/plots/{box → distribution/box}/defaults.d.ts +2 -2
- package/dist/plots/{box → distribution/box}/defaults.js +1 -1
- package/dist/plots/{box → distribution/box}/markers.d.ts +2 -2
- package/dist/plots/distribution/density/Plot.svelte +45 -0
- package/dist/plots/distribution/density/Plot.svelte.d.ts +26 -0
- package/dist/plots/distribution/density/defaults.d.ts +9 -0
- package/dist/plots/distribution/density/defaults.js +29 -0
- package/dist/plots/distribution/density/markers.d.ts +9 -0
- package/dist/plots/distribution/density/markers.js +42 -0
- package/dist/plots/{histogram → distribution/histogram}/Plot.svelte +2 -2
- package/dist/plots/{histogram → distribution/histogram}/Plot.svelte.d.ts +2 -2
- package/dist/plots/{histogram → distribution/histogram}/defaults.d.ts +2 -2
- package/dist/plots/{histogram → distribution/histogram}/defaults.js +3 -3
- package/dist/plots/{histogram → distribution/histogram}/markers.d.ts +3 -3
- package/dist/plots/{histogram → distribution/histogram}/markers.js +5 -5
- package/dist/plots/{pyramid → distribution/pyramid}/Plot.svelte +5 -2
- package/dist/plots/{pyramid → distribution/pyramid}/Plot.svelte.d.ts +2 -2
- package/dist/plots/{pyramid → distribution/pyramid}/defaults.d.ts +2 -2
- package/dist/plots/{pyramid → distribution/pyramid}/defaults.js +6 -6
- package/dist/plots/{pyramid → distribution/pyramid}/markers.d.ts +4 -4
- package/dist/plots/{pyramid → distribution/pyramid}/markers.js +6 -6
- package/dist/plots/distribution/violin/Plot.svelte +45 -0
- package/dist/plots/distribution/violin/Plot.svelte.d.ts +26 -0
- package/dist/plots/distribution/violin/defaults.d.ts +10 -0
- package/dist/plots/distribution/violin/defaults.js +58 -0
- package/dist/plots/distribution/violin/markers.d.ts +10 -0
- package/dist/plots/distribution/violin/markers.js +71 -0
- package/dist/plots/{area → evolution/area}/Plot.svelte +2 -2
- package/dist/plots/{area → evolution/area}/Plot.svelte.d.ts +2 -2
- package/dist/plots/{area → evolution/area}/defaults.d.ts +2 -2
- package/dist/plots/{area → evolution/area}/defaults.js +2 -0
- package/dist/plots/{area → evolution/area}/markers.d.ts +2 -2
- package/dist/plots/{area → evolution/area}/markers.js +1 -1
- package/dist/plots/{line → evolution/line}/Plot.svelte +2 -2
- package/dist/plots/{line → evolution/line}/Plot.svelte.d.ts +2 -2
- package/dist/plots/{line → evolution/line}/defaults.d.ts +2 -2
- package/dist/plots/{line → evolution/line}/defaults.js +2 -0
- package/dist/plots/{line → evolution/line}/markers.d.ts +11 -8
- package/dist/plots/{line → evolution/line}/markers.js +6 -4
- package/dist/plots/evolution/slope/Plot.svelte +42 -0
- package/dist/plots/evolution/slope/Plot.svelte.d.ts +26 -0
- package/dist/plots/evolution/slope/defaults.d.ts +8 -0
- package/dist/plots/evolution/slope/defaults.js +31 -0
- package/dist/plots/evolution/slope/markers.d.ts +16 -0
- package/dist/plots/evolution/slope/markers.js +79 -0
- package/dist/plots/evolution/sparkline/Plot.svelte +45 -0
- package/dist/plots/evolution/sparkline/Plot.svelte.d.ts +26 -0
- package/dist/plots/evolution/sparkline/defaults.d.ts +7 -0
- package/dist/plots/evolution/sparkline/defaults.js +23 -0
- package/dist/plots/evolution/sparkline/markers.d.ts +7 -0
- package/dist/plots/evolution/sparkline/markers.js +56 -0
- package/dist/plots/{geo → map/geo}/Core.svelte +11 -10
- package/dist/plots/{geo → map/geo}/Core.svelte.d.ts +1 -1
- package/dist/plots/map/geo/GeoFeatures.svelte.d.ts +9 -0
- package/dist/plots/map/geo/GeoFeatures.svelte.js +55 -0
- package/dist/plots/map/geo/GeoGeometry.d.ts +27 -0
- package/dist/plots/map/geo/GeoGeometry.js +142 -0
- package/dist/plots/map/geo/GeoSegments.d.ts +16 -0
- package/dist/plots/map/geo/GeoSegments.js +23 -0
- package/dist/plots/{geo → map/geo}/Plot.svelte +10 -10
- package/dist/plots/{geo → map/geo}/Plot.svelte.d.ts +2 -2
- package/dist/plots/{geo → map/geo}/defaults.d.ts +2 -2
- package/dist/plots/{geo → map/geo}/defaults.js +1 -1
- package/dist/plots/{geo → map/geo}/phases/data.d.ts +1 -1
- package/dist/plots/{geo → map/geo}/phases/data.js +7 -6
- package/dist/plots/{geo → map/geo}/phases/hover.d.ts +1 -1
- package/dist/plots/{geo → map/geo}/phases/hover.js +2 -2
- package/dist/plots/{geo → map/geo}/phases/markers.d.ts +1 -1
- package/dist/plots/{geo → map/geo}/phases/markers.js +6 -10
- package/dist/plots/{geo → map/geo}/phases/scales.d.ts +2 -2
- package/dist/plots/{geo → map/geo}/phases/scales.js +28 -12
- package/dist/plots/{geo → map/geo}/phases/tooltip.d.ts +1 -1
- package/dist/plots/map/geo/phases/tooltip.js +5 -0
- package/dist/plots/{geo → map/geo}/slices.d.ts +2 -2
- package/dist/plots/{geo → map/geo}/slices.js +2 -2
- package/dist/plots/{bar → ranking/bar}/Plot.svelte +2 -2
- package/dist/plots/{bar → ranking/bar}/Plot.svelte.d.ts +2 -2
- package/dist/plots/ranking/bar/defaults.d.ts +16 -0
- package/dist/plots/{bar → ranking/bar}/defaults.js +15 -9
- package/dist/plots/{bar → ranking/bar}/markers.d.ts +8 -8
- package/dist/plots/{bar → ranking/bar}/markers.js +8 -17
- package/dist/plots/ranking/bullet/Plot.svelte +42 -0
- package/dist/plots/ranking/bullet/Plot.svelte.d.ts +26 -0
- package/dist/plots/ranking/bullet/defaults.d.ts +8 -0
- package/dist/plots/ranking/bullet/defaults.js +24 -0
- package/dist/plots/ranking/bullet/markers.d.ts +10 -0
- package/dist/plots/ranking/bullet/markers.js +90 -0
- package/dist/plots/ranking/cleveland/ClevelandConnector.d.ts +48 -0
- package/dist/plots/ranking/cleveland/ClevelandConnector.js +140 -0
- package/dist/plots/ranking/cleveland/ClevelandMarkers.d.ts +33 -0
- package/dist/plots/ranking/cleveland/ClevelandMarkers.js +375 -0
- package/dist/plots/ranking/cleveland/ClevelandRanges.d.ts +31 -0
- package/dist/plots/ranking/cleveland/ClevelandRanges.js +116 -0
- package/dist/plots/ranking/cleveland/Plot.svelte +45 -0
- package/dist/plots/ranking/cleveland/Plot.svelte.d.ts +26 -0
- package/dist/plots/ranking/cleveland/defaults.d.ts +13 -0
- package/dist/plots/ranking/cleveland/defaults.js +66 -0
- package/dist/plots/ranking/dumbbell/Plot.svelte +45 -0
- package/dist/plots/ranking/dumbbell/Plot.svelte.d.ts +26 -0
- package/dist/plots/ranking/dumbbell/defaults.d.ts +9 -0
- package/dist/plots/ranking/dumbbell/defaults.js +19 -0
- package/dist/plots/ranking/forest/Plot.svelte +42 -0
- package/dist/plots/ranking/forest/Plot.svelte.d.ts +26 -0
- package/dist/plots/ranking/forest/defaults.d.ts +11 -0
- package/dist/plots/ranking/forest/defaults.js +20 -0
- package/dist/plots/ranking/lollipop/Plot.svelte +45 -0
- package/dist/plots/ranking/lollipop/Plot.svelte.d.ts +26 -0
- package/dist/plots/ranking/lollipop/defaults.d.ts +9 -0
- package/dist/plots/ranking/lollipop/defaults.js +18 -0
- package/dist/plots/utils/RowNumbers.d.ts +16 -0
- package/dist/plots/utils/RowNumbers.js +24 -0
- package/dist/plots/utils/gaps.js +1 -1
- package/dist/plots/utils/segments.js +1 -1
- package/dist/types/configuration/styling.d.ts +276 -143
- package/dist/types/layout/coordinates.d.ts +5 -4
- package/dist/types/layout/legend.d.ts +21 -5
- package/dist/types/layout/plot.d.ts +44 -1
- package/dist/types/layout/scales.d.ts +39 -7
- package/dist/types/layout/statistics/deviation.d.ts +40 -0
- package/dist/types/layout/statistics/index.d.ts +7 -2
- package/dist/types/layout/styles/base.d.ts +18 -0
- package/dist/types/layout/styles/bullet.d.ts +25 -0
- package/dist/types/layout/styles/connector.d.ts +98 -0
- package/dist/types/layout/styles/curve.d.ts +11 -0
- package/dist/types/layout/styles/frame.d.ts +17 -0
- package/dist/types/layout/styles/gaps.d.ts +12 -0
- package/dist/types/layout/styles/geo.d.ts +55 -0
- package/dist/types/layout/styles/index.d.ts +8 -0
- package/dist/types/layout/styles/index.js +8 -0
- package/dist/types/layout/styles/values.d.ts +47 -0
- package/dist/types/layout/timeline.d.ts +5 -2
- package/dist/types/layout/tooltip.d.ts +6 -2
- package/dist/types/markers/axis/area.d.ts +2 -2
- package/dist/types/markers/axis/arrow.d.ts +3 -0
- package/dist/types/markers/axis/axisBasedMarkersConfig.d.ts +2 -1
- package/dist/types/markers/axis/bar.d.ts +1 -1
- package/dist/types/markers/axis/box.d.ts +5 -0
- package/dist/types/markers/axis/difference.d.ts +2 -2
- package/dist/types/markers/axis/image.d.ts +3 -2
- package/dist/types/markers/axis/line.d.ts +2 -0
- package/dist/types/markers/axis/rule.d.ts +9 -0
- package/dist/types/markers/axis/trail.d.ts +2 -3
- package/dist/types/markers/axis/violin.d.ts +25 -0
- package/dist/types/markers/basic/dot.d.ts +3 -2
- package/dist/types/markers/basic/text.d.ts +13 -3
- package/dist/types/markers/channels/commonMarkerConfig.d.ts +7 -3
- package/dist/types/markers/channels/commonMarkerConfigWithRowOffset.d.ts +13 -0
- package/dist/types/markers/common.d.ts +1 -1
- package/dist/types/markers/common.js +1 -0
- package/dist/types/markers/geo/link.d.ts +5 -1
- package/dist/types/phases/index.d.ts +1 -1
- package/dist/types/phases/scales/phase.d.ts +5 -1
- package/dist/types/phases/state.d.ts +15 -2
- package/dist/types/phases/statistics/source.d.ts +3 -1
- package/dist/types/phases/transforms/phase.d.ts +22 -0
- package/dist/types/plots/{heatmap → correlation/heatmap}/props.d.ts +6 -6
- package/dist/types/plots/{heatmap → correlation/heatmap}/state.d.ts +4 -4
- package/dist/types/plots/{scatter → correlation/scatter}/props.d.ts +6 -6
- package/dist/types/plots/{scatter → correlation/scatter}/state.d.ts +2 -2
- package/dist/types/plots/{box → distribution/box}/props.d.ts +6 -6
- package/dist/types/plots/{box → distribution/box}/state.d.ts +3 -3
- package/dist/types/plots/distribution/density/props.d.ts +23 -0
- package/dist/types/plots/distribution/density/state.d.ts +6 -0
- package/dist/types/plots/{histogram → distribution/histogram}/props.d.ts +7 -7
- package/dist/types/plots/{histogram → distribution/histogram}/state.d.ts +2 -2
- package/dist/types/plots/distribution/histogram/state.js +1 -0
- package/dist/types/plots/{pyramid → distribution/pyramid}/props.d.ts +6 -6
- package/dist/types/plots/distribution/pyramid/props.js +1 -0
- package/dist/types/plots/{pyramid → distribution/pyramid}/state.d.ts +3 -3
- package/dist/types/plots/distribution/pyramid/state.js +1 -0
- package/dist/types/plots/distribution/violin/props.d.ts +23 -0
- package/dist/types/plots/distribution/violin/props.js +1 -0
- package/dist/types/plots/distribution/violin/state.d.ts +6 -0
- package/dist/types/plots/distribution/violin/state.js +1 -0
- package/dist/types/plots/{area → evolution/area}/props.d.ts +6 -6
- package/dist/types/plots/evolution/area/props.js +1 -0
- package/dist/types/plots/{area → evolution/area}/state.d.ts +2 -2
- package/dist/types/plots/evolution/area/state.js +1 -0
- package/dist/types/plots/evolution/line/props.d.ts +10 -0
- package/dist/types/plots/evolution/line/props.js +1 -0
- package/dist/types/plots/{line → evolution/line}/state.d.ts +3 -3
- package/dist/types/plots/evolution/line/state.js +1 -0
- package/dist/types/plots/evolution/slope/props.d.ts +5 -0
- package/dist/types/plots/evolution/slope/props.js +1 -0
- package/dist/types/plots/evolution/slope/state.d.ts +5 -0
- package/dist/types/plots/evolution/slope/state.js +1 -0
- package/dist/types/plots/evolution/sparkline/props.d.ts +5 -0
- package/dist/types/plots/evolution/sparkline/props.js +1 -0
- package/dist/types/plots/evolution/sparkline/state.d.ts +5 -0
- package/dist/types/plots/evolution/sparkline/state.js +1 -0
- package/dist/types/plots/{geo → map/geo}/props.d.ts +8 -8
- package/dist/types/plots/map/geo/props.js +1 -0
- package/dist/types/plots/{geo → map/geo}/state.d.ts +18 -11
- package/dist/types/plots/map/geo/state.js +1 -0
- package/dist/types/plots/props.d.ts +1 -1
- package/dist/types/plots/{bar → ranking/bar}/props.d.ts +6 -6
- package/dist/types/plots/ranking/bar/props.js +1 -0
- package/dist/types/plots/{bar → ranking/bar}/state.d.ts +2 -2
- package/dist/types/plots/ranking/bar/state.js +1 -0
- package/dist/types/plots/ranking/bullet/props.d.ts +22 -0
- package/dist/types/plots/ranking/bullet/props.js +1 -0
- package/dist/types/plots/ranking/bullet/state.d.ts +5 -0
- package/dist/types/plots/ranking/bullet/state.js +1 -0
- package/dist/types/plots/ranking/cleveland/props.d.ts +10 -0
- package/dist/types/plots/ranking/cleveland/props.js +1 -0
- package/dist/types/plots/ranking/cleveland/state.d.ts +49 -0
- package/dist/types/plots/ranking/cleveland/state.js +1 -0
- package/dist/types/plots/ranking/dumbbell/props.d.ts +10 -0
- package/dist/types/plots/ranking/dumbbell/props.js +1 -0
- package/dist/types/plots/ranking/dumbbell/state.d.ts +5 -0
- package/dist/types/plots/ranking/dumbbell/state.js +1 -0
- package/dist/types/plots/ranking/forest/props.d.ts +23 -0
- package/dist/types/plots/ranking/forest/props.js +1 -0
- package/dist/types/plots/ranking/forest/state.d.ts +5 -0
- package/dist/types/plots/ranking/forest/state.js +1 -0
- package/dist/types/plots/ranking/lollipop/props.d.ts +10 -0
- package/dist/types/plots/ranking/lollipop/props.js +1 -0
- package/dist/types/plots/ranking/lollipop/state.d.ts +5 -0
- package/dist/types/plots/ranking/lollipop/state.js +1 -0
- package/dist/types/plots/segments/common.d.ts +4 -1
- package/dist/utils/OpacityScale.d.ts +14 -0
- package/dist/utils/OpacityScale.js +43 -0
- package/dist/utils/{symbol.d.ts → SymbolPath.d.ts} +0 -12
- package/dist/utils/{symbol.js → SymbolPath.js} +0 -24
- package/dist/utils/SymbolScale.d.ts +18 -0
- package/dist/utils/SymbolScale.js +29 -0
- package/dist/utils/color/ColorRamp.d.ts +27 -0
- package/dist/utils/color/ColorRamp.js +120 -0
- package/dist/utils/color/CssColor.d.ts +19 -0
- package/dist/utils/color/CssColor.js +114 -0
- package/dist/utils/color/Palette.d.ts +21 -0
- package/dist/utils/color/Palette.js +52 -0
- package/dist/utils/color/index.d.ts +11 -3
- package/dist/utils/color/index.js +14 -3
- package/dist/utils/grouping.js +1 -1
- package/docs/architecture.md +1 -1
- package/docs/chrome.md +2 -2
- package/docs/composer.md +2 -2
- package/docs/concepts.md +1 -1
- package/docs/development.md +1 -1
- package/docs/facets.md +3 -3
- package/docs/getting-started.md +2 -2
- package/docs/legend.md +13 -11
- package/docs/markers.md +29 -27
- package/docs/plots/correlation/heatmap.md +26 -0
- package/docs/plots/correlation/scatter.md +35 -0
- package/docs/plots/distribution/box.md +28 -0
- package/docs/plots/distribution/density.md +26 -0
- package/docs/plots/distribution/histogram.md +33 -0
- package/docs/plots/distribution/pyramid.md +31 -0
- package/docs/plots/distribution/violin.md +35 -0
- package/docs/plots/evolution/area.md +32 -0
- package/docs/plots/evolution/line.md +93 -0
- package/docs/plots/evolution/slope.md +39 -0
- package/docs/plots/evolution/sparkline.md +34 -0
- package/docs/plots/ranking/bar.md +59 -0
- package/docs/plots/ranking/bullet.md +37 -0
- package/docs/plots/ranking/cleveland.md +54 -0
- package/docs/plots/ranking/dumbbell.md +39 -0
- package/docs/plots/ranking/forest.md +40 -0
- package/docs/plots/ranking/lollipop.md +39 -0
- package/docs/plots.md +22 -280
- package/docs/scales.md +30 -24
- package/docs/styles-and-segments.md +24 -21
- package/docs/theming.md +23 -20
- package/docs/timeline.md +3 -3
- package/docs/tooltip-and-hover.md +10 -10
- package/docs/transforms-and-statistics.md +13 -12
- package/examples/BarValues.svelte +1 -1
- package/examples/Box.svelte +1 -1
- package/examples/Bullet.svelte +17 -0
- package/examples/Chrome.svelte +1 -1
- package/examples/ChromeOrder.svelte +1 -1
- package/examples/Cleveland.svelte +15 -0
- package/examples/Composer.svelte +2 -2
- package/examples/CustomTooltip.svelte +1 -1
- package/examples/Density.svelte +7 -0
- package/examples/Dumbbell.svelte +16 -0
- package/examples/Facets.svelte +1 -1
- package/examples/FacetsCarousel.svelte +1 -1
- package/examples/FacetsRowsCols.svelte +1 -1
- package/examples/FirstPlot.svelte +1 -1
- package/examples/Forest.svelte +17 -0
- package/examples/Gaps.svelte +2 -2
- package/examples/GroupedBars.svelte +1 -1
- package/examples/Heatmap.svelte +3 -3
- package/examples/HeatmapSegments.svelte +8 -8
- package/examples/Histogram.svelte +1 -1
- package/examples/HorizontalBars.svelte +1 -1
- package/examples/LegendSections.svelte +1 -1
- package/examples/LegendToggle.svelte +1 -1
- package/examples/LineByRegion.svelte +1 -1
- package/examples/LineDates.svelte +1 -1
- package/examples/LineStep.svelte +16 -0
- package/examples/LineStepSegment.svelte +18 -0
- package/examples/Lollipop.svelte +17 -0
- package/examples/Markers.svelte +1 -1
- package/examples/MovingAverage.svelte +1 -1
- package/examples/Pyramid.svelte +9 -2
- package/examples/Regression.svelte +2 -2
- package/examples/ResponsiveLine.svelte +1 -1
- package/examples/Scales.svelte +1 -1
- package/examples/Scatter.svelte +2 -2
- package/examples/SegmentHighlight.svelte +1 -1
- package/examples/Segments.svelte +1 -1
- package/examples/SegmentsBySeries.svelte +1 -1
- package/examples/Slope.svelte +17 -0
- package/examples/Sparkline.svelte +14 -0
- package/examples/StackedArea.svelte +1 -1
- package/examples/StackedBars.svelte +1 -1
- package/examples/TimelinePlayer.svelte +1 -1
- package/examples/TimelineRule.svelte +1 -1
- package/examples/Tooltip.svelte +1 -1
- package/examples/ValueLabels.svelte +1 -1
- package/examples/Violin.svelte +14 -0
- package/examples/datasets/argentina-chile-trends.ts +34 -0
- package/examples/datasets/commodity-prices.ts +48 -0
- package/examples/datasets/countries-over-time.ts +368 -0
- package/examples/datasets/daily-temperature.ts +121 -0
- package/examples/datasets/earthquakes.ts +977 -0
- package/examples/datasets/flight-routes.ts +29 -0
- package/examples/datasets/height-density.ts +37 -0
- package/examples/datasets/heights.ts +370 -0
- package/examples/datasets/index.ts +24 -0
- package/examples/datasets/inflation-by-region.ts +44 -0
- package/examples/datasets/inflation-ranges.ts +34 -0
- package/examples/datasets/iris-flower.ts +207 -0
- package/examples/datasets/life-expectancy.ts +95 -0
- package/examples/datasets/napoleons-march.ts +182 -0
- package/examples/datasets/penguins.ts +54 -0
- package/examples/datasets/population-by-age-with-gaps.ts +23 -0
- package/examples/datasets/population-by-age.ts +890 -0
- package/examples/datasets/province-population.ts +521 -0
- package/examples/datasets/stock-prices.ts +63 -0
- package/examples/datasets/weather-stations-over-time.ts +31 -0
- package/examples/datasets/weather-stations.ts +22 -0
- package/examples/datasets/wind-vectors.ts +30 -0
- package/examples/datasets/world-temperature.ts +400 -0
- package/llms-full.txt +22 -11
- package/llms.txt +32 -4
- package/package.json +10 -1
- package/dist/plots/bar/defaults.d.ts +0 -9
- package/dist/plots/geo/features.svelte.d.ts +0 -5
- package/dist/plots/geo/features.svelte.js +0 -44
- package/dist/plots/geo/phases/tooltip.js +0 -5
- package/dist/plots/utils/geoAccessors.d.ts +0 -72
- package/dist/plots/utils/geoAccessors.js +0 -220
- package/dist/plots/utils/geoSegments.d.ts +0 -29
- package/dist/plots/utils/geoSegments.js +0 -37
- package/dist/types/layout/styles.d.ts +0 -122
- package/dist/types/markers/axis/curveName.d.ts +0 -2
- package/dist/types/plots/line/props.d.ts +0 -10
- package/dist/utils/color/contrast.d.ts +0 -9
- package/dist/utils/color/contrast.js +0 -40
- package/dist/utils/color/cssColor.d.ts +0 -4
- package/dist/utils/color/cssColor.js +0 -77
- package/dist/utils/color/ramp.d.ts +0 -17
- package/dist/utils/color/ramp.js +0 -110
- package/dist/utils/opacity.d.ts +0 -9
- package/dist/utils/opacity.js +0 -38
- package/examples/data.ts +0 -324
- /package/dist/plots/{box → distribution/box}/markers.js +0 -0
- /package/dist/types/layout/{styles.js → statistics/deviation.js} +0 -0
- /package/dist/types/{markers/axis/curveName.js → layout/styles/base.js} +0 -0
- /package/dist/types/{plots/area/props.js → layout/styles/bullet.js} +0 -0
- /package/dist/types/{plots/area/state.js → layout/styles/connector.js} +0 -0
- /package/dist/types/{plots/bar/props.js → layout/styles/curve.js} +0 -0
- /package/dist/types/{plots/bar/state.js → layout/styles/frame.js} +0 -0
- /package/dist/types/{plots/box/props.js → layout/styles/gaps.js} +0 -0
- /package/dist/types/{plots/box/state.js → layout/styles/geo.js} +0 -0
- /package/dist/types/{plots/geo/props.js → layout/styles/values.js} +0 -0
- /package/dist/types/{plots/geo/state.js → markers/axis/violin.js} +0 -0
- /package/dist/types/{plots/heatmap/props.js → markers/channels/commonMarkerConfigWithRowOffset.js} +0 -0
- /package/dist/types/plots/{histogram → correlation/heatmap}/props.js +0 -0
- /package/dist/types/plots/{heatmap → correlation/heatmap}/state.js +0 -0
- /package/dist/types/plots/{line → correlation/scatter}/props.js +0 -0
- /package/dist/types/plots/{histogram → correlation/scatter}/state.js +0 -0
- /package/dist/types/plots/{pyramid → distribution/box}/props.js +0 -0
- /package/dist/types/plots/{line → distribution/box}/state.js +0 -0
- /package/dist/types/plots/{scatter → distribution/density}/props.js +0 -0
- /package/dist/types/plots/{pyramid → distribution/density}/state.js +0 -0
- /package/dist/types/plots/{scatter/state.js → distribution/histogram/props.js} +0 -0
- /package/dist/{plots/utils → utils}/accessors.d.ts +0 -0
- /package/dist/{plots/utils → utils}/accessors.js +0 -0
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
import type { ProcessedRow } from '../../types/phases';
|
|
2
|
+
import type { DensityKernel } from '../../types/transforms/density';
|
|
3
|
+
/** One violin: a category's density curve. */
|
|
4
|
+
export type ViolinProfile = {
|
|
5
|
+
category: unknown;
|
|
6
|
+
/** The density estimate, in order along the value axis. */
|
|
7
|
+
curve: {
|
|
8
|
+
value: number;
|
|
9
|
+
density: number;
|
|
10
|
+
}[];
|
|
11
|
+
};
|
|
12
|
+
/** How the density of each category is estimated. */
|
|
13
|
+
export type ViolinEstimate = {
|
|
14
|
+
kernel?: DensityKernel;
|
|
15
|
+
bandwidth?: number;
|
|
16
|
+
/** Keeps each curve within its values' own extent. Defaults to `true`. */
|
|
17
|
+
trim?: boolean;
|
|
18
|
+
};
|
|
19
|
+
/** The violins of a set of rows, one per category. */
|
|
20
|
+
export declare class ViolinProfiles {
|
|
21
|
+
#private;
|
|
22
|
+
/** One profile per category of `rows` with at least two values, in the order the rows first reach it. */
|
|
23
|
+
static of(rows: ProcessedRow[], read: {
|
|
24
|
+
category: (row: ProcessedRow) => unknown;
|
|
25
|
+
value: (row: ProcessedRow) => unknown;
|
|
26
|
+
}, estimate?: ViolinEstimate): ViolinProfile[];
|
|
27
|
+
/** The densest point of any of `profiles`, for violins that share one density scale. */
|
|
28
|
+
static peak(profiles: ViolinProfile[]): number;
|
|
29
|
+
}
|
|
@@ -0,0 +1,55 @@
|
|
|
1
|
+
import { Transforms } from '../../phases/transforms/Transforms';
|
|
2
|
+
import { resolveAccessor } from '../../utils/accessors';
|
|
3
|
+
import { isGapValue } from '../../plots/utils/gaps';
|
|
4
|
+
/** The violins of a set of rows, one per category. */
|
|
5
|
+
export class ViolinProfiles {
|
|
6
|
+
/** One profile per category of `rows` with at least two values, in the order the rows first reach it. */
|
|
7
|
+
static of(rows, read, estimate = {}) {
|
|
8
|
+
const groups = new Map();
|
|
9
|
+
for (const row of rows) {
|
|
10
|
+
const raw = read.value(row);
|
|
11
|
+
if (isGapValue(raw))
|
|
12
|
+
continue;
|
|
13
|
+
const value = Number(raw);
|
|
14
|
+
if (!Number.isFinite(value))
|
|
15
|
+
continue;
|
|
16
|
+
const category = read.category(row);
|
|
17
|
+
const key = String(category);
|
|
18
|
+
const group = groups.get(key);
|
|
19
|
+
if (group) {
|
|
20
|
+
group.rows.push(row);
|
|
21
|
+
group.values.push(value);
|
|
22
|
+
}
|
|
23
|
+
else
|
|
24
|
+
groups.set(key, { category, rows: [row], values: [value] });
|
|
25
|
+
}
|
|
26
|
+
return [...groups.values()].flatMap(({ category, rows: own, values }) => {
|
|
27
|
+
if (values.length < 2)
|
|
28
|
+
return [];
|
|
29
|
+
const extent = [Math.min(...values), Math.max(...values)];
|
|
30
|
+
const curve = ViolinProfiles.#curve(own, read.value, estimate, extent);
|
|
31
|
+
return curve.length < 2 ? [] : [{ category, curve }];
|
|
32
|
+
});
|
|
33
|
+
}
|
|
34
|
+
/** The densest point of any of `profiles`, for violins that share one density scale. */
|
|
35
|
+
static peak(profiles) {
|
|
36
|
+
return Math.max(0, ...profiles.flatMap((p) => p.curve.map((point) => point.density)));
|
|
37
|
+
}
|
|
38
|
+
static #curve(rows, value, estimate, extent) {
|
|
39
|
+
const trim = estimate.trim ?? true;
|
|
40
|
+
const result = Transforms.run({
|
|
41
|
+
type: 'densityY',
|
|
42
|
+
data: rows,
|
|
43
|
+
y: value,
|
|
44
|
+
kernel: estimate.kernel,
|
|
45
|
+
bandwidth: estimate.bandwidth,
|
|
46
|
+
trim
|
|
47
|
+
});
|
|
48
|
+
const along = resolveAccessor(result.y);
|
|
49
|
+
const density = resolveAccessor(result.x);
|
|
50
|
+
return result.data
|
|
51
|
+
.map((row) => ({ value: Number(along(row)), density: Number(density(row)) }))
|
|
52
|
+
.map((p) => (trim ? { ...p, value: Math.min(Math.max(p.value, extent[0]), extent[1]) } : p))
|
|
53
|
+
.filter((p) => Number.isFinite(p.value) && Number.isFinite(p.density));
|
|
54
|
+
}
|
|
55
|
+
}
|
|
@@ -10,6 +10,7 @@
|
|
|
10
10
|
|
|
11
11
|
const plot = usePlot();
|
|
12
12
|
const isHorizontal = $derived(plot.axes?.isHorizontal ?? false);
|
|
13
|
+
const WaffleMark = $derived(isHorizontal ? WaffleX : WaffleY);
|
|
13
14
|
|
|
14
15
|
const cfg = $derived(getConfiguration());
|
|
15
16
|
const data = $derived(marker.data ?? []);
|
|
@@ -17,40 +18,19 @@
|
|
|
17
18
|
const fill = $derived(channelFill ?? marker.styles?.fill ?? cfg.palette[0]);
|
|
18
19
|
</script>
|
|
19
20
|
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
strokeOpacity={marker.styles?.strokeOpacity}
|
|
37
|
-
/>
|
|
38
|
-
{:else}
|
|
39
|
-
<WaffleY
|
|
40
|
-
{data}
|
|
41
|
-
x={marker.x}
|
|
42
|
-
y={marker.y}
|
|
43
|
-
y1={marker.y1}
|
|
44
|
-
y2={marker.y2}
|
|
45
|
-
unit={marker.unit}
|
|
46
|
-
multiple={marker.multiple}
|
|
47
|
-
gap={marker.gap}
|
|
48
|
-
round={marker.round}
|
|
49
|
-
borderRadius={marker.styles?.borderRadius}
|
|
50
|
-
{fill}
|
|
51
|
-
fillOpacity={marker.styles?.fillOpacity}
|
|
52
|
-
stroke={marker.styles?.stroke}
|
|
53
|
-
strokeWidth={marker.styles?.strokeWidth}
|
|
54
|
-
strokeOpacity={marker.styles?.strokeOpacity}
|
|
55
|
-
/>
|
|
56
|
-
{/if}
|
|
21
|
+
<WaffleMark
|
|
22
|
+
{data}
|
|
23
|
+
x={marker.x}
|
|
24
|
+
y={marker.y}
|
|
25
|
+
{...isHorizontal ? { x1: marker.x1, x2: marker.x2 } : { y1: marker.y1, y2: marker.y2 }}
|
|
26
|
+
unit={marker.unit}
|
|
27
|
+
multiple={marker.multiple}
|
|
28
|
+
gap={marker.gap}
|
|
29
|
+
round={marker.round}
|
|
30
|
+
borderRadius={marker.styles?.borderRadius}
|
|
31
|
+
{fill}
|
|
32
|
+
fillOpacity={marker.styles?.fillOpacity}
|
|
33
|
+
stroke={marker.styles?.stroke}
|
|
34
|
+
strokeWidth={marker.styles?.strokeWidth}
|
|
35
|
+
strokeOpacity={marker.styles?.strokeOpacity}
|
|
36
|
+
/>
|
|
@@ -15,6 +15,11 @@ export type AxisPipelineProps<TData extends Record<string, unknown>> = {
|
|
|
15
15
|
opacity?: unknown;
|
|
16
16
|
r?: unknown;
|
|
17
17
|
symbol?: unknown;
|
|
18
|
+
lower?: Accessor<TData, unknown>;
|
|
19
|
+
upper?: Accessor<TData, unknown>;
|
|
20
|
+
error?: Accessor<TData, unknown>;
|
|
21
|
+
target?: unknown;
|
|
22
|
+
ranges?: unknown[];
|
|
18
23
|
segments?: unknown;
|
|
19
24
|
styles?: {
|
|
20
25
|
gaps?: unknown;
|
package/dist/phases/Pipeline.js
CHANGED
|
@@ -210,6 +210,11 @@ export class Pipeline {
|
|
|
210
210
|
opacity: props.opacity,
|
|
211
211
|
r: props.r,
|
|
212
212
|
symbol: props.symbol,
|
|
213
|
+
lower: props.lower,
|
|
214
|
+
upper: props.upper,
|
|
215
|
+
error: props.error,
|
|
216
|
+
target: props.target,
|
|
217
|
+
ranges: props.ranges,
|
|
213
218
|
segments: props.segments ?? {},
|
|
214
219
|
styles: props.styles,
|
|
215
220
|
gaps: props.styles?.gaps,
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { buildSeries } from '../../utils/grouping';
|
|
2
|
-
import {
|
|
3
|
-
import { resolveAccessor } from '../../
|
|
2
|
+
import { ColorRamp } from '../../utils/color';
|
|
3
|
+
import { resolveAccessor } from '../../utils/accessors';
|
|
4
4
|
import { buildGroupedSeries, buildScopedMarkerGroups } from '../../plots/utils/segments';
|
|
5
5
|
import { buildGapFillMaps, isGapValue } from '../../plots/utils/gaps';
|
|
6
6
|
import { FacetPanels } from '../facet/FacetPanels';
|
|
@@ -34,7 +34,7 @@ export class DataPhase {
|
|
|
34
34
|
given: { x: state.x !== undefined, y: state.y !== undefined },
|
|
35
35
|
discrete: options.discreteAxes
|
|
36
36
|
});
|
|
37
|
-
const colorForSeries =
|
|
37
|
+
const colorForSeries = ColorRamp.resolve(scales.color, (options.colorOrder ? options.colorOrder(fullSeries) : fullSeries).map((s) => s.name), ctx.cfg.palette);
|
|
38
38
|
const panelSeries = state.panels && state.panelOf && !series
|
|
39
39
|
? FacetPanels.splitSeries(fullSeries, state.panels, state.panelOf)
|
|
40
40
|
: fullSeries;
|
|
@@ -58,6 +58,16 @@ export declare class PlotAxes {
|
|
|
58
58
|
static categoryOf(state: {
|
|
59
59
|
axes?: PlotAxes;
|
|
60
60
|
}): AxisChannelName;
|
|
61
|
+
/**
|
|
62
|
+
* Where marks that rise from a baseline start along the value axis: zero,
|
|
63
|
+
* or the nearest end of a pinned domain that leaves zero out.
|
|
64
|
+
*/
|
|
65
|
+
static baselineOf(state: {
|
|
66
|
+
axes?: PlotAxes;
|
|
67
|
+
scales: Partial<Record<AxisChannelName, {
|
|
68
|
+
domain?: readonly unknown[];
|
|
69
|
+
}>>;
|
|
70
|
+
}): number;
|
|
61
71
|
/** The other position axis. */
|
|
62
72
|
static other(axis: AxisChannelName): AxisChannelName;
|
|
63
73
|
/**
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { resolveAccessor } from '../../
|
|
1
|
+
import { resolveAccessor } from '../../utils/accessors';
|
|
2
2
|
import { isGapValue } from '../../plots/utils/gaps';
|
|
3
3
|
import { DISCRETE_SCALE_TYPES, TEMPORAL_SCALE_TYPES } from '../../types/layout/scales';
|
|
4
4
|
const AXES = ['x', 'y'];
|
|
@@ -47,6 +47,19 @@ export class PlotAxes {
|
|
|
47
47
|
static categoryOf(state) {
|
|
48
48
|
return state.axes?.category ?? 'x';
|
|
49
49
|
}
|
|
50
|
+
/**
|
|
51
|
+
* Where marks that rise from a baseline start along the value axis: zero,
|
|
52
|
+
* or the nearest end of a pinned domain that leaves zero out.
|
|
53
|
+
*/
|
|
54
|
+
static baselineOf(state) {
|
|
55
|
+
const domain = state.scales[PlotAxes.valueOf(state)]?.domain;
|
|
56
|
+
const lo = Number(domain?.[0]);
|
|
57
|
+
const hi = Number(domain?.[(domain?.length ?? 1) - 1]);
|
|
58
|
+
if (!domain || domain.length < 2 || Number.isNaN(lo) || Number.isNaN(hi))
|
|
59
|
+
return 0;
|
|
60
|
+
const [min, max] = [Math.min(lo, hi), Math.max(lo, hi)];
|
|
61
|
+
return min > 0 ? min : max < 0 ? max : 0;
|
|
62
|
+
}
|
|
50
63
|
/** The other position axis. */
|
|
51
64
|
static other(axis) {
|
|
52
65
|
return axis === 'x' ? 'y' : 'x';
|
|
@@ -63,6 +63,7 @@ export class FacetPanels {
|
|
|
63
63
|
scopedGroups: state.scopedGroups?.filter((g) => has(g.panel)),
|
|
64
64
|
groupedSeries: state.groupedSeries?.filter((g) => has(g.series.panel)),
|
|
65
65
|
processedGroups: state.processedGroups?.filter((g) => has(g.series.panel)),
|
|
66
|
+
labelled: state.labelled?.filter((row) => has(row[PANEL_KEY])),
|
|
66
67
|
processedData: state.processedData && {
|
|
67
68
|
...state.processedData,
|
|
68
69
|
data: state.processedData.data.filter((row) => has(row[PANEL_KEY]))
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { resolveAccessor } from '../../
|
|
1
|
+
import { resolveAccessor } from '../../utils/accessors';
|
|
2
2
|
/**
|
|
3
3
|
* The "mapping" phase every axis-based plot shares: every channel resolved to
|
|
4
4
|
* a row accessor. `x`/`y` (and `color`) read the first series' own, falling
|
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import { MarkerChannels } from '../../markers/utils/MarkerChannels';
|
|
1
2
|
/**
|
|
2
3
|
* The shared "markers" phase: everything the plot draws, bottom to top - the
|
|
3
4
|
* plot kind's own marks, then what the "statistics" phase left in
|
|
@@ -21,7 +22,7 @@ export class MarkersPhase {
|
|
|
21
22
|
: [];
|
|
22
23
|
return {
|
|
23
24
|
...state,
|
|
24
|
-
markers: [...options.marks(state, ctx), ...(state.markers ?? []), ...valueLabels]
|
|
25
|
+
markers: MarkerChannels.inheritPosition(MarkerChannels.inheritAll([...options.marks(state, ctx), ...(state.markers ?? []), ...valueLabels], state.scales), state.processedData)
|
|
25
26
|
};
|
|
26
27
|
};
|
|
27
28
|
}
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
import { PlotAxes } from '../data/PlotAxes';
|
|
2
|
+
import { type IntervalAccessors } from '../../plots/utils/RowNumbers';
|
|
3
|
+
import type { AxisChannelName } from '../../types/layout/mapping';
|
|
4
|
+
import type { CategorySort } from '../../types/layout/scales';
|
|
5
|
+
import type { ProcessedData } from '../../types/phases';
|
|
6
|
+
/**
|
|
7
|
+
* The order of a plot's categories under a declarative `scales.*.sort`: read off
|
|
8
|
+
* the processed rows, by what each category holds on the value axis - its value
|
|
9
|
+
* in a series, the sum of its values, or the spread between its lowest and its
|
|
10
|
+
* highest.
|
|
11
|
+
*/
|
|
12
|
+
export declare class CategoryOrder {
|
|
13
|
+
/** Whether a `sort` is a {@link CategorySort} rather than a comparator. */
|
|
14
|
+
static isDeclarative(sort: unknown): sort is CategorySort;
|
|
15
|
+
/**
|
|
16
|
+
* The categories of `axis`, in the order `sort` gives them; `undefined` without rows to
|
|
17
|
+
* read. The state is whatever has the processed rows and the axes.
|
|
18
|
+
*/
|
|
19
|
+
static of(sort: CategorySort, state: {
|
|
20
|
+
processedData?: ProcessedData;
|
|
21
|
+
axes?: PlotAxes;
|
|
22
|
+
} & IntervalAccessors, axis: AxisChannelName): unknown[] | undefined;
|
|
23
|
+
}
|
|
@@ -0,0 +1,73 @@
|
|
|
1
|
+
import { ProcessedPositions } from '../transforms/ProcessedPositions';
|
|
2
|
+
import { SERIES_KEY } from '../transforms/TransformsPhase';
|
|
3
|
+
import { PlotAxes } from '../data/PlotAxes';
|
|
4
|
+
import { RowNumbers } from '../../plots/utils/RowNumbers';
|
|
5
|
+
import { isGapValue } from '../../plots/utils/gaps';
|
|
6
|
+
/**
|
|
7
|
+
* The order of a plot's categories under a declarative `scales.*.sort`: read off
|
|
8
|
+
* the processed rows, by what each category holds on the value axis - its value
|
|
9
|
+
* in a series, the sum of its values, or the spread between its lowest and its
|
|
10
|
+
* highest.
|
|
11
|
+
*/
|
|
12
|
+
export class CategoryOrder {
|
|
13
|
+
/** Whether a `sort` is a {@link CategorySort} rather than a comparator. */
|
|
14
|
+
static isDeclarative(sort) {
|
|
15
|
+
return typeof sort === 'object' && sort !== null && 'by' in sort;
|
|
16
|
+
}
|
|
17
|
+
/**
|
|
18
|
+
* The categories of `axis`, in the order `sort` gives them; `undefined` without rows to
|
|
19
|
+
* read. The state is whatever has the processed rows and the axes.
|
|
20
|
+
*/
|
|
21
|
+
static of(sort, state, axis) {
|
|
22
|
+
const processed = state.processedData;
|
|
23
|
+
if (!processed)
|
|
24
|
+
return undefined;
|
|
25
|
+
const valueAxis = PlotAxes.valueOf(state);
|
|
26
|
+
const position = ProcessedPositions.of(processed, valueAxis);
|
|
27
|
+
const categoryOf = position[axis];
|
|
28
|
+
const valueOf = position[valueAxis];
|
|
29
|
+
// Each category, in the order the rows give them, with the values it holds.
|
|
30
|
+
const held = new Map();
|
|
31
|
+
for (const row of processed.data) {
|
|
32
|
+
const category = categoryOf(row);
|
|
33
|
+
const key = String(category);
|
|
34
|
+
let entry = held.get(key);
|
|
35
|
+
if (!entry)
|
|
36
|
+
held.set(key, (entry = { category, series: String(row[SERIES_KEY]), values: [], own: [] }));
|
|
37
|
+
const raw = valueOf(row);
|
|
38
|
+
const value = Number(raw);
|
|
39
|
+
if (isGapValue(raw) || !Number.isFinite(value))
|
|
40
|
+
continue;
|
|
41
|
+
entry.values.push(...RowNumbers.interval(state, row, value));
|
|
42
|
+
if (sort.series === undefined || String(row[SERIES_KEY]) === sort.series) {
|
|
43
|
+
entry.own.push(value);
|
|
44
|
+
}
|
|
45
|
+
}
|
|
46
|
+
const keyOf = (entry) => {
|
|
47
|
+
if (sort.by === 'range') {
|
|
48
|
+
return entry.values.length === 0
|
|
49
|
+
? undefined
|
|
50
|
+
: Math.max(...entry.values) - Math.min(...entry.values);
|
|
51
|
+
}
|
|
52
|
+
return entry.own.length === 0 ? undefined : entry.own.reduce((sum, v) => sum + v, 0);
|
|
53
|
+
};
|
|
54
|
+
const sign = sort.order === 'descending' ? -1 : 1;
|
|
55
|
+
const sorted = (entries) => entries
|
|
56
|
+
.map((entry, index) => ({ entry, index, key: keyOf(entry) }))
|
|
57
|
+
.sort((a, b) => {
|
|
58
|
+
if (a.key === undefined || b.key === undefined) {
|
|
59
|
+
return ((a.key === undefined ? 1 : 0) - (b.key === undefined ? 1 : 0) || a.index - b.index);
|
|
60
|
+
}
|
|
61
|
+
return sign * (a.key - b.key) || a.index - b.index;
|
|
62
|
+
})
|
|
63
|
+
.map(({ entry }) => entry);
|
|
64
|
+
const entries = [...held.values()];
|
|
65
|
+
if (!sort.grouped)
|
|
66
|
+
return sorted(entries).map((entry) => entry.category);
|
|
67
|
+
const bySeries = new Map();
|
|
68
|
+
for (const entry of entries) {
|
|
69
|
+
bySeries.set(entry.series, [...(bySeries.get(entry.series) ?? []), entry]);
|
|
70
|
+
}
|
|
71
|
+
return [...bySeries.values()].flatMap((group) => sorted(group).map((entry) => entry.category));
|
|
72
|
+
}
|
|
73
|
+
}
|
|
@@ -2,6 +2,7 @@ import { ProcessedPositions } from '../transforms/ProcessedPositions';
|
|
|
2
2
|
import { isGapValue } from '../../plots/utils/gaps';
|
|
3
3
|
import { MarkerAxisValues } from './MarkerAxisValues';
|
|
4
4
|
import { PlotAxes } from '../data/PlotAxes';
|
|
5
|
+
import { CategoryOrder } from './CategoryOrder';
|
|
5
6
|
import { NiceTicks } from '../../layout/scales/NiceTicks';
|
|
6
7
|
import { DISCRETE_SCALE_TYPES } from '../../types/layout/scales';
|
|
7
8
|
const AXES = ['x', 'y'];
|
|
@@ -53,7 +54,7 @@ export class ScalesPhase {
|
|
|
53
54
|
for (const axis of AXES) {
|
|
54
55
|
const own = ScalesPhase.#defaultsOf(defaults, axis, axes);
|
|
55
56
|
if (axes?.bands.includes(axis)) {
|
|
56
|
-
scales[axis] = this.#band(scales[axis], own,
|
|
57
|
+
scales[axis] = this.#band(scales[axis], own, state, axis);
|
|
57
58
|
continue;
|
|
58
59
|
}
|
|
59
60
|
// The value axis of a plot with categories is never one itself, whatever it was marked as.
|
|
@@ -72,9 +73,14 @@ export class ScalesPhase {
|
|
|
72
73
|
}
|
|
73
74
|
}
|
|
74
75
|
const fitted = options.fit?.({ ...state, scales }, ctx) ?? {};
|
|
76
|
+
const fittedAxes = [];
|
|
75
77
|
for (const axis of AXES) {
|
|
76
|
-
if (fitted[axis])
|
|
77
|
-
|
|
78
|
+
if (!fitted[axis])
|
|
79
|
+
continue;
|
|
80
|
+
const { fitted: ownDomain, ...fit } = fitted[axis];
|
|
81
|
+
scales[axis] = { ...scales[axis], ...fit };
|
|
82
|
+
if (ownDomain)
|
|
83
|
+
fittedAxes.push(axis);
|
|
78
84
|
}
|
|
79
85
|
for (const axis of AXES) {
|
|
80
86
|
if (axes?.bands.includes(axis) || scales[axis]?.domain)
|
|
@@ -99,19 +105,20 @@ export class ScalesPhase {
|
|
|
99
105
|
scales[axis] = niced
|
|
100
106
|
? {
|
|
101
107
|
...author,
|
|
102
|
-
domain: NiceTicks.fit(state, axis, lo, hi, author?.
|
|
108
|
+
domain: NiceTicks.fit(state, axis, lo, hi, NiceTicks.toleranceOf(author?.nice)),
|
|
103
109
|
nice: false
|
|
104
110
|
}
|
|
105
111
|
: { ...author, domain: [lo, hi], nice: author?.nice ?? true };
|
|
106
112
|
}
|
|
107
|
-
const next = { ...state, scales };
|
|
113
|
+
const next = { ...state, scales, ...(fittedAxes.length ? { fittedAxes } : {}) };
|
|
108
114
|
return options.extend ? options.extend(next, ctx) : next;
|
|
109
115
|
};
|
|
110
116
|
/** A category axis as a band scale: the kind's options under the author's, in the order the kind asks for. */
|
|
111
|
-
#band(author, own,
|
|
117
|
+
#band(author, own, state, axis) {
|
|
118
|
+
const processed = state.processedData;
|
|
112
119
|
const given = author ?? {};
|
|
113
120
|
const type = given.type === undefined || given.type === 'auto' || given.type === 'categorical'
|
|
114
|
-
? 'band'
|
|
121
|
+
? (own.type ?? 'band')
|
|
115
122
|
: given.type;
|
|
116
123
|
const band = { ...own, ...given, type };
|
|
117
124
|
// A padding the author gives replaces the kind's own inner and outer ones.
|
|
@@ -123,6 +130,13 @@ export class ScalesPhase {
|
|
|
123
130
|
band.paddingOuter = given.padding;
|
|
124
131
|
}
|
|
125
132
|
}
|
|
133
|
+
// A sort by what the categories hold is read here, off the rows; the axis then draws from its domain.
|
|
134
|
+
if (CategoryOrder.isDeclarative(band.sort)) {
|
|
135
|
+
const order = band.domain ? undefined : CategoryOrder.of(band.sort, state, axis);
|
|
136
|
+
delete band.sort;
|
|
137
|
+
if (order)
|
|
138
|
+
band.domain = order;
|
|
139
|
+
}
|
|
126
140
|
if (this.keepsDataOrder && !band.domain) {
|
|
127
141
|
band.domain = [...new Set(ProcessedPositions.values(processed, axis))];
|
|
128
142
|
}
|
|
@@ -2,7 +2,7 @@ import { ScalesPhase } from '../scales/ScalesPhase';
|
|
|
2
2
|
import type { PlotAxes } from '../data/PlotAxes';
|
|
3
3
|
import type { AxisChannelName } from '../../types/layout/mapping';
|
|
4
4
|
import type { FacetStageState, PhaseStage, ProcessedData, SharedAxisValues, SharedScalesOptions } from '../../types/phases';
|
|
5
|
-
import type { AxisBasedScalesConfig } from '../../types/layout/scales';
|
|
5
|
+
import type { AxisBasedScalesConfig, NiceOption } from '../../types/layout/scales';
|
|
6
6
|
/** One channel's shared scale: its domain, and whether svelteplot may still round it. */
|
|
7
7
|
type SharedScale = {
|
|
8
8
|
domain: unknown[];
|
|
@@ -14,7 +14,8 @@ type SharedScalesState = FacetStageState & {
|
|
|
14
14
|
processedData?: ProcessedData;
|
|
15
15
|
markers?: object[];
|
|
16
16
|
scales?: Partial<Record<AxisChannelName, {
|
|
17
|
-
|
|
17
|
+
nice?: NiceOption;
|
|
18
|
+
sort?: unknown;
|
|
18
19
|
}>>;
|
|
19
20
|
sharedScales?: Record<string, AxisBasedScalesConfig<never>>;
|
|
20
21
|
};
|
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
import { ProcessedPositions } from '../transforms/ProcessedPositions';
|
|
2
2
|
import { NiceTicks } from '../../layout/scales/NiceTicks';
|
|
3
|
+
import { CategoryOrder } from '../scales/CategoryOrder';
|
|
3
4
|
import { ScalesPhase } from '../scales/ScalesPhase';
|
|
4
5
|
import { Pipeline } from '../Pipeline';
|
|
5
6
|
import { PANEL_KEY, FacetPanels } from '../facet/FacetPanels';
|
|
@@ -39,7 +40,9 @@ export class SharedScalesPhase {
|
|
|
39
40
|
// A symmetric axis has no domain but the one the kind's "scales" phase gives it.
|
|
40
41
|
const fromPhase = new Set([
|
|
41
42
|
...(this.#options?.fromScalesPhase ?? []),
|
|
42
|
-
...this.#scales.symmetricAxes(state)
|
|
43
|
+
...this.#scales.symmetricAxes(state),
|
|
44
|
+
// A category axis ordered by what its categories hold takes the order the "scales" phase reads off every row.
|
|
45
|
+
...(state.axes?.bands ?? []).filter((axis) => CategoryOrder.isDeclarative(state.scales?.[axis]?.sort))
|
|
43
46
|
]);
|
|
44
47
|
const layout = {
|
|
45
48
|
band: [...(state.axes?.bands ?? [])],
|
|
@@ -60,7 +63,7 @@ export class SharedScalesPhase {
|
|
|
60
63
|
const values = members
|
|
61
64
|
? members.map((panel) => SharedScalesPhase.buildPanelAxisValues(state, panel, layout))
|
|
62
65
|
: [SharedScalesPhase.buildPanelAxisValues(state, undefined, layout)];
|
|
63
|
-
return SharedScalesPhase.buildSharedAxisScale(values, channel, state.scales?.[channel]?.
|
|
66
|
+
return SharedScalesPhase.buildSharedAxisScale(values, channel, NiceTicks.toleranceOf(state.scales?.[channel]?.nice));
|
|
64
67
|
};
|
|
65
68
|
const cache = new Map();
|
|
66
69
|
const scalesOf = (place) => {
|
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import type { StatisticSource } from '../../types/phases/statistics/source';
|
|
2
|
+
import type { AxisChannelName } from '../../types/layout/mapping';
|
|
2
3
|
import type { Series } from '../../types/plots/data/common';
|
|
3
4
|
import type { StatisticConfig } from '../../types/layout/statistics';
|
|
4
5
|
import type { AxisBasedMarkersConfig } from '../../types/markers/common';
|
|
@@ -10,12 +11,13 @@ import type { AxisBasedMarkersConfig } from '../../types/markers/common';
|
|
|
10
11
|
export declare class Statistics {
|
|
11
12
|
#private;
|
|
12
13
|
/**
|
|
13
|
-
* Builds one {@link StatisticConfig} over a data source into the
|
|
14
|
-
* renders as
|
|
15
|
-
*
|
|
16
|
-
*
|
|
14
|
+
* Builds one {@link StatisticConfig} over a data source into the markers it
|
|
15
|
+
* renders as. Every statistic's own `build` returns a list, since one can
|
|
16
|
+
* draw several markers (`deviation`'s band and rule); `regression`/`bollinger`
|
|
17
|
+
* construct their marker directly (svelteplot resolves the curve/band
|
|
18
|
+
* itself, at render time), the others compute their rows first.
|
|
17
19
|
*/
|
|
18
|
-
static buildMarker<T extends Record<string, unknown>>(source: StatisticSource<T>, config: StatisticConfig): AxisBasedMarkersConfig;
|
|
20
|
+
static buildMarker<T extends Record<string, unknown>>(source: StatisticSource<T>, config: StatisticConfig): AxisBasedMarkersConfig[];
|
|
19
21
|
/**
|
|
20
22
|
* Resolves a plot's own top-level `statistics` prop against its already-built
|
|
21
23
|
* `Series<T>[]` (every kind has this before `mapping` runs - see
|
|
@@ -30,6 +32,8 @@ export declare class Statistics {
|
|
|
30
32
|
static buildForPlot<T extends Record<string, unknown>>(args: {
|
|
31
33
|
series: Series<T>[];
|
|
32
34
|
statistics: StatisticConfig[] | undefined;
|
|
35
|
+
/** The axis the plot measures along, from its `PlotAxes`. */
|
|
36
|
+
valueAxis?: AxisChannelName;
|
|
33
37
|
colorFor?: (seriesName: string) => string;
|
|
34
38
|
}): AxisBasedMarkersConfig[];
|
|
35
39
|
/**
|
|
@@ -49,5 +53,5 @@ export declare class Statistics {
|
|
|
49
53
|
*/
|
|
50
54
|
static expandMarkers<TMarker extends {
|
|
51
55
|
type: string;
|
|
52
|
-
}, T extends Record<string, unknown>>(markers: TMarker[], fallbackData: T[]): (TMarker | AxisBasedMarkersConfig)[];
|
|
56
|
+
}, T extends Record<string, unknown>>(markers: TMarker[], fallbackData: T[], valueAxis?: AxisChannelName): (TMarker | AxisBasedMarkersConfig)[];
|
|
53
57
|
}
|
|
@@ -6,6 +6,7 @@ import { Density2dStatistic } from './methods/Density2dStatistic';
|
|
|
6
6
|
import { BoxStatistic } from './methods/BoxStatistic';
|
|
7
7
|
import { RegressionStatistic } from './methods/RegressionStatistic';
|
|
8
8
|
import { BollingerStatistic } from './methods/BollingerStatistic';
|
|
9
|
+
import { DeviationStatistic } from './methods/DeviationStatistic';
|
|
9
10
|
/**
|
|
10
11
|
* The statistics a plot or a marker asks for, as the markers they draw as.
|
|
11
12
|
* Each statistic type is a class of its own under `methods/`; the same
|
|
@@ -13,10 +14,11 @@ import { BollingerStatistic } from './methods/BollingerStatistic';
|
|
|
13
14
|
*/
|
|
14
15
|
export class Statistics {
|
|
15
16
|
/**
|
|
16
|
-
* Builds one {@link StatisticConfig} over a data source into the
|
|
17
|
-
* renders as
|
|
18
|
-
*
|
|
19
|
-
*
|
|
17
|
+
* Builds one {@link StatisticConfig} over a data source into the markers it
|
|
18
|
+
* renders as. Every statistic's own `build` returns a list, since one can
|
|
19
|
+
* draw several markers (`deviation`'s band and rule); `regression`/`bollinger`
|
|
20
|
+
* construct their marker directly (svelteplot resolves the curve/band
|
|
21
|
+
* itself, at render time), the others compute their rows first.
|
|
20
22
|
*/
|
|
21
23
|
static buildMarker(source, config) {
|
|
22
24
|
switch (config.type) {
|
|
@@ -32,6 +34,8 @@ export class Statistics {
|
|
|
32
34
|
return RegressionStatistic.build(source, config);
|
|
33
35
|
case 'bollinger':
|
|
34
36
|
return BollingerStatistic.build(source, config);
|
|
37
|
+
case 'deviation':
|
|
38
|
+
return DeviationStatistic.build(source, config);
|
|
35
39
|
}
|
|
36
40
|
}
|
|
37
41
|
/** Narrows a `Series`'s own `Accessor<T,AxisValue>` to a source's field-key-or-function shape - safe in practice, since a real row's field key is always a string. */
|
|
@@ -52,7 +56,7 @@ export class Statistics {
|
|
|
52
56
|
* accessor). Named `series`: one statistic per listed series.
|
|
53
57
|
*/
|
|
54
58
|
static buildForPlot(args) {
|
|
55
|
-
const { series, statistics, colorFor } = args;
|
|
59
|
+
const { series, statistics, valueAxis, colorFor } = args;
|
|
56
60
|
if (!statistics?.length || !series.length)
|
|
57
61
|
return [];
|
|
58
62
|
return statistics.flatMap((stat) => {
|
|
@@ -62,9 +66,10 @@ export class Statistics {
|
|
|
62
66
|
data: pooled,
|
|
63
67
|
x: Statistics.#accessor(series[0].x),
|
|
64
68
|
y: Statistics.#accessor(series[0].y),
|
|
69
|
+
axis: valueAxis,
|
|
65
70
|
color: colorFor?.(series[0].name)
|
|
66
71
|
};
|
|
67
|
-
return
|
|
72
|
+
return Statistics.buildMarker(source, stat);
|
|
68
73
|
}
|
|
69
74
|
const names = stat.series ?? series.map((s) => s.name);
|
|
70
75
|
return names.flatMap((name) => {
|
|
@@ -75,9 +80,10 @@ export class Statistics {
|
|
|
75
80
|
data: match.data,
|
|
76
81
|
x: Statistics.#accessor(match.x),
|
|
77
82
|
y: Statistics.#accessor(match.y),
|
|
83
|
+
axis: valueAxis,
|
|
78
84
|
color: colorFor?.(name)
|
|
79
85
|
};
|
|
80
|
-
return
|
|
86
|
+
return Statistics.buildMarker(source, stat);
|
|
81
87
|
});
|
|
82
88
|
});
|
|
83
89
|
}
|
|
@@ -128,7 +134,7 @@ export class Statistics {
|
|
|
128
134
|
* (neither field) always falls through the guard below untouched, and a
|
|
129
135
|
* future "common" marker kind is eligible with no extra bookkeeping here.
|
|
130
136
|
*/
|
|
131
|
-
static expandMarkers(markers, fallbackData) {
|
|
137
|
+
static expandMarkers(markers, fallbackData, valueAxis) {
|
|
132
138
|
return markers.flatMap((marker) => {
|
|
133
139
|
const statable = marker;
|
|
134
140
|
const { x, y } = statable;
|
|
@@ -137,7 +143,11 @@ export class Statistics {
|
|
|
137
143
|
if (!statable.statistics?.length || !isAccessor(x) || !isAccessor(y))
|
|
138
144
|
return [marker];
|
|
139
145
|
const data = statable.data ?? fallbackData;
|
|
140
|
-
const accessors = {
|
|
146
|
+
const accessors = {
|
|
147
|
+
x: x,
|
|
148
|
+
y: y,
|
|
149
|
+
axis: valueAxis
|
|
150
|
+
};
|
|
141
151
|
// A marker's `color` channel groups it: each statistic is then derived per
|
|
142
152
|
// group, in that group's own color - same as a plot's statistics per series.
|
|
143
153
|
const colorFn = statable.color
|
|
@@ -146,7 +156,7 @@ export class Statistics {
|
|
|
146
156
|
const flatColor = Statistics.#markerBaseColor(statable);
|
|
147
157
|
const derived = statable.statistics.flatMap((stat) => {
|
|
148
158
|
if (!colorFn || !statable.color || stat.pooled) {
|
|
149
|
-
return
|
|
159
|
+
return Statistics.buildMarker({ data, ...accessors, color: flatColor }, stat);
|
|
150
160
|
}
|
|
151
161
|
return Statistics.#groupRowsByColor(data, statable.color).flatMap((rows) => Statistics.buildMarker({ data: rows, ...accessors, color: colorFn(rows[0]) }, stat));
|
|
152
162
|
});
|