@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.
Files changed (524) hide show
  1. package/CHANGELOG.md +32 -0
  2. package/README.md +6 -6
  3. package/dist/configuration/config.svelte.d.ts +1 -1
  4. package/dist/configuration/config.svelte.js +165 -100
  5. package/dist/configuration/themes/index.d.ts +5 -1428
  6. package/dist/index.d.ts +23 -14
  7. package/dist/index.js +20 -11
  8. package/dist/layout/base/BasePlotLayout.svelte +115 -50
  9. package/dist/layout/base/BasePlotLayout.svelte.d.ts +1 -38
  10. package/dist/layout/coordinates/CoordinatesLayout.svelte +42 -40
  11. package/dist/layout/coordinates/CoordinatesLayout.svelte.d.ts +0 -2
  12. package/dist/layout/coordinates/ProjectionZoom.svelte +48 -0
  13. package/dist/layout/coordinates/ProjectionZoom.svelte.d.ts +10 -0
  14. package/dist/layout/coordinates/ZoomedProjection.d.ts +11 -0
  15. package/dist/layout/coordinates/ZoomedProjection.js +24 -0
  16. package/dist/layout/coordinates/camera.svelte.js +11 -8
  17. package/dist/layout/coordinates/projections/argentina.js +1 -1
  18. package/dist/layout/coordinates/projections/fit.d.ts +1 -1
  19. package/dist/layout/coordinates/projections/fit.js +1 -1
  20. package/dist/layout/coordinates/zoom.svelte.d.ts +4 -5
  21. package/dist/layout/coordinates/zoom.svelte.js +4 -5
  22. package/dist/layout/facet/FacetLayout.svelte +1 -1
  23. package/dist/layout/facet/config.js +1 -1
  24. package/dist/layout/figure/Figure.svelte +2 -0
  25. package/dist/layout/geometry/GeometryLayout.svelte +14 -9
  26. package/dist/layout/geometry/GeometryLayout.svelte.d.ts +0 -3
  27. package/dist/layout/geometry/MarkerOffset.svelte +28 -0
  28. package/dist/layout/geometry/MarkerOffset.svelte.d.ts +13 -0
  29. package/dist/layout/grid/GridCell.svelte +6 -8
  30. package/dist/layout/legend/ContinuousSection.svelte +44 -9
  31. package/dist/layout/legend/DiscreteBadgeItem.svelte +2 -2
  32. package/dist/layout/legend/DiscreteSection.svelte +2 -2
  33. package/dist/layout/legend/DiscreteSymbolIcon.svelte +1 -1
  34. package/dist/layout/legend/LegendChannels.js +36 -12
  35. package/dist/layout/legend/LegendLayout.svelte +9 -1
  36. package/dist/layout/legend/LegendState.svelte.d.ts +4 -0
  37. package/dist/layout/legend/LegendState.svelte.js +20 -3
  38. package/dist/layout/legend/SizeSection.svelte +1 -1
  39. package/dist/layout/margins/PlotMargins.svelte.d.ts +2 -5
  40. package/dist/layout/margins/PlotMargins.svelte.js +4 -8
  41. package/dist/layout/plot/Slice.d.ts +5 -1
  42. package/dist/layout/plot/Slice.js +14 -4
  43. package/dist/layout/scales/NiceTicks.d.ts +3 -0
  44. package/dist/layout/scales/NiceTicks.js +4 -0
  45. package/dist/layout/scales/ScalesLayout.svelte +72 -7
  46. package/dist/layout/scales/ScalesLayout.svelte.d.ts +5 -0
  47. package/dist/layout/scales/SveltePlotScale.d.ts +2 -2
  48. package/dist/layout/scales/SveltePlotScale.js +13 -6
  49. package/dist/layout/scales/TickLabels.d.ts +32 -0
  50. package/dist/layout/scales/TickLabels.js +55 -0
  51. package/dist/layout/styles/StylesLayout.svelte +2 -2
  52. package/dist/layout/styles/ValueLabels.d.ts +33 -5
  53. package/dist/layout/styles/ValueLabels.js +80 -21
  54. package/dist/layout/timeline/TimelineLayout.svelte +1 -1
  55. package/dist/layout/tooltip/Tooltip.svelte +4 -4
  56. package/dist/layout/tooltip/Tooltip.svelte.d.ts +4 -4
  57. package/dist/layout/tooltip/TooltipState.svelte.js +1 -1
  58. package/dist/markers/MarkerKinds.d.ts +5 -0
  59. package/dist/markers/MarkerKinds.js +1 -0
  60. package/dist/markers/area/AreaMarker.svelte +15 -63
  61. package/dist/markers/arrow/ArrowMarker.svelte +51 -9
  62. package/dist/markers/bar/BarMarker.svelte +8 -4
  63. package/dist/markers/bollinger/BollingerMarker.svelte +33 -18
  64. package/dist/markers/box/BoxMarker.svelte +40 -9
  65. package/dist/markers/delta/Delta.js +1 -1
  66. package/dist/markers/dot/DotMarker.svelte +24 -27
  67. package/dist/markers/image/ImageMarker.svelte +17 -12
  68. package/dist/markers/inset/InsetMarker.svelte +2 -2
  69. package/dist/markers/line/LineMarker.svelte +1 -0
  70. package/dist/markers/link/LinkMarker.svelte +174 -29
  71. package/dist/markers/regression/RegressionMarker.svelte +16 -33
  72. package/dist/markers/rule/RuleMarker.svelte +9 -3
  73. package/dist/markers/text/Declutter.d.ts +4 -0
  74. package/dist/markers/text/Declutter.js +26 -11
  75. package/dist/markers/text/TextMarker.svelte +91 -48
  76. package/dist/markers/tick/TickMarker.svelte +27 -25
  77. package/dist/markers/utils/MarkerChannels.d.ts +24 -0
  78. package/dist/markers/utils/MarkerChannels.js +42 -7
  79. package/dist/markers/utils/RowOffset.d.ts +23 -0
  80. package/dist/markers/utils/RowOffset.js +23 -0
  81. package/dist/markers/utils/RowOffsetMarks.svelte +30 -0
  82. package/dist/markers/utils/RowOffsetMarks.svelte.d.ts +33 -0
  83. package/dist/markers/utils/RowStroke.d.ts +31 -0
  84. package/dist/markers/utils/RowStroke.js +28 -0
  85. package/dist/markers/violin/ViolinMarker.svelte +75 -0
  86. package/dist/markers/violin/ViolinMarker.svelte.d.ts +7 -0
  87. package/dist/markers/violin/ViolinProfiles.d.ts +29 -0
  88. package/dist/markers/violin/ViolinProfiles.js +55 -0
  89. package/dist/markers/waffle/WaffleMarker.svelte +17 -37
  90. package/dist/phases/Pipeline.d.ts +5 -0
  91. package/dist/phases/Pipeline.js +5 -0
  92. package/dist/phases/data/DataPhase.js +3 -3
  93. package/dist/phases/data/PlotAxes.d.ts +10 -0
  94. package/dist/phases/data/PlotAxes.js +14 -1
  95. package/dist/phases/facet/FacetPanels.d.ts +1 -0
  96. package/dist/phases/facet/FacetPanels.js +1 -0
  97. package/dist/phases/mapping/MappingPhase.js +1 -1
  98. package/dist/phases/markers/MarkersPhase.js +2 -1
  99. package/dist/phases/scales/CategoryOrder.d.ts +23 -0
  100. package/dist/phases/scales/CategoryOrder.js +73 -0
  101. package/dist/phases/scales/ScalesPhase.js +21 -7
  102. package/dist/phases/sharedScales/SharedScalesPhase.d.ts +3 -2
  103. package/dist/phases/sharedScales/SharedScalesPhase.js +5 -2
  104. package/dist/phases/statistics/Statistics.d.ts +10 -6
  105. package/dist/phases/statistics/Statistics.js +20 -10
  106. package/dist/phases/statistics/StatisticsPhase.js +7 -2
  107. package/dist/phases/statistics/methods/BollingerStatistic.d.ts +1 -1
  108. package/dist/phases/statistics/methods/BollingerStatistic.js +13 -11
  109. package/dist/phases/statistics/methods/BoxStatistic.d.ts +1 -1
  110. package/dist/phases/statistics/methods/BoxStatistic.js +14 -12
  111. package/dist/phases/statistics/methods/Density2dStatistic.d.ts +1 -1
  112. package/dist/phases/statistics/methods/Density2dStatistic.js +13 -11
  113. package/dist/phases/statistics/methods/DensityStatistic.d.ts +1 -1
  114. package/dist/phases/statistics/methods/DensityStatistic.js +11 -9
  115. package/dist/phases/statistics/methods/DeviationStatistic.d.ts +8 -0
  116. package/dist/phases/statistics/methods/DeviationStatistic.js +111 -0
  117. package/dist/phases/statistics/methods/MovingAverageStatistic.d.ts +1 -1
  118. package/dist/phases/statistics/methods/MovingAverageStatistic.js +11 -9
  119. package/dist/phases/statistics/methods/RegressionStatistic.d.ts +1 -1
  120. package/dist/phases/statistics/methods/RegressionStatistic.js +16 -14
  121. package/dist/phases/transforms/ProcessedPositions.js +1 -1
  122. package/dist/phases/transforms/TransformsPhase.js +49 -3
  123. package/dist/phases/transforms/ValueSelection.d.ts +30 -0
  124. package/dist/phases/transforms/ValueSelection.js +53 -0
  125. package/dist/plots/{heatmap → correlation/heatmap}/Plot.svelte +5 -2
  126. package/dist/plots/{heatmap → correlation/heatmap}/Plot.svelte.d.ts +2 -2
  127. package/dist/plots/{heatmap → correlation/heatmap}/defaults.d.ts +2 -2
  128. package/dist/plots/{heatmap → correlation/heatmap}/defaults.js +5 -5
  129. package/dist/plots/{heatmap → correlation/heatmap}/markers.d.ts +4 -4
  130. package/dist/plots/{heatmap → correlation/heatmap}/markers.js +3 -3
  131. package/dist/plots/{scatter → correlation/scatter}/Plot.svelte +5 -2
  132. package/dist/plots/{scatter → correlation/scatter}/Plot.svelte.d.ts +2 -2
  133. package/dist/plots/{scatter → correlation/scatter}/defaults.d.ts +2 -2
  134. package/dist/plots/{scatter → correlation/scatter}/defaults.js +4 -4
  135. package/dist/plots/{scatter → correlation/scatter}/markers.d.ts +4 -4
  136. package/dist/plots/{scatter → correlation/scatter}/markers.js +3 -3
  137. package/dist/plots/{box → distribution/box}/BoxSummaries.d.ts +2 -2
  138. package/dist/plots/{box → distribution/box}/BoxSummaries.js +6 -6
  139. package/dist/plots/{box → distribution/box}/Plot.svelte +2 -2
  140. package/dist/plots/{box → distribution/box}/Plot.svelte.d.ts +2 -2
  141. package/dist/plots/{box → distribution/box}/defaults.d.ts +2 -2
  142. package/dist/plots/{box → distribution/box}/defaults.js +1 -1
  143. package/dist/plots/{box → distribution/box}/markers.d.ts +2 -2
  144. package/dist/plots/distribution/density/Plot.svelte +45 -0
  145. package/dist/plots/distribution/density/Plot.svelte.d.ts +26 -0
  146. package/dist/plots/distribution/density/defaults.d.ts +9 -0
  147. package/dist/plots/distribution/density/defaults.js +29 -0
  148. package/dist/plots/distribution/density/markers.d.ts +9 -0
  149. package/dist/plots/distribution/density/markers.js +42 -0
  150. package/dist/plots/{histogram → distribution/histogram}/Plot.svelte +2 -2
  151. package/dist/plots/{histogram → distribution/histogram}/Plot.svelte.d.ts +2 -2
  152. package/dist/plots/{histogram → distribution/histogram}/defaults.d.ts +2 -2
  153. package/dist/plots/{histogram → distribution/histogram}/defaults.js +3 -3
  154. package/dist/plots/{histogram → distribution/histogram}/markers.d.ts +3 -3
  155. package/dist/plots/{histogram → distribution/histogram}/markers.js +5 -5
  156. package/dist/plots/{pyramid → distribution/pyramid}/Plot.svelte +5 -2
  157. package/dist/plots/{pyramid → distribution/pyramid}/Plot.svelte.d.ts +2 -2
  158. package/dist/plots/{pyramid → distribution/pyramid}/defaults.d.ts +2 -2
  159. package/dist/plots/{pyramid → distribution/pyramid}/defaults.js +6 -6
  160. package/dist/plots/{pyramid → distribution/pyramid}/markers.d.ts +4 -4
  161. package/dist/plots/{pyramid → distribution/pyramid}/markers.js +6 -6
  162. package/dist/plots/distribution/violin/Plot.svelte +45 -0
  163. package/dist/plots/distribution/violin/Plot.svelte.d.ts +26 -0
  164. package/dist/plots/distribution/violin/defaults.d.ts +10 -0
  165. package/dist/plots/distribution/violin/defaults.js +58 -0
  166. package/dist/plots/distribution/violin/markers.d.ts +10 -0
  167. package/dist/plots/distribution/violin/markers.js +71 -0
  168. package/dist/plots/{area → evolution/area}/Plot.svelte +2 -2
  169. package/dist/plots/{area → evolution/area}/Plot.svelte.d.ts +2 -2
  170. package/dist/plots/{area → evolution/area}/defaults.d.ts +2 -2
  171. package/dist/plots/{area → evolution/area}/defaults.js +2 -0
  172. package/dist/plots/{area → evolution/area}/markers.d.ts +2 -2
  173. package/dist/plots/{area → evolution/area}/markers.js +1 -1
  174. package/dist/plots/{line → evolution/line}/Plot.svelte +2 -2
  175. package/dist/plots/{line → evolution/line}/Plot.svelte.d.ts +2 -2
  176. package/dist/plots/{line → evolution/line}/defaults.d.ts +2 -2
  177. package/dist/plots/{line → evolution/line}/defaults.js +2 -0
  178. package/dist/plots/{line → evolution/line}/markers.d.ts +11 -8
  179. package/dist/plots/{line → evolution/line}/markers.js +6 -4
  180. package/dist/plots/evolution/slope/Plot.svelte +42 -0
  181. package/dist/plots/evolution/slope/Plot.svelte.d.ts +26 -0
  182. package/dist/plots/evolution/slope/defaults.d.ts +8 -0
  183. package/dist/plots/evolution/slope/defaults.js +31 -0
  184. package/dist/plots/evolution/slope/markers.d.ts +16 -0
  185. package/dist/plots/evolution/slope/markers.js +79 -0
  186. package/dist/plots/evolution/sparkline/Plot.svelte +45 -0
  187. package/dist/plots/evolution/sparkline/Plot.svelte.d.ts +26 -0
  188. package/dist/plots/evolution/sparkline/defaults.d.ts +7 -0
  189. package/dist/plots/evolution/sparkline/defaults.js +23 -0
  190. package/dist/plots/evolution/sparkline/markers.d.ts +7 -0
  191. package/dist/plots/evolution/sparkline/markers.js +56 -0
  192. package/dist/plots/{geo → map/geo}/Core.svelte +11 -10
  193. package/dist/plots/{geo → map/geo}/Core.svelte.d.ts +1 -1
  194. package/dist/plots/map/geo/GeoFeatures.svelte.d.ts +9 -0
  195. package/dist/plots/map/geo/GeoFeatures.svelte.js +55 -0
  196. package/dist/plots/map/geo/GeoGeometry.d.ts +27 -0
  197. package/dist/plots/map/geo/GeoGeometry.js +142 -0
  198. package/dist/plots/map/geo/GeoSegments.d.ts +16 -0
  199. package/dist/plots/map/geo/GeoSegments.js +23 -0
  200. package/dist/plots/{geo → map/geo}/Plot.svelte +10 -10
  201. package/dist/plots/{geo → map/geo}/Plot.svelte.d.ts +2 -2
  202. package/dist/plots/{geo → map/geo}/defaults.d.ts +2 -2
  203. package/dist/plots/{geo → map/geo}/defaults.js +1 -1
  204. package/dist/plots/{geo → map/geo}/phases/data.d.ts +1 -1
  205. package/dist/plots/{geo → map/geo}/phases/data.js +7 -6
  206. package/dist/plots/{geo → map/geo}/phases/hover.d.ts +1 -1
  207. package/dist/plots/{geo → map/geo}/phases/hover.js +2 -2
  208. package/dist/plots/{geo → map/geo}/phases/markers.d.ts +1 -1
  209. package/dist/plots/{geo → map/geo}/phases/markers.js +6 -10
  210. package/dist/plots/{geo → map/geo}/phases/scales.d.ts +2 -2
  211. package/dist/plots/{geo → map/geo}/phases/scales.js +28 -12
  212. package/dist/plots/{geo → map/geo}/phases/tooltip.d.ts +1 -1
  213. package/dist/plots/map/geo/phases/tooltip.js +5 -0
  214. package/dist/plots/{geo → map/geo}/slices.d.ts +2 -2
  215. package/dist/plots/{geo → map/geo}/slices.js +2 -2
  216. package/dist/plots/{bar → ranking/bar}/Plot.svelte +2 -2
  217. package/dist/plots/{bar → ranking/bar}/Plot.svelte.d.ts +2 -2
  218. package/dist/plots/ranking/bar/defaults.d.ts +16 -0
  219. package/dist/plots/{bar → ranking/bar}/defaults.js +15 -9
  220. package/dist/plots/{bar → ranking/bar}/markers.d.ts +8 -8
  221. package/dist/plots/{bar → ranking/bar}/markers.js +8 -17
  222. package/dist/plots/ranking/bullet/Plot.svelte +42 -0
  223. package/dist/plots/ranking/bullet/Plot.svelte.d.ts +26 -0
  224. package/dist/plots/ranking/bullet/defaults.d.ts +8 -0
  225. package/dist/plots/ranking/bullet/defaults.js +24 -0
  226. package/dist/plots/ranking/bullet/markers.d.ts +10 -0
  227. package/dist/plots/ranking/bullet/markers.js +90 -0
  228. package/dist/plots/ranking/cleveland/ClevelandConnector.d.ts +48 -0
  229. package/dist/plots/ranking/cleveland/ClevelandConnector.js +140 -0
  230. package/dist/plots/ranking/cleveland/ClevelandMarkers.d.ts +33 -0
  231. package/dist/plots/ranking/cleveland/ClevelandMarkers.js +375 -0
  232. package/dist/plots/ranking/cleveland/ClevelandRanges.d.ts +31 -0
  233. package/dist/plots/ranking/cleveland/ClevelandRanges.js +116 -0
  234. package/dist/plots/ranking/cleveland/Plot.svelte +45 -0
  235. package/dist/plots/ranking/cleveland/Plot.svelte.d.ts +26 -0
  236. package/dist/plots/ranking/cleveland/defaults.d.ts +13 -0
  237. package/dist/plots/ranking/cleveland/defaults.js +66 -0
  238. package/dist/plots/ranking/dumbbell/Plot.svelte +45 -0
  239. package/dist/plots/ranking/dumbbell/Plot.svelte.d.ts +26 -0
  240. package/dist/plots/ranking/dumbbell/defaults.d.ts +9 -0
  241. package/dist/plots/ranking/dumbbell/defaults.js +19 -0
  242. package/dist/plots/ranking/forest/Plot.svelte +42 -0
  243. package/dist/plots/ranking/forest/Plot.svelte.d.ts +26 -0
  244. package/dist/plots/ranking/forest/defaults.d.ts +11 -0
  245. package/dist/plots/ranking/forest/defaults.js +20 -0
  246. package/dist/plots/ranking/lollipop/Plot.svelte +45 -0
  247. package/dist/plots/ranking/lollipop/Plot.svelte.d.ts +26 -0
  248. package/dist/plots/ranking/lollipop/defaults.d.ts +9 -0
  249. package/dist/plots/ranking/lollipop/defaults.js +18 -0
  250. package/dist/plots/utils/RowNumbers.d.ts +16 -0
  251. package/dist/plots/utils/RowNumbers.js +24 -0
  252. package/dist/plots/utils/gaps.js +1 -1
  253. package/dist/plots/utils/segments.js +1 -1
  254. package/dist/types/configuration/styling.d.ts +276 -143
  255. package/dist/types/layout/coordinates.d.ts +5 -4
  256. package/dist/types/layout/legend.d.ts +21 -5
  257. package/dist/types/layout/plot.d.ts +44 -1
  258. package/dist/types/layout/scales.d.ts +39 -7
  259. package/dist/types/layout/statistics/deviation.d.ts +40 -0
  260. package/dist/types/layout/statistics/index.d.ts +7 -2
  261. package/dist/types/layout/styles/base.d.ts +18 -0
  262. package/dist/types/layout/styles/bullet.d.ts +25 -0
  263. package/dist/types/layout/styles/connector.d.ts +98 -0
  264. package/dist/types/layout/styles/curve.d.ts +11 -0
  265. package/dist/types/layout/styles/frame.d.ts +17 -0
  266. package/dist/types/layout/styles/gaps.d.ts +12 -0
  267. package/dist/types/layout/styles/geo.d.ts +55 -0
  268. package/dist/types/layout/styles/index.d.ts +8 -0
  269. package/dist/types/layout/styles/index.js +8 -0
  270. package/dist/types/layout/styles/values.d.ts +47 -0
  271. package/dist/types/layout/timeline.d.ts +5 -2
  272. package/dist/types/layout/tooltip.d.ts +6 -2
  273. package/dist/types/markers/axis/area.d.ts +2 -2
  274. package/dist/types/markers/axis/arrow.d.ts +3 -0
  275. package/dist/types/markers/axis/axisBasedMarkersConfig.d.ts +2 -1
  276. package/dist/types/markers/axis/bar.d.ts +1 -1
  277. package/dist/types/markers/axis/box.d.ts +5 -0
  278. package/dist/types/markers/axis/difference.d.ts +2 -2
  279. package/dist/types/markers/axis/image.d.ts +3 -2
  280. package/dist/types/markers/axis/line.d.ts +2 -0
  281. package/dist/types/markers/axis/rule.d.ts +9 -0
  282. package/dist/types/markers/axis/trail.d.ts +2 -3
  283. package/dist/types/markers/axis/violin.d.ts +25 -0
  284. package/dist/types/markers/basic/dot.d.ts +3 -2
  285. package/dist/types/markers/basic/text.d.ts +13 -3
  286. package/dist/types/markers/channels/commonMarkerConfig.d.ts +7 -3
  287. package/dist/types/markers/channels/commonMarkerConfigWithRowOffset.d.ts +13 -0
  288. package/dist/types/markers/common.d.ts +1 -1
  289. package/dist/types/markers/common.js +1 -0
  290. package/dist/types/markers/geo/link.d.ts +5 -1
  291. package/dist/types/phases/index.d.ts +1 -1
  292. package/dist/types/phases/scales/phase.d.ts +5 -1
  293. package/dist/types/phases/state.d.ts +15 -2
  294. package/dist/types/phases/statistics/source.d.ts +3 -1
  295. package/dist/types/phases/transforms/phase.d.ts +22 -0
  296. package/dist/types/plots/{heatmap → correlation/heatmap}/props.d.ts +6 -6
  297. package/dist/types/plots/{heatmap → correlation/heatmap}/state.d.ts +4 -4
  298. package/dist/types/plots/{scatter → correlation/scatter}/props.d.ts +6 -6
  299. package/dist/types/plots/{scatter → correlation/scatter}/state.d.ts +2 -2
  300. package/dist/types/plots/{box → distribution/box}/props.d.ts +6 -6
  301. package/dist/types/plots/{box → distribution/box}/state.d.ts +3 -3
  302. package/dist/types/plots/distribution/density/props.d.ts +23 -0
  303. package/dist/types/plots/distribution/density/state.d.ts +6 -0
  304. package/dist/types/plots/{histogram → distribution/histogram}/props.d.ts +7 -7
  305. package/dist/types/plots/{histogram → distribution/histogram}/state.d.ts +2 -2
  306. package/dist/types/plots/distribution/histogram/state.js +1 -0
  307. package/dist/types/plots/{pyramid → distribution/pyramid}/props.d.ts +6 -6
  308. package/dist/types/plots/distribution/pyramid/props.js +1 -0
  309. package/dist/types/plots/{pyramid → distribution/pyramid}/state.d.ts +3 -3
  310. package/dist/types/plots/distribution/pyramid/state.js +1 -0
  311. package/dist/types/plots/distribution/violin/props.d.ts +23 -0
  312. package/dist/types/plots/distribution/violin/props.js +1 -0
  313. package/dist/types/plots/distribution/violin/state.d.ts +6 -0
  314. package/dist/types/plots/distribution/violin/state.js +1 -0
  315. package/dist/types/plots/{area → evolution/area}/props.d.ts +6 -6
  316. package/dist/types/plots/evolution/area/props.js +1 -0
  317. package/dist/types/plots/{area → evolution/area}/state.d.ts +2 -2
  318. package/dist/types/plots/evolution/area/state.js +1 -0
  319. package/dist/types/plots/evolution/line/props.d.ts +10 -0
  320. package/dist/types/plots/evolution/line/props.js +1 -0
  321. package/dist/types/plots/{line → evolution/line}/state.d.ts +3 -3
  322. package/dist/types/plots/evolution/line/state.js +1 -0
  323. package/dist/types/plots/evolution/slope/props.d.ts +5 -0
  324. package/dist/types/plots/evolution/slope/props.js +1 -0
  325. package/dist/types/plots/evolution/slope/state.d.ts +5 -0
  326. package/dist/types/plots/evolution/slope/state.js +1 -0
  327. package/dist/types/plots/evolution/sparkline/props.d.ts +5 -0
  328. package/dist/types/plots/evolution/sparkline/props.js +1 -0
  329. package/dist/types/plots/evolution/sparkline/state.d.ts +5 -0
  330. package/dist/types/plots/evolution/sparkline/state.js +1 -0
  331. package/dist/types/plots/{geo → map/geo}/props.d.ts +8 -8
  332. package/dist/types/plots/map/geo/props.js +1 -0
  333. package/dist/types/plots/{geo → map/geo}/state.d.ts +18 -11
  334. package/dist/types/plots/map/geo/state.js +1 -0
  335. package/dist/types/plots/props.d.ts +1 -1
  336. package/dist/types/plots/{bar → ranking/bar}/props.d.ts +6 -6
  337. package/dist/types/plots/ranking/bar/props.js +1 -0
  338. package/dist/types/plots/{bar → ranking/bar}/state.d.ts +2 -2
  339. package/dist/types/plots/ranking/bar/state.js +1 -0
  340. package/dist/types/plots/ranking/bullet/props.d.ts +22 -0
  341. package/dist/types/plots/ranking/bullet/props.js +1 -0
  342. package/dist/types/plots/ranking/bullet/state.d.ts +5 -0
  343. package/dist/types/plots/ranking/bullet/state.js +1 -0
  344. package/dist/types/plots/ranking/cleveland/props.d.ts +10 -0
  345. package/dist/types/plots/ranking/cleveland/props.js +1 -0
  346. package/dist/types/plots/ranking/cleveland/state.d.ts +49 -0
  347. package/dist/types/plots/ranking/cleveland/state.js +1 -0
  348. package/dist/types/plots/ranking/dumbbell/props.d.ts +10 -0
  349. package/dist/types/plots/ranking/dumbbell/props.js +1 -0
  350. package/dist/types/plots/ranking/dumbbell/state.d.ts +5 -0
  351. package/dist/types/plots/ranking/dumbbell/state.js +1 -0
  352. package/dist/types/plots/ranking/forest/props.d.ts +23 -0
  353. package/dist/types/plots/ranking/forest/props.js +1 -0
  354. package/dist/types/plots/ranking/forest/state.d.ts +5 -0
  355. package/dist/types/plots/ranking/forest/state.js +1 -0
  356. package/dist/types/plots/ranking/lollipop/props.d.ts +10 -0
  357. package/dist/types/plots/ranking/lollipop/props.js +1 -0
  358. package/dist/types/plots/ranking/lollipop/state.d.ts +5 -0
  359. package/dist/types/plots/ranking/lollipop/state.js +1 -0
  360. package/dist/types/plots/segments/common.d.ts +4 -1
  361. package/dist/utils/OpacityScale.d.ts +14 -0
  362. package/dist/utils/OpacityScale.js +43 -0
  363. package/dist/utils/{symbol.d.ts → SymbolPath.d.ts} +0 -12
  364. package/dist/utils/{symbol.js → SymbolPath.js} +0 -24
  365. package/dist/utils/SymbolScale.d.ts +18 -0
  366. package/dist/utils/SymbolScale.js +29 -0
  367. package/dist/utils/color/ColorRamp.d.ts +27 -0
  368. package/dist/utils/color/ColorRamp.js +120 -0
  369. package/dist/utils/color/CssColor.d.ts +19 -0
  370. package/dist/utils/color/CssColor.js +114 -0
  371. package/dist/utils/color/Palette.d.ts +21 -0
  372. package/dist/utils/color/Palette.js +52 -0
  373. package/dist/utils/color/index.d.ts +11 -3
  374. package/dist/utils/color/index.js +14 -3
  375. package/dist/utils/grouping.js +1 -1
  376. package/docs/architecture.md +1 -1
  377. package/docs/chrome.md +2 -2
  378. package/docs/composer.md +2 -2
  379. package/docs/concepts.md +1 -1
  380. package/docs/development.md +1 -1
  381. package/docs/facets.md +3 -3
  382. package/docs/getting-started.md +2 -2
  383. package/docs/legend.md +13 -11
  384. package/docs/markers.md +29 -27
  385. package/docs/plots/correlation/heatmap.md +26 -0
  386. package/docs/plots/correlation/scatter.md +35 -0
  387. package/docs/plots/distribution/box.md +28 -0
  388. package/docs/plots/distribution/density.md +26 -0
  389. package/docs/plots/distribution/histogram.md +33 -0
  390. package/docs/plots/distribution/pyramid.md +31 -0
  391. package/docs/plots/distribution/violin.md +35 -0
  392. package/docs/plots/evolution/area.md +32 -0
  393. package/docs/plots/evolution/line.md +93 -0
  394. package/docs/plots/evolution/slope.md +39 -0
  395. package/docs/plots/evolution/sparkline.md +34 -0
  396. package/docs/plots/ranking/bar.md +59 -0
  397. package/docs/plots/ranking/bullet.md +37 -0
  398. package/docs/plots/ranking/cleveland.md +54 -0
  399. package/docs/plots/ranking/dumbbell.md +39 -0
  400. package/docs/plots/ranking/forest.md +40 -0
  401. package/docs/plots/ranking/lollipop.md +39 -0
  402. package/docs/plots.md +22 -280
  403. package/docs/scales.md +30 -24
  404. package/docs/styles-and-segments.md +24 -21
  405. package/docs/theming.md +23 -20
  406. package/docs/timeline.md +3 -3
  407. package/docs/tooltip-and-hover.md +10 -10
  408. package/docs/transforms-and-statistics.md +13 -12
  409. package/examples/BarValues.svelte +1 -1
  410. package/examples/Box.svelte +1 -1
  411. package/examples/Bullet.svelte +17 -0
  412. package/examples/Chrome.svelte +1 -1
  413. package/examples/ChromeOrder.svelte +1 -1
  414. package/examples/Cleveland.svelte +15 -0
  415. package/examples/Composer.svelte +2 -2
  416. package/examples/CustomTooltip.svelte +1 -1
  417. package/examples/Density.svelte +7 -0
  418. package/examples/Dumbbell.svelte +16 -0
  419. package/examples/Facets.svelte +1 -1
  420. package/examples/FacetsCarousel.svelte +1 -1
  421. package/examples/FacetsRowsCols.svelte +1 -1
  422. package/examples/FirstPlot.svelte +1 -1
  423. package/examples/Forest.svelte +17 -0
  424. package/examples/Gaps.svelte +2 -2
  425. package/examples/GroupedBars.svelte +1 -1
  426. package/examples/Heatmap.svelte +3 -3
  427. package/examples/HeatmapSegments.svelte +8 -8
  428. package/examples/Histogram.svelte +1 -1
  429. package/examples/HorizontalBars.svelte +1 -1
  430. package/examples/LegendSections.svelte +1 -1
  431. package/examples/LegendToggle.svelte +1 -1
  432. package/examples/LineByRegion.svelte +1 -1
  433. package/examples/LineDates.svelte +1 -1
  434. package/examples/LineStep.svelte +16 -0
  435. package/examples/LineStepSegment.svelte +18 -0
  436. package/examples/Lollipop.svelte +17 -0
  437. package/examples/Markers.svelte +1 -1
  438. package/examples/MovingAverage.svelte +1 -1
  439. package/examples/Pyramid.svelte +9 -2
  440. package/examples/Regression.svelte +2 -2
  441. package/examples/ResponsiveLine.svelte +1 -1
  442. package/examples/Scales.svelte +1 -1
  443. package/examples/Scatter.svelte +2 -2
  444. package/examples/SegmentHighlight.svelte +1 -1
  445. package/examples/Segments.svelte +1 -1
  446. package/examples/SegmentsBySeries.svelte +1 -1
  447. package/examples/Slope.svelte +17 -0
  448. package/examples/Sparkline.svelte +14 -0
  449. package/examples/StackedArea.svelte +1 -1
  450. package/examples/StackedBars.svelte +1 -1
  451. package/examples/TimelinePlayer.svelte +1 -1
  452. package/examples/TimelineRule.svelte +1 -1
  453. package/examples/Tooltip.svelte +1 -1
  454. package/examples/ValueLabels.svelte +1 -1
  455. package/examples/Violin.svelte +14 -0
  456. package/examples/datasets/argentina-chile-trends.ts +34 -0
  457. package/examples/datasets/commodity-prices.ts +48 -0
  458. package/examples/datasets/countries-over-time.ts +368 -0
  459. package/examples/datasets/daily-temperature.ts +121 -0
  460. package/examples/datasets/earthquakes.ts +977 -0
  461. package/examples/datasets/flight-routes.ts +29 -0
  462. package/examples/datasets/height-density.ts +37 -0
  463. package/examples/datasets/heights.ts +370 -0
  464. package/examples/datasets/index.ts +24 -0
  465. package/examples/datasets/inflation-by-region.ts +44 -0
  466. package/examples/datasets/inflation-ranges.ts +34 -0
  467. package/examples/datasets/iris-flower.ts +207 -0
  468. package/examples/datasets/life-expectancy.ts +95 -0
  469. package/examples/datasets/napoleons-march.ts +182 -0
  470. package/examples/datasets/penguins.ts +54 -0
  471. package/examples/datasets/population-by-age-with-gaps.ts +23 -0
  472. package/examples/datasets/population-by-age.ts +890 -0
  473. package/examples/datasets/province-population.ts +521 -0
  474. package/examples/datasets/stock-prices.ts +63 -0
  475. package/examples/datasets/weather-stations-over-time.ts +31 -0
  476. package/examples/datasets/weather-stations.ts +22 -0
  477. package/examples/datasets/wind-vectors.ts +30 -0
  478. package/examples/datasets/world-temperature.ts +400 -0
  479. package/llms-full.txt +22 -11
  480. package/llms.txt +32 -4
  481. package/package.json +10 -1
  482. package/dist/plots/bar/defaults.d.ts +0 -9
  483. package/dist/plots/geo/features.svelte.d.ts +0 -5
  484. package/dist/plots/geo/features.svelte.js +0 -44
  485. package/dist/plots/geo/phases/tooltip.js +0 -5
  486. package/dist/plots/utils/geoAccessors.d.ts +0 -72
  487. package/dist/plots/utils/geoAccessors.js +0 -220
  488. package/dist/plots/utils/geoSegments.d.ts +0 -29
  489. package/dist/plots/utils/geoSegments.js +0 -37
  490. package/dist/types/layout/styles.d.ts +0 -122
  491. package/dist/types/markers/axis/curveName.d.ts +0 -2
  492. package/dist/types/plots/line/props.d.ts +0 -10
  493. package/dist/utils/color/contrast.d.ts +0 -9
  494. package/dist/utils/color/contrast.js +0 -40
  495. package/dist/utils/color/cssColor.d.ts +0 -4
  496. package/dist/utils/color/cssColor.js +0 -77
  497. package/dist/utils/color/ramp.d.ts +0 -17
  498. package/dist/utils/color/ramp.js +0 -110
  499. package/dist/utils/opacity.d.ts +0 -9
  500. package/dist/utils/opacity.js +0 -38
  501. package/examples/data.ts +0 -324
  502. /package/dist/plots/{box → distribution/box}/markers.js +0 -0
  503. /package/dist/types/layout/{styles.js → statistics/deviation.js} +0 -0
  504. /package/dist/types/{markers/axis/curveName.js → layout/styles/base.js} +0 -0
  505. /package/dist/types/{plots/area/props.js → layout/styles/bullet.js} +0 -0
  506. /package/dist/types/{plots/area/state.js → layout/styles/connector.js} +0 -0
  507. /package/dist/types/{plots/bar/props.js → layout/styles/curve.js} +0 -0
  508. /package/dist/types/{plots/bar/state.js → layout/styles/frame.js} +0 -0
  509. /package/dist/types/{plots/box/props.js → layout/styles/gaps.js} +0 -0
  510. /package/dist/types/{plots/box/state.js → layout/styles/geo.js} +0 -0
  511. /package/dist/types/{plots/geo/props.js → layout/styles/values.js} +0 -0
  512. /package/dist/types/{plots/geo/state.js → markers/axis/violin.js} +0 -0
  513. /package/dist/types/{plots/heatmap/props.js → markers/channels/commonMarkerConfigWithRowOffset.js} +0 -0
  514. /package/dist/types/plots/{histogram → correlation/heatmap}/props.js +0 -0
  515. /package/dist/types/plots/{heatmap → correlation/heatmap}/state.js +0 -0
  516. /package/dist/types/plots/{line → correlation/scatter}/props.js +0 -0
  517. /package/dist/types/plots/{histogram → correlation/scatter}/state.js +0 -0
  518. /package/dist/types/plots/{pyramid → distribution/box}/props.js +0 -0
  519. /package/dist/types/plots/{line → distribution/box}/state.js +0 -0
  520. /package/dist/types/plots/{scatter → distribution/density}/props.js +0 -0
  521. /package/dist/types/plots/{pyramid → distribution/density}/state.js +0 -0
  522. /package/dist/types/plots/{scatter/state.js → distribution/histogram/props.js} +0 -0
  523. /package/dist/{plots/utils → utils}/accessors.d.ts +0 -0
  524. /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
- {#if isHorizontal}
21
- <WaffleX
22
- {data}
23
- x={marker.x}
24
- x1={marker.x1}
25
- x2={marker.x2}
26
- y={marker.y}
27
- unit={marker.unit}
28
- multiple={marker.multiple}
29
- gap={marker.gap}
30
- round={marker.round}
31
- borderRadius={marker.styles?.borderRadius}
32
- {fill}
33
- fillOpacity={marker.styles?.fillOpacity}
34
- stroke={marker.styles?.stroke}
35
- strokeWidth={marker.styles?.strokeWidth}
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;
@@ -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 { resolveColorScale } from '../../utils/color';
3
- import { resolveAccessor } from '../../plots/utils/accessors';
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 = resolveColorScale(scales.color, (options.colorOrder ? options.colorOrder(fullSeries) : fullSeries).map((s) => s.name), ctx.cfg.palette);
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 '../../plots/utils/accessors';
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';
@@ -20,6 +20,7 @@ type NarrowableState = FacetStageState & {
20
20
  panel?: string;
21
21
  };
22
22
  }[];
23
+ labelled?: Record<string | symbol, unknown>[];
23
24
  };
24
25
  /** The field a processed row carries its facet panel under. */
25
26
  export declare const PANEL_KEY = "__panel";
@@ -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 '../../plots/utils/accessors';
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, processedData, axis);
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
- scales[axis] = { ...scales[axis], ...fitted[axis] };
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?.niceTolerance),
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, processed, axis) {
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
- niceTolerance?: number;
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]?.niceTolerance);
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 marker it
14
- * renders as - `regression`/`bollinger` construct their marker directly
15
- * (svelteplot resolves the curve/band itself, at render time); the others
16
- * compute their rows first.
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 marker it
17
- * renders as - `regression`/`bollinger` construct their marker directly
18
- * (svelteplot resolves the curve/band itself, at render time); the others
19
- * compute their rows first.
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 [Statistics.buildMarker(source, stat)];
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 [Statistics.buildMarker(source, stat)];
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 = { x: x, y: y };
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 [Statistics.buildMarker({ data, ...accessors, color: flatColor }, stat)];
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
  });