@fundar/data-chart-telling 1.1.0 → 1.3.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 +45 -0
- package/README.md +8 -7
- package/dist/configuration/config.svelte.d.ts +1 -1
- package/dist/configuration/config.svelte.js +177 -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/facet/scope.d.ts +40 -0
- package/dist/layout/facet/scope.js +104 -0
- 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 +39 -15
- 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 +23 -8
- 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 +35 -8
- package/dist/layout/plot/Plot.svelte +22 -2
- 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 +93 -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.d.ts +6 -1
- package/dist/markers/delta/Delta.js +16 -1
- package/dist/markers/delta/DeltaMarker.svelte +9 -87
- package/dist/markers/delta/DeltaPoint.svelte +97 -0
- package/dist/markers/delta/DeltaPoint.svelte.d.ts +29 -0
- 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 +14 -5
- 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/facet/FacetPhase.d.ts +2 -1
- package/dist/phases/facet/FacetPhase.js +19 -4
- 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 +16 -3
- 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.d.ts +4 -1
- package/dist/plots/utils/segments.js +20 -7
- package/dist/types/configuration/styling.d.ts +284 -143
- package/dist/types/layout/coordinates.d.ts +5 -4
- package/dist/types/layout/facet.d.ts +18 -0
- package/dist/types/layout/legend.d.ts +23 -5
- package/dist/types/layout/plot.d.ts +46 -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/delta.d.ts +15 -2
- 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 +18 -2
- 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/facet/phase.d.ts +4 -0
- 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 +7 -4
- 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/types/plots/segments/config.d.ts +4 -2
- 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 +50 -3
- package/docs/getting-started.md +2 -2
- package/docs/legend.md +13 -11
- package/docs/markers.md +57 -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 +25 -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/FacetsScoped.svelte +26 -0
- 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 +27 -14
- package/llms.txt +33 -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]))
|
|
@@ -3,7 +3,8 @@ import type { FacetStageState, PhaseStage } from '../../types/phases';
|
|
|
3
3
|
* The "facet" phase: the panels the plot's `facet` lays its rows out in, and
|
|
4
4
|
* which panel each row belongs to. It runs first, so the "data" phase builds
|
|
5
5
|
* every series already split by panel. A plot drawn from pre-built `series`
|
|
6
|
-
* has no rows to split, so its facet is ignored.
|
|
6
|
+
* has no rows to split, so its facet is ignored. The plot's `segments` and markers that name a facet
|
|
7
|
+
* are handed to the panels they name here, once, for every later phase.
|
|
7
8
|
*/
|
|
8
9
|
export declare class FacetPhase<TState extends FacetStageState> implements PhaseStage<TState> {
|
|
9
10
|
readonly phase: "facet";
|
|
@@ -1,18 +1,26 @@
|
|
|
1
1
|
import { buildFacetKeyOf, buildFacetPanels } from '../../layout/facet/config';
|
|
2
2
|
import { PANEL_KEY } from './FacetPanels';
|
|
3
|
+
import { FacetScope } from '../../layout/facet/scope';
|
|
3
4
|
/**
|
|
4
5
|
* The "facet" phase: the panels the plot's `facet` lays its rows out in, and
|
|
5
6
|
* which panel each row belongs to. It runs first, so the "data" phase builds
|
|
6
7
|
* every series already split by panel. A plot drawn from pre-built `series`
|
|
7
|
-
* has no rows to split, so its facet is ignored.
|
|
8
|
+
* has no rows to split, so its facet is ignored. The plot's `segments` and markers that name a facet
|
|
9
|
+
* are handed to the panels they name here, once, for every later phase.
|
|
8
10
|
*/
|
|
9
11
|
export class FacetPhase {
|
|
10
12
|
phase = 'facet';
|
|
11
13
|
run = (state) => {
|
|
12
14
|
const { data, series } = state;
|
|
13
15
|
const facet = state.facet;
|
|
14
|
-
|
|
15
|
-
|
|
16
|
+
// Without panels, a segment or a marker that names a facet has none to be drawn in.
|
|
17
|
+
if (!facet || series || !data) {
|
|
18
|
+
return {
|
|
19
|
+
...state,
|
|
20
|
+
segments: FacetScope.scopeSegments(state.segments, undefined),
|
|
21
|
+
authorMarkers: FacetScope.scope(state.authorMarkers, undefined)
|
|
22
|
+
};
|
|
23
|
+
}
|
|
16
24
|
const panels = buildFacetPanels(facet, data).map(({ rows: _rows, ...panel }) => panel);
|
|
17
25
|
const keys = new Set(panels.map((p) => p.key));
|
|
18
26
|
const keyOf = buildFacetKeyOf(facet);
|
|
@@ -23,6 +31,13 @@ export class FacetPhase {
|
|
|
23
31
|
const key = keyOf(row);
|
|
24
32
|
return keys.has(key) ? key : undefined;
|
|
25
33
|
};
|
|
26
|
-
|
|
34
|
+
// Every later phase reads each panel's own segments and markers: nothing past here knows of `facet`.
|
|
35
|
+
return {
|
|
36
|
+
...state,
|
|
37
|
+
panels,
|
|
38
|
+
panelOf,
|
|
39
|
+
segments: FacetScope.distributeSegments(state.segments, panels),
|
|
40
|
+
authorMarkers: FacetScope.distributeMarkers(state.authorMarkers, panels)
|
|
41
|
+
};
|
|
27
42
|
};
|
|
28
43
|
}
|
|
@@ -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
|
}
|