@milaboratories/miplots4 1.0.129 → 1.0.131

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 (351) hide show
  1. package/dist/DataFrame.d.ts +15 -9
  2. package/dist/DataFrame.d.ts.map +1 -1
  3. package/dist/DataFrame.js +105 -81
  4. package/dist/DataFrame.js.map +1 -1
  5. package/dist/bubble/ChartRenderer.d.ts +6 -5
  6. package/dist/bubble/ChartRenderer.d.ts.map +1 -1
  7. package/dist/bubble/ChartRenderer.js +123 -121
  8. package/dist/bubble/ChartRenderer.js.map +1 -1
  9. package/dist/bubble/components/Chart.d.ts +3 -2
  10. package/dist/bubble/components/Chart.d.ts.map +1 -1
  11. package/dist/bubble/components/Chart.js +78 -97
  12. package/dist/bubble/components/Chart.js.map +1 -1
  13. package/dist/bubble/components/ChartsGroup.d.ts +6 -5
  14. package/dist/bubble/components/ChartsGroup.d.ts.map +1 -1
  15. package/dist/bubble/components/ChartsGroup.js +39 -37
  16. package/dist/bubble/components/ChartsGroup.js.map +1 -1
  17. package/dist/bubble/getCellTooltip.d.ts +5 -0
  18. package/dist/bubble/getCellTooltip.d.ts.map +1 -0
  19. package/dist/bubble/getCellTooltip.js +28 -0
  20. package/dist/bubble/getCellTooltip.js.map +1 -0
  21. package/dist/bubble/{getCells.d.ts → getGroupedCellsData.d.ts} +4 -4
  22. package/dist/bubble/getGroupedCellsData.d.ts.map +1 -0
  23. package/dist/bubble/getGroupedCellsData.js +94 -0
  24. package/dist/bubble/getGroupedCellsData.js.map +1 -0
  25. package/dist/bubble/index.d.ts +4 -4
  26. package/dist/bubble/index.d.ts.map +1 -1
  27. package/dist/bubble/index.js +47 -42
  28. package/dist/bubble/index.js.map +1 -1
  29. package/dist/bubble/utils/calculateCaptionTails.d.ts +2 -2
  30. package/dist/bubble/utils/calculateCaptionTails.d.ts.map +1 -1
  31. package/dist/bubble/utils/calculateCaptionTails.js.map +1 -1
  32. package/dist/common/Legend.d.ts.map +1 -1
  33. package/dist/common/Legend.js.map +1 -1
  34. package/dist/common/Tooltip.js +1 -1
  35. package/dist/common/Tooltip.js.map +1 -1
  36. package/dist/common/types.d.ts +1 -1
  37. package/dist/common/types.d.ts.map +1 -1
  38. package/dist/common/useDataFrame.d.ts +11 -0
  39. package/dist/common/useDataFrame.d.ts.map +1 -0
  40. package/dist/common/useDataFrame.js +20 -0
  41. package/dist/common/useDataFrame.js.map +1 -0
  42. package/dist/dendro/ChartRenderer.d.ts +9 -8
  43. package/dist/dendro/ChartRenderer.d.ts.map +1 -1
  44. package/dist/dendro/ChartRenderer.js +187 -187
  45. package/dist/dendro/ChartRenderer.js.map +1 -1
  46. package/dist/dendro/components/Chart.d.ts +8 -8
  47. package/dist/dendro/components/Chart.d.ts.map +1 -1
  48. package/dist/dendro/components/Chart.js +35 -35
  49. package/dist/dendro/components/Chart.js.map +1 -1
  50. package/dist/dendro/components/Heatmap.d.ts +3 -3
  51. package/dist/dendro/components/Heatmap.d.ts.map +1 -1
  52. package/dist/dendro/components/Heatmap.js +23 -23
  53. package/dist/dendro/components/Heatmap.js.map +1 -1
  54. package/dist/dendro/components/Legend.d.ts.map +1 -1
  55. package/dist/dendro/components/Legend.js.map +1 -1
  56. package/dist/dendro/components/LinksGroup.d.ts +6 -6
  57. package/dist/dendro/components/LinksGroup.d.ts.map +1 -1
  58. package/dist/dendro/components/LinksGroup.js +17 -17
  59. package/dist/dendro/components/LinksGroup.js.map +1 -1
  60. package/dist/dendro/components/NodesGroup.d.ts +7 -7
  61. package/dist/dendro/components/NodesGroup.d.ts.map +1 -1
  62. package/dist/dendro/components/NodesGroup.js +29 -29
  63. package/dist/dendro/components/NodesGroup.js.map +1 -1
  64. package/dist/dendro/components/types.d.ts +2 -2
  65. package/dist/dendro/components/types.d.ts.map +1 -1
  66. package/dist/dendro/getHeatmapData.d.ts +2 -2
  67. package/dist/dendro/getHeatmapData.d.ts.map +1 -1
  68. package/dist/dendro/getHeatmapData.js +48 -44
  69. package/dist/dendro/getHeatmapData.js.map +1 -1
  70. package/dist/dendro/getHierarchyData.d.ts +3 -3
  71. package/dist/dendro/getHierarchyData.d.ts.map +1 -1
  72. package/dist/dendro/getHierarchyData.js +31 -31
  73. package/dist/dendro/getHierarchyData.js.map +1 -1
  74. package/dist/dendro/index.d.ts +5 -5
  75. package/dist/dendro/index.d.ts.map +1 -1
  76. package/dist/dendro/index.js +86 -89
  77. package/dist/dendro/index.js.map +1 -1
  78. package/dist/discrete/ChartRenderer.d.ts +6 -6
  79. package/dist/discrete/ChartRenderer.d.ts.map +1 -1
  80. package/dist/discrete/ChartRenderer.js +197 -196
  81. package/dist/discrete/ChartRenderer.js.map +1 -1
  82. package/dist/discrete/DiscreteSettingsImpl.d.ts +3 -3
  83. package/dist/discrete/DiscreteSettingsImpl.d.ts.map +1 -1
  84. package/dist/discrete/DiscreteSettingsImpl.js +8 -8
  85. package/dist/discrete/DiscreteSettingsImpl.js.map +1 -1
  86. package/dist/discrete/components/layers/BoxElement.js.map +1 -1
  87. package/dist/discrete/index.d.ts +1 -1
  88. package/dist/discrete/index.d.ts.map +1 -1
  89. package/dist/discrete/index.js +109 -106
  90. package/dist/discrete/index.js.map +1 -1
  91. package/dist/discrete/layers/bar.d.ts +2 -2
  92. package/dist/discrete/layers/bar.d.ts.map +1 -1
  93. package/dist/discrete/layers/bar.js +32 -37
  94. package/dist/discrete/layers/bar.js.map +1 -1
  95. package/dist/discrete/layers/binnedDots.d.ts +3 -3
  96. package/dist/discrete/layers/binnedDots.d.ts.map +1 -1
  97. package/dist/discrete/layers/binnedDots.js +66 -78
  98. package/dist/discrete/layers/binnedDots.js.map +1 -1
  99. package/dist/discrete/layers/boxes.d.ts +3 -4
  100. package/dist/discrete/layers/boxes.d.ts.map +1 -1
  101. package/dist/discrete/layers/boxes.js +59 -60
  102. package/dist/discrete/layers/boxes.js.map +1 -1
  103. package/dist/discrete/layers/dots.d.ts +2 -3
  104. package/dist/discrete/layers/dots.d.ts.map +1 -1
  105. package/dist/discrete/layers/dots.js +30 -30
  106. package/dist/discrete/layers/dots.js.map +1 -1
  107. package/dist/discrete/layers/lines.js +11 -10
  108. package/dist/discrete/layers/lines.js.map +1 -1
  109. package/dist/discrete/layers/logo.d.ts +2 -2
  110. package/dist/discrete/layers/logo.d.ts.map +1 -1
  111. package/dist/discrete/layers/logo.js +21 -21
  112. package/dist/discrete/layers/logo.js.map +1 -1
  113. package/dist/discrete/layers/pairedPoints.d.ts +2 -2
  114. package/dist/discrete/layers/pairedPoints.d.ts.map +1 -1
  115. package/dist/discrete/layers/pairedPoints.js +62 -62
  116. package/dist/discrete/layers/pairedPoints.js.map +1 -1
  117. package/dist/discrete/layers/sina.d.ts +3 -4
  118. package/dist/discrete/layers/sina.d.ts.map +1 -1
  119. package/dist/discrete/layers/sina.js +67 -71
  120. package/dist/discrete/layers/sina.js.map +1 -1
  121. package/dist/discrete/layers/stackedBar.d.ts +1 -1
  122. package/dist/discrete/layers/stackedBar.d.ts.map +1 -1
  123. package/dist/discrete/layers/stackedBar.js +25 -25
  124. package/dist/discrete/layers/stackedBar.js.map +1 -1
  125. package/dist/discrete/layers/violins.js +13 -13
  126. package/dist/discrete/utils/getOutliersBounds.d.ts +1 -1
  127. package/dist/discrete/utils/getOutliersBounds.d.ts.map +1 -1
  128. package/dist/discrete/utils/getOutliersBounds.js +5 -5
  129. package/dist/discrete/utils/getOutliersBounds.js.map +1 -1
  130. package/dist/discrete/utils/splitTextByWidth.js +1 -1
  131. package/dist/discrete/utils/splitTextByWidth.js.map +1 -1
  132. package/dist/heatmap/ChartRenderer.d.ts +7 -6
  133. package/dist/heatmap/ChartRenderer.d.ts.map +1 -1
  134. package/dist/heatmap/ChartRenderer.js +232 -230
  135. package/dist/heatmap/ChartRenderer.js.map +1 -1
  136. package/dist/heatmap/HeatmapSettingsImpl.d.ts +2 -2
  137. package/dist/heatmap/HeatmapSettingsImpl.d.ts.map +1 -1
  138. package/dist/heatmap/HeatmapSettingsImpl.js +1 -1
  139. package/dist/heatmap/HeatmapSettingsImpl.js.map +1 -1
  140. package/dist/heatmap/components/Annotations/Annotation.d.ts.map +1 -1
  141. package/dist/heatmap/components/Annotations/Annotation.js +40 -39
  142. package/dist/heatmap/components/Annotations/Annotation.js.map +1 -1
  143. package/dist/heatmap/components/Chart.d.ts.map +1 -1
  144. package/dist/heatmap/components/Chart.js +90 -89
  145. package/dist/heatmap/components/Chart.js.map +1 -1
  146. package/dist/heatmap/components/ChartsGroup.d.ts +2 -2
  147. package/dist/heatmap/components/ChartsGroup.d.ts.map +1 -1
  148. package/dist/heatmap/components/ChartsGroup.js +14 -14
  149. package/dist/heatmap/components/ChartsGroup.js.map +1 -1
  150. package/dist/heatmap/components/types.d.ts +3 -2
  151. package/dist/heatmap/components/types.d.ts.map +1 -1
  152. package/dist/heatmap/getCells.d.ts +3 -2
  153. package/dist/heatmap/getCells.d.ts.map +1 -1
  154. package/dist/heatmap/getCells.js +97 -93
  155. package/dist/heatmap/getCells.js.map +1 -1
  156. package/dist/heatmap/index.d.ts +3 -3
  157. package/dist/heatmap/index.d.ts.map +1 -1
  158. package/dist/heatmap/index.js +13 -12
  159. package/dist/heatmap/index.js.map +1 -1
  160. package/dist/heatmap/utils/calculateAnnotationTitleSizes.d.ts.map +1 -1
  161. package/dist/heatmap/utils/calculateAnnotationTitleSizes.js +1 -1
  162. package/dist/heatmap/utils/calculateAnnotationTitleSizes.js.map +1 -1
  163. package/dist/heatmap/utils/calculateCaptionTails.d.ts +1 -1
  164. package/dist/heatmap/utils/calculateCaptionTails.d.ts.map +1 -1
  165. package/dist/heatmap/utils/calculateCaptionTails.js.map +1 -1
  166. package/dist/histogram/ChartRenderer.d.ts +6 -5
  167. package/dist/histogram/ChartRenderer.d.ts.map +1 -1
  168. package/dist/histogram/ChartRenderer.js +154 -153
  169. package/dist/histogram/ChartRenderer.js.map +1 -1
  170. package/dist/histogram/HistogramSettingsImpl.d.ts +2 -2
  171. package/dist/histogram/HistogramSettingsImpl.d.ts.map +1 -1
  172. package/dist/histogram/HistogramSettingsImpl.js.map +1 -1
  173. package/dist/histogram/components/Chart.js +48 -48
  174. package/dist/histogram/components/Chart.js.map +1 -1
  175. package/dist/histogram/components/types.d.ts +4 -3
  176. package/dist/histogram/components/types.d.ts.map +1 -1
  177. package/dist/histogram/getHistogramData.d.ts +7 -7
  178. package/dist/histogram/getHistogramData.d.ts.map +1 -1
  179. package/dist/histogram/getHistogramData.js +52 -53
  180. package/dist/histogram/getHistogramData.js.map +1 -1
  181. package/dist/histogram/index.d.ts +3 -3
  182. package/dist/histogram/index.d.ts.map +1 -1
  183. package/dist/histogram/index.js +49 -45
  184. package/dist/histogram/index.js.map +1 -1
  185. package/dist/node_modules/@d3fc/d3fc-axis/src/axisBase.js +10 -10
  186. package/dist/node_modules/d3-array/src/min.js +5 -11
  187. package/dist/node_modules/d3-array/src/min.js.map +1 -1
  188. package/dist/node_modules/d3-shape/src/area.js +30 -30
  189. package/dist/node_modules/d3-shape/src/line.js +6 -6
  190. package/dist/node_modules/d3-shape/src/line.js.map +1 -1
  191. package/dist/node_modules/kdbush/index.js +148 -0
  192. package/dist/node_modules/kdbush/index.js.map +1 -0
  193. package/dist/scatterplot/ChartRenderer.d.ts +7 -6
  194. package/dist/scatterplot/ChartRenderer.d.ts.map +1 -1
  195. package/dist/scatterplot/ChartRenderer.js +213 -209
  196. package/dist/scatterplot/ChartRenderer.js.map +1 -1
  197. package/dist/scatterplot/ScatterplotSettingsImpl.d.ts +2 -2
  198. package/dist/scatterplot/ScatterplotSettingsImpl.d.ts.map +1 -1
  199. package/dist/scatterplot/ScatterplotSettingsImpl.js +28 -28
  200. package/dist/scatterplot/ScatterplotSettingsImpl.js.map +1 -1
  201. package/dist/scatterplot/components/ChartAxisTitles.d.ts.map +1 -1
  202. package/dist/scatterplot/components/ChartAxisTitles.js +31 -30
  203. package/dist/scatterplot/components/ChartAxisTitles.js.map +1 -1
  204. package/dist/scatterplot/components/ChartLayersData.d.ts.map +1 -1
  205. package/dist/scatterplot/components/ChartLayersData.js +138 -156
  206. package/dist/scatterplot/components/ChartLayersData.js.map +1 -1
  207. package/dist/scatterplot/components/ChartTooltip.d.ts.map +1 -1
  208. package/dist/scatterplot/components/ChartTooltip.js +41 -38
  209. package/dist/scatterplot/components/ChartTooltip.js.map +1 -1
  210. package/dist/scatterplot/components/ChartTrendsData.js +21 -21
  211. package/dist/scatterplot/components/ChartTrendsData.js.map +1 -1
  212. package/dist/scatterplot/components/types.d.ts +7 -7
  213. package/dist/scatterplot/components/types.d.ts.map +1 -1
  214. package/dist/scatterplot/constants.d.ts +1 -1
  215. package/dist/scatterplot/constants.d.ts.map +1 -1
  216. package/dist/scatterplot/constants.js.map +1 -1
  217. package/dist/scatterplot/dots.d.ts +2 -2
  218. package/dist/scatterplot/dots.d.ts.map +1 -1
  219. package/dist/scatterplot/dots.js +27 -25
  220. package/dist/scatterplot/dots.js.map +1 -1
  221. package/dist/scatterplot/getLayersData.d.ts +3 -3
  222. package/dist/scatterplot/getLayersData.d.ts.map +1 -1
  223. package/dist/scatterplot/getLayersData.js +12 -15
  224. package/dist/scatterplot/getLayersData.js.map +1 -1
  225. package/dist/scatterplot/index.d.ts +4 -4
  226. package/dist/scatterplot/index.d.ts.map +1 -1
  227. package/dist/scatterplot/index.js +71 -72
  228. package/dist/scatterplot/index.js.map +1 -1
  229. package/dist/scatterplot/linearRegression.d.ts +5 -4
  230. package/dist/scatterplot/linearRegression.d.ts.map +1 -1
  231. package/dist/scatterplot/linearRegression.js +88 -86
  232. package/dist/scatterplot/linearRegression.js.map +1 -1
  233. package/dist/scatterplot/utils/createAesGetter.d.ts +3 -2
  234. package/dist/scatterplot/utils/createAesGetter.d.ts.map +1 -1
  235. package/dist/scatterplot/utils/createAesGetter.js +21 -21
  236. package/dist/scatterplot/utils/createAesGetter.js.map +1 -1
  237. package/dist/scatterplot/utils/createLegendInfo.d.ts +2 -10
  238. package/dist/scatterplot/utils/createLegendInfo.d.ts.map +1 -1
  239. package/dist/scatterplot/utils/createLegendInfo.js +44 -37
  240. package/dist/scatterplot/utils/createLegendInfo.js.map +1 -1
  241. package/dist/scatterplot/utils/formatColumnValue.d.ts +5 -0
  242. package/dist/scatterplot/utils/formatColumnValue.d.ts.map +1 -0
  243. package/dist/scatterplot/utils/formatColumnValue.js +11 -0
  244. package/dist/scatterplot/utils/formatColumnValue.js.map +1 -0
  245. package/dist/scatterplot/utils/getVisibleLabels.d.ts +6 -9
  246. package/dist/scatterplot/utils/getVisibleLabels.d.ts.map +1 -1
  247. package/dist/scatterplot/utils/getVisibleLabels.js +46 -56
  248. package/dist/scatterplot/utils/getVisibleLabels.js.map +1 -1
  249. package/dist/scatterplot-umap/ChartRenderer.d.ts +18 -15
  250. package/dist/scatterplot-umap/ChartRenderer.d.ts.map +1 -1
  251. package/dist/scatterplot-umap/ChartRenderer.js +231 -214
  252. package/dist/scatterplot-umap/ChartRenderer.js.map +1 -1
  253. package/dist/scatterplot-umap/SettingsImpl.d.ts +2 -2
  254. package/dist/scatterplot-umap/SettingsImpl.d.ts.map +1 -1
  255. package/dist/scatterplot-umap/SettingsImpl.js +25 -25
  256. package/dist/scatterplot-umap/SettingsImpl.js.map +1 -1
  257. package/dist/scatterplot-umap/colors.d.ts +6 -0
  258. package/dist/scatterplot-umap/colors.d.ts.map +1 -0
  259. package/dist/scatterplot-umap/colors.js +42 -0
  260. package/dist/scatterplot-umap/colors.js.map +1 -0
  261. package/dist/scatterplot-umap/components/LowerSVG.d.ts +2 -2
  262. package/dist/scatterplot-umap/components/LowerSVG.d.ts.map +1 -1
  263. package/dist/scatterplot-umap/components/LowerSVG.js +97 -94
  264. package/dist/scatterplot-umap/components/LowerSVG.js.map +1 -1
  265. package/dist/scatterplot-umap/components/UpperSVG.d.ts.map +1 -1
  266. package/dist/scatterplot-umap/components/UpperSVG.js +20 -19
  267. package/dist/scatterplot-umap/components/UpperSVG.js.map +1 -1
  268. package/dist/scatterplot-umap/index.d.ts +0 -2
  269. package/dist/scatterplot-umap/index.d.ts.map +1 -1
  270. package/dist/scatterplot-umap/index.js +77 -102
  271. package/dist/scatterplot-umap/index.js.map +1 -1
  272. package/dist/scatterplot-umap/types.d.ts +7 -10
  273. package/dist/scatterplot-umap/types.d.ts.map +1 -1
  274. package/dist/types/bubble.d.ts +44 -12
  275. package/dist/types/bubble.d.ts.map +1 -1
  276. package/dist/types/common.d.ts +22 -3
  277. package/dist/types/common.d.ts.map +1 -1
  278. package/dist/types/common.js +3 -1
  279. package/dist/types/common.js.map +1 -1
  280. package/dist/types/dendro.d.ts +113 -10
  281. package/dist/types/dendro.d.ts.map +1 -1
  282. package/dist/types/dendro.js +1 -1
  283. package/dist/types/dendro.js.map +1 -1
  284. package/dist/types/discrete.d.ts +99 -22
  285. package/dist/types/discrete.d.ts.map +1 -1
  286. package/dist/types/discrete.js +3 -3
  287. package/dist/types/discrete.js.map +1 -1
  288. package/dist/types/heatmap.d.ts +187 -28
  289. package/dist/types/heatmap.d.ts.map +1 -1
  290. package/dist/types/heatmap.js +1 -1
  291. package/dist/types/heatmap.js.map +1 -1
  292. package/dist/types/histogram.d.ts +30 -8
  293. package/dist/types/histogram.d.ts.map +1 -1
  294. package/dist/types/histogram.js +1 -1
  295. package/dist/types/histogram.js.map +1 -1
  296. package/dist/types/scatterplot-umap.d.ts +149 -15
  297. package/dist/types/scatterplot-umap.d.ts.map +1 -1
  298. package/dist/types/scatterplot-umap.js +9 -9
  299. package/dist/types/scatterplot-umap.js.map +1 -1
  300. package/dist/types/scatterplot.d.ts +164 -12
  301. package/dist/types/scatterplot.d.ts.map +1 -1
  302. package/dist/types/scatterplot.js +1 -1
  303. package/dist/types/scatterplot.js.map +1 -1
  304. package/dist/utils/TextMeasurer/TextMeasurer.d.ts +7 -0
  305. package/dist/utils/TextMeasurer/TextMeasurer.d.ts.map +1 -0
  306. package/dist/utils/TextMeasurer/TextMeasurer.js +42 -0
  307. package/dist/utils/TextMeasurer/TextMeasurer.js.map +1 -0
  308. package/dist/utils/TextMeasurer/charToWidth.json.js +155 -0
  309. package/dist/utils/TextMeasurer/charToWidth.json.js.map +1 -0
  310. package/dist/utils/arrangeLegendParts.js +1 -1
  311. package/dist/utils/arrangeLegendParts.js.map +1 -1
  312. package/dist/utils/getChartEdgeSides.d.ts +1 -1
  313. package/dist/utils/getLegendWidth.d.ts.map +1 -1
  314. package/dist/utils/getLegendWidth.js +1 -1
  315. package/dist/utils/getLegendWidth.js.map +1 -1
  316. package/package.json +5 -3
  317. package/dist/bubble/getCells.d.ts.map +0 -1
  318. package/dist/bubble/getCells.js +0 -91
  319. package/dist/bubble/getCells.js.map +0 -1
  320. package/dist/node_modules/d3-quadtree/src/add.js +0 -30
  321. package/dist/node_modules/d3-quadtree/src/add.js.map +0 -1
  322. package/dist/node_modules/d3-quadtree/src/cover.js +0 -29
  323. package/dist/node_modules/d3-quadtree/src/cover.js.map +0 -1
  324. package/dist/node_modules/d3-quadtree/src/data.js +0 -12
  325. package/dist/node_modules/d3-quadtree/src/data.js.map +0 -1
  326. package/dist/node_modules/d3-quadtree/src/extent.js +0 -7
  327. package/dist/node_modules/d3-quadtree/src/extent.js.map +0 -1
  328. package/dist/node_modules/d3-quadtree/src/find.js +0 -26
  329. package/dist/node_modules/d3-quadtree/src/find.js.map +0 -1
  330. package/dist/node_modules/d3-quadtree/src/quad.js +0 -7
  331. package/dist/node_modules/d3-quadtree/src/quad.js.map +0 -1
  332. package/dist/node_modules/d3-quadtree/src/quadtree.js +0 -51
  333. package/dist/node_modules/d3-quadtree/src/quadtree.js.map +0 -1
  334. package/dist/node_modules/d3-quadtree/src/remove.js +0 -21
  335. package/dist/node_modules/d3-quadtree/src/remove.js.map +0 -1
  336. package/dist/node_modules/d3-quadtree/src/root.js +0 -7
  337. package/dist/node_modules/d3-quadtree/src/root.js.map +0 -1
  338. package/dist/node_modules/d3-quadtree/src/size.js +0 -12
  339. package/dist/node_modules/d3-quadtree/src/size.js.map +0 -1
  340. package/dist/node_modules/d3-quadtree/src/visit.js +0 -14
  341. package/dist/node_modules/d3-quadtree/src/visit.js.map +0 -1
  342. package/dist/node_modules/d3-quadtree/src/visitAfter.js +0 -19
  343. package/dist/node_modules/d3-quadtree/src/visitAfter.js.map +0 -1
  344. package/dist/node_modules/d3-quadtree/src/x.js +0 -11
  345. package/dist/node_modules/d3-quadtree/src/x.js.map +0 -1
  346. package/dist/node_modules/d3-quadtree/src/y.js +0 -11
  347. package/dist/node_modules/d3-quadtree/src/y.js.map +0 -1
  348. package/dist/utils/TextMeasurer.d.ts +0 -8
  349. package/dist/utils/TextMeasurer.d.ts.map +0 -1
  350. package/dist/utils/TextMeasurer.js +0 -27
  351. package/dist/utils/TextMeasurer.js.map +0 -1
@@ -1 +1 @@
1
- {"version":3,"file":"linearRegression.js","sources":["../../src/scatterplot/linearRegression.ts"],"sourcesContent":["import type {Dot, GroupedDots} from './dots';\nimport type {ScatterplotSettingsImpl} from './ScatterplotSettingsImpl';\nimport type {ContinuousAesFromColumn, InheritAesScatterplot, Row} from '../types';\nimport type {ColumnName} from '../types';\nimport fCDF from '@stdlib/stats-base-dists-f-cdf';\nimport {extent, mean, sum} from 'd3-array';\nimport type {ScaleLinear} from 'd3-scale';\nimport {area} from 'd3-shape';\n\nconst CONFIDENCE_LEVEL = 0.05;\n\n/*\n Returns the normal deviate Z corresponding to a given lower tail area of P; Z is accurate to about 1 part in 10**16.\n\n Wichura, M. J. (1988) Algorithm AS 241: The percentage points of the normal distribution. Applied Statistics, 37, 477–484.\n\n extension of:\n Beasley, J. D./ Springer, S. G. (1977), The percentage points of the NormalDistribution, Applied Statistics. 26, 118–121.\n\n Excel: STANDNORMINV(); R: qnorm()\n */\n\nfunction normdev(p: number) {\n if (p < 0 || p > 1) throw Error('P p < 0 || p > 1 in linear regression calculation');\n if (p == 0) return -Infinity;\n if (p == 1) return Infinity;\n\n /* eslint-disable @typescript-eslint/no-loss-of-precision */\n const a0 = 3.387132872796366608,\n a1 = 1.3314166789178437745e2,\n a2 = 1.9715909503065514427e3,\n a3 = 1.3731693765509461125e4,\n a4 = 4.5921953931549871457e4,\n a5 = 6.7265770927008700853e4,\n a6 = 3.3430575583588128105e4,\n a7 = 2.5090809287301226727e3,\n b1 = 4.2313330701600911252e1,\n b2 = 6.871870074920579083e2,\n b3 = 5.3941960214247511077e3,\n b4 = 2.1213794301586595867e4,\n b5 = 3.930789580009271061e4,\n b6 = 2.8729085735721942674e4,\n b7 = 5.226495278852854561e3,\n c0 = 1.42343711074968357734,\n c1 = 4.6303378461565452959,\n c2 = 5.7694972214606914055,\n c3 = 3.64784832476320460504,\n c4 = 1.27045825245236838258,\n c5 = 2.4178072517745061177e-1,\n c6 = 2.27238449892691845833e-2,\n c7 = 7.7454501427834140764e-4,\n d1 = 2.05319162663775882187,\n d2 = 1.6763848301838038494,\n d3 = 6.8976733498510000455e-1,\n d4 = 1.4810397642748007459e-1,\n d5 = 1.51986665636164571966e-2,\n d6 = 5.475938084995344946e-4,\n d7 = 1.05075007164441684324e-9,\n e0 = 6.6579046435011037772,\n e1 = 5.4637849111641143699,\n e2 = 1.7848265399172913358,\n e3 = 2.9656057182850489123e-1,\n e4 = 2.6532189526576123093e-2,\n e5 = 1.2426609473880784386e-3,\n e6 = 2.71155556874348757815e-5,\n e7 = 2.01033439929228813265e-7,\n f1 = 5.9983220655588793769e-1,\n f2 = 1.3692988092273580531e-1,\n f3 = 1.48753612908506148525e-2,\n f4 = 7.868691311456132591e-4,\n f5 = 1.8463183175100546818e-5,\n f6 = 1.4215117583164458887e-7,\n f7 = 2.04426310338993978564e-15;\n /* eslint-enable @typescript-eslint/no-loss-of-precision */\n\n const q = p - 0.5;\n let r, z;\n\n // p close to 0.5\n if (Math.abs(q) <= 0.425) {\n r = 0.180625 - q * q;\n z =\n (q * (((((((a7 * r + a6) * r + a5) * r + a4) * r + a3) * r + a2) * r + a1) * r + a0)) /\n (((((((b7 * r + b6) * r + b5) * r + b4) * r + b3) * r + b2) * r + b1) * r + 1);\n return z;\n }\n\n if (q > 0) r = 1 - p;\n else r = p;\n r = Math.sqrt(-Math.log(r));\n\n // p neither close to 0.5 nor 0 or 1\n if (r <= 5) {\n r += -1.6;\n z =\n (((((((c7 * r + c6) * r + c5) * r + c4) * r + c3) * r + c2) * r + c1) * r + c0) /\n (((((((d7 * r + d6) * r + d5) * r + d4) * r + d3) * r + d2) * r + d1) * r + 1);\n }\n // p near 0 or 1\n else {\n r += -5;\n z =\n (((((((e7 * r + e6) * r + e5) * r + e4) * r + e3) * r + e2) * r + e1) * r + e0) /\n (((((((f7 * r + f6) * r + f5) * r + f4) * r + f3) * r + f2) * r + f1) * r + 1);\n }\n\n if (q < 0.0) z = -z;\n return z;\n}\n\n/*\nHill's approximated inverse t-distribution calculates t given df and two-tail probability:\nHill, G. W. (1970), Algorithm 396: Student's t-quantiles. Communications of the ACM, 13(10), 619–620.\n\nResult should be \"correct to at least 6 significant digits even for the analytic continuation through noninteger values of n > 5\". For higher precision (used in R, ...) see:\nHill, G. W. (1981) Remark on Algorithm 396, ACM Transactions on Mathematical Software, 7, 250–1.\n\nExcel: TINV(); R: qt()\n*/\nfunction inverseT(p: number, df: number) {\n const {sin, cos, sqrt, pow, exp, PI} = Math;\n let x: number, y: number;\n\n if (df == 1) return cos((p * PI) / 2) / sin((p * PI) / 2);\n if (df == 2) return sqrt(2 / (p * (2 - p)) - 2);\n\n const a = 1 / (df - 0.5);\n const b = 48 / (a * a);\n let c = (((20700 * a) / b - 98) * a - 16) * a + 96.36;\n const d = ((94.5 / (b + c) - 3) / b + 1) * sqrt(a * PI * 0.5) * df;\n x = d * p;\n y = pow(x, 2 / df);\n\n if (y > 0.05 + a) {\n // The procedure normdev(p) is assumed to return a negative normal\n // deviate at the lower tail probability level p, e.g. -2.32 for p = 0.01.\n x = normdev(p / 2);\n y = x * x;\n if (df < 5) c = c + 0.3 * (df - 4.5) * (x + 0.6);\n c = (((0.05 * d * x - 5) * x - 7) * x - 2) * x + b + c;\n y = (((((0.4 * y + 6.3) * y + 36) * y + 94.5) / c - y - 3) / b + 1) * x;\n y = a * y * y;\n if (y > 0.002) y = exp(y) - 1;\n else y = 0.5 * y * y + y;\n } else {\n y =\n (((1 / (((df + 6) / (df * y) - 0.089 * d - 0.822) * (df + 2) * 3) + 0.5 / (df + 4)) * y - 1) * (df + 1)) /\n (df + 2) +\n 1 / y;\n }\n\n return sqrt(df * y);\n}\n\nexport function linearRegression(data: {x: number; y: number}[]): [number, number] {\n let n = data.length,\n sumX = 0,\n sumY = 0,\n sumXY = 0,\n sumX2 = 0;\n for (let i = 0; i < data.length; ++i) {\n const xi = data[i].x;\n const yi = data[i].y;\n if (!Number.isFinite(xi) || !Number.isFinite(yi)) {\n --n;\n continue;\n }\n sumX += xi;\n sumY += yi;\n sumXY += xi * yi;\n sumX2 += xi * xi;\n }\n const slope = (n * sumXY - sumX * sumY) / (n * sumX2 - sumX * sumX);\n const intercept = (sumY - slope * sumX) / n;\n\n return [slope, intercept];\n}\n\nfunction getCoefficientsInterval(dots: Dot[], slope: number, intercept: number) {\n const predict = (x: number) => x * slope + intercept;\n const n = dots.length;\n const meanX = sum(dots, d => d.x) / dots.length;\n const t = inverseT(CONFIDENCE_LEVEL, n - 2);\n\n const se_b = Math.sqrt(\n sum(dots, dot => (dot.y - predict(dot.x)) ** 2) / (n - 2) / sum(dots, dot => (dot.x - meanX) ** 2)\n );\n const slopeError = se_b * t;\n\n const se_a = se_b * Math.sqrt(sum(dots, dot => dot.x ** 2) / n);\n const interceptError = se_a * t;\n\n return {slope, intercept, slopeError, interceptError};\n}\n\nexport type PointIntervalInfo = {\n x: number; y: number, left: number; right: number\n}\n// https://stats.stackexchange.com/questions/101318/understanding-shape-and-calculation-of-confidence-bands-in-linear-regression\nexport function confidenceInterval(\n data: {x: number; y: number}[],\n predict: (x: number) => number\n): (x: number) => PointIntervalInfo {\n const mean = sum(data, d => d.x) / data.length;\n let a = 0,\n b = 0;\n for (let i = 0; i < data.length; ++i) {\n a += Math.pow(data[i].x - mean, 2);\n b += Math.pow(data[i].y - predict(data[i].x), 2);\n }\n const sy = Math.sqrt(b / (data.length - 2));\n const t = inverseT(CONFIDENCE_LEVEL, data.length - 2);\n return function (x: number) {\n const Y = predict(x);\n const se = sy * Math.sqrt(1 / data.length + Math.pow(x - mean, 2) / a);\n const left = Y - t * se;\n const right = Y + t * se;\n return {x, y: Y, left: isNaN(left) ? Y : left, right: isNaN(right) ? Y : right};\n };\n}\n\nfunction getR2(dots: Dot[]) {\n const n = dots.length;\n return Math.pow(\n (n * sum(dots, (d: Dot) => d.x * d.y) - sum(dots, (d: Dot) => d.x) * sum(dots, (d: Dot) => d.y)) /\n (Math.sqrt(\n n * sum(dots, d => d.x * d.x) -\n Math.pow(\n sum(dots, d => d.x),\n 2\n )\n ) *\n Math.sqrt(\n n * sum(dots, d => d.y * d.y) -\n Math.pow(\n sum(dots, d => d.y),\n 2\n )\n )),\n 2\n );\n}\n\nfunction getVariance(arr: Dot[], getter: (d: Dot) => number) {\n const vMean = mean(arr, getter) as number;\n\n return mean(arr.map(v => (getter(v) - vMean) ** 2)) as number;\n}\n\nfunction getStandardDeviation(arr: Dot[], getter: (d: Dot) => number) {\n return Math.sqrt(getVariance(arr, getter));\n}\n\nfunction getCovariance(arr: Dot[], getterX: (d: Dot) => number, getterY: (d: Dot) => number) {\n const meanX = mean(arr, getterX) as number;\n const meanY = mean(arr, getterY) as number;\n const n = arr.length;\n\n return sum(arr, d => (d.x - meanX) * (d.y - meanY)) / n;\n}\n\nfunction getR(dots: Dot[]) {\n const cov = getCovariance(\n dots,\n d => d.x,\n d => d.y\n );\n const sigmaX = getStandardDeviation(dots, d => d.x);\n const sigmaY = getStandardDeviation(dots, d => d.y);\n\n return cov / (sigmaX * sigmaY);\n}\n\nfunction getPValue(dots: Dot[], predict: (x: number) => number) {\n const n = dots.length;\n const p = 1; // number of coefficients\n const dfm = 1; // degrees of freedom model\n const dfe = n - p - 1; // degrees of freedom error\n const meanY = mean(dots, d => d.y) as number;\n const ssr = sum(dots, d => (predict(d.x) - meanY) ** 2); // sum of squares regression\n const sse = sum(dots, d => (predict(d.x) - d.y) ** 2); // sum of squares errors\n\n const msr = ssr / dfm;\n const mse = sse / dfe;\n\n const f = msr / mse;\n\n const pval = fCDF(f, dfm, dfe);\n\n return 1.0 - pval; // \"greater\" p-value\n}\n\ntype TrendInfo = {\n predict: (x: number) => number;\n getInterval: (x: number) => PointIntervalInfo;\n getArea: (x: ScaleLinear<number, number>, y: ScaleLinear<number, number>, range: number[]) => string;\n color: string | InheritAesScatterplot | ContinuousAesFromColumn<string>;\n data: Row;\n bounded: boolean;\n showStats: boolean;\n xBounds: [number, number];\n stats: {\n r2?: number;\n r?: number;\n pValue?: number;\n coefficients?: {slope: number, intercept: number, slopeError:number, interceptError: number};\n };\n};\nexport type TrendsData = Record<string, TrendInfo[]>;\n\n//dotsByFacets, facetKeys, categoryGroupingCombinations, grouping, trend\nexport function getRegressionData(\n dotsByFacets: GroupedDots,\n facetKeys: string[],\n groupingKeysValues: string[][],\n grouping: ColumnName[],\n trend: ScatterplotSettingsImpl['trend']\n): TrendsData | null {\n if (!trend) {\n return null;\n }\n return facetKeys.reduce((res: TrendsData, facetKey) => {\n const facetDots = dotsByFacets[facetKey].dots;\n res[facetKey] = groupingKeysValues.map(values => {\n const dots = facetDots.filter(dot =>\n grouping.every((column, idx) => String(dot.data[column.value]) === values[idx])\n );\n const [minX = 0, maxX = 0] = extent(dots, (dot: Dot) => dot.x);\n const [slope, intercept] = linearRegression(dots);\n const predict = (x: number) => slope * x + intercept;\n const getInterval = confidenceInterval(dots, predict);\n\n return {\n predict,\n getInterval,\n getArea: (scaleX: ScaleLinear<number, number>, scaleY: ScaleLinear<number, number>, range: number[]) =>\n area<PointIntervalInfo>()\n .x(d => scaleX(d.x))\n .y0(d => scaleY(d.left))\n .y1(d => scaleY(d.right))(range.map(getInterval)) ?? '',\n color: trend.color,\n bounded: trend.bounded,\n data: dots[0].data,\n showStats: true,\n xBounds: [minX, maxX],\n stats: {\n r2: getR2(dots),\n r: getR(dots),\n pValue: getPValue(dots, predict),\n coefficients: getCoefficientsInterval(dots, slope, intercept),\n },\n };\n });\n return res;\n }, {});\n}\n"],"names":["CONFIDENCE_LEVEL","normdev","p","a0","a1","a2","a3","a4","a5","a6","a7","b1","b2","b3","b4","b5","b6","b7","c0","c1","c2","c3","c4","c5","c6","c7","d1","d2","d3","d4","d5","d6","d7","e0","e1","e2","e3","e4","e5","e6","e7","f1","f2","f3","f4","f5","f6","f7","q","r","z","inverseT","df","sin","cos","sqrt","pow","exp","PI","x","y","b","c","d","linearRegression","data","n","sumX","sumY","sumXY","sumX2","i","xi","yi","slope","intercept","getCoefficientsInterval","dots","predict","meanX","sum","t","se_b","dot","slopeError","interceptError","confidenceInterval","mean","a","sy","Y","se","left","right","getR2","getVariance","arr","getter","vMean","v","getStandardDeviation","getCovariance","getterX","getterY","meanY","getR","cov","sigmaX","sigmaY","getPValue","dfm","dfe","ssr","sse","msr","mse","f","fCDF","getRegressionData","dotsByFacets","facetKeys","groupingKeysValues","grouping","trend","res","facetKey","facetDots","values","column","idx","minX","maxX","extent","getInterval","scaleX","scaleY","range","area"],"mappings":"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"}
1
+ {"version":3,"file":"linearRegression.js","sources":["../../src/scatterplot/linearRegression.ts"],"sourcesContent":["import fCDF from '@stdlib/stats-base-dists-f-cdf';\nimport { extent, mean, sum } from 'd3-array';\nimport type { ScaleLinear } from 'd3-scale';\nimport { area } from 'd3-shape';\nimport type { DataFrame } from '../DataFrame';\nimport type { ColumnName, ContinuousAesFromColumn, InheritAesScatterplot } from '../types';\nimport type { Dot, GroupedDots } from './dots';\nimport type { ScatterplotSettingsImpl } from './ScatterplotSettingsImpl';\n\nconst CONFIDENCE_LEVEL = 0.05;\n\n/*\n Returns the normal deviate Z corresponding to a given lower tail area of P; Z is accurate to about 1 part in 10**16.\n\n Wichura, M. J. (1988) Algorithm AS 241: The percentage points of the normal distribution. Applied Statistics, 37, 477–484.\n\n extension of:\n Beasley, J. D./ Springer, S. G. (1977), The percentage points of the NormalDistribution, Applied Statistics. 26, 118–121.\n\n Excel: STANDNORMINV(); R: qnorm()\n */\n\nfunction normdev(p: number) {\n if (p < 0 || p > 1) throw Error('P p < 0 || p > 1 in linear regression calculation');\n if (p == 0) return -Infinity;\n if (p == 1) return Infinity;\n\n /* eslint-disable @typescript-eslint/no-loss-of-precision */\n const a0 = 3.387132872796366608,\n a1 = 1.3314166789178437745e2,\n a2 = 1.9715909503065514427e3,\n a3 = 1.3731693765509461125e4,\n a4 = 4.5921953931549871457e4,\n a5 = 6.7265770927008700853e4,\n a6 = 3.3430575583588128105e4,\n a7 = 2.5090809287301226727e3,\n b1 = 4.2313330701600911252e1,\n b2 = 6.871870074920579083e2,\n b3 = 5.3941960214247511077e3,\n b4 = 2.1213794301586595867e4,\n b5 = 3.930789580009271061e4,\n b6 = 2.8729085735721942674e4,\n b7 = 5.226495278852854561e3,\n c0 = 1.42343711074968357734,\n c1 = 4.6303378461565452959,\n c2 = 5.7694972214606914055,\n c3 = 3.64784832476320460504,\n c4 = 1.27045825245236838258,\n c5 = 2.4178072517745061177e-1,\n c6 = 2.27238449892691845833e-2,\n c7 = 7.7454501427834140764e-4,\n d1 = 2.05319162663775882187,\n d2 = 1.6763848301838038494,\n d3 = 6.8976733498510000455e-1,\n d4 = 1.4810397642748007459e-1,\n d5 = 1.51986665636164571966e-2,\n d6 = 5.475938084995344946e-4,\n d7 = 1.05075007164441684324e-9,\n e0 = 6.6579046435011037772,\n e1 = 5.4637849111641143699,\n e2 = 1.7848265399172913358,\n e3 = 2.9656057182850489123e-1,\n e4 = 2.6532189526576123093e-2,\n e5 = 1.2426609473880784386e-3,\n e6 = 2.71155556874348757815e-5,\n e7 = 2.01033439929228813265e-7,\n f1 = 5.9983220655588793769e-1,\n f2 = 1.3692988092273580531e-1,\n f3 = 1.48753612908506148525e-2,\n f4 = 7.868691311456132591e-4,\n f5 = 1.8463183175100546818e-5,\n f6 = 1.4215117583164458887e-7,\n f7 = 2.04426310338993978564e-15;\n /* eslint-enable @typescript-eslint/no-loss-of-precision */\n\n const q = p - 0.5;\n let r, z;\n\n // p close to 0.5\n if (Math.abs(q) <= 0.425) {\n r = 0.180625 - q * q;\n z =\n (q * (((((((a7 * r + a6) * r + a5) * r + a4) * r + a3) * r + a2) * r + a1) * r + a0)) /\n (((((((b7 * r + b6) * r + b5) * r + b4) * r + b3) * r + b2) * r + b1) * r + 1);\n return z;\n }\n\n if (q > 0) r = 1 - p;\n else r = p;\n r = Math.sqrt(-Math.log(r));\n\n // p neither close to 0.5 nor 0 or 1\n if (r <= 5) {\n r += -1.6;\n z =\n (((((((c7 * r + c6) * r + c5) * r + c4) * r + c3) * r + c2) * r + c1) * r + c0) /\n (((((((d7 * r + d6) * r + d5) * r + d4) * r + d3) * r + d2) * r + d1) * r + 1);\n }\n // p near 0 or 1\n else {\n r += -5;\n z =\n (((((((e7 * r + e6) * r + e5) * r + e4) * r + e3) * r + e2) * r + e1) * r + e0) /\n (((((((f7 * r + f6) * r + f5) * r + f4) * r + f3) * r + f2) * r + f1) * r + 1);\n }\n\n if (q < 0.0) z = -z;\n return z;\n}\n\n/*\nHill's approximated inverse t-distribution calculates t given df and two-tail probability:\nHill, G. W. (1970), Algorithm 396: Student's t-quantiles. Communications of the ACM, 13(10), 619–620.\n\nResult should be \"correct to at least 6 significant digits even for the analytic continuation through noninteger values of n > 5\". For higher precision (used in R, ...) see:\nHill, G. W. (1981) Remark on Algorithm 396, ACM Transactions on Mathematical Software, 7, 250–1.\n\nExcel: TINV(); R: qt()\n*/\nfunction inverseT(p: number, df: number) {\n const {sin, cos, sqrt, pow, exp, PI} = Math;\n let x: number, y: number;\n\n if (df == 1) return cos((p * PI) / 2) / sin((p * PI) / 2);\n if (df == 2) return sqrt(2 / (p * (2 - p)) - 2);\n\n const a = 1 / (df - 0.5);\n const b = 48 / (a * a);\n let c = (((20700 * a) / b - 98) * a - 16) * a + 96.36;\n const d = ((94.5 / (b + c) - 3) / b + 1) * sqrt(a * PI * 0.5) * df;\n x = d * p;\n y = pow(x, 2 / df);\n\n if (y > 0.05 + a) {\n // The procedure normdev(p) is assumed to return a negative normal\n // deviate at the lower tail probability level p, e.g. -2.32 for p = 0.01.\n x = normdev(p / 2);\n y = x * x;\n if (df < 5) c = c + 0.3 * (df - 4.5) * (x + 0.6);\n c = (((0.05 * d * x - 5) * x - 7) * x - 2) * x + b + c;\n y = (((((0.4 * y + 6.3) * y + 36) * y + 94.5) / c - y - 3) / b + 1) * x;\n y = a * y * y;\n if (y > 0.002) y = exp(y) - 1;\n else y = 0.5 * y * y + y;\n } else {\n y =\n (((1 / (((df + 6) / (df * y) - 0.089 * d - 0.822) * (df + 2) * 3) + 0.5 / (df + 4)) * y - 1) * (df + 1)) /\n (df + 2) +\n 1 / y;\n }\n\n return sqrt(df * y);\n}\n\nexport function linearRegression(data: {x: number; y: number}[]): [number, number] {\n let n = data.length,\n sumX = 0,\n sumY = 0,\n sumXY = 0,\n sumX2 = 0;\n for (let i = 0; i < data.length; ++i) {\n const xi = data[i].x;\n const yi = data[i].y;\n if (!Number.isFinite(xi) || !Number.isFinite(yi)) {\n --n;\n continue;\n }\n sumX += xi;\n sumY += yi;\n sumXY += xi * yi;\n sumX2 += xi * xi;\n }\n const slope = (n * sumXY - sumX * sumY) / (n * sumX2 - sumX * sumX);\n const intercept = (sumY - slope * sumX) / n;\n\n return [slope, intercept];\n}\n\nfunction getCoefficientsInterval(dots: Dot[], slope: number, intercept: number) {\n const predict = (x: number) => x * slope + intercept;\n const n = dots.length;\n const meanX = sum(dots, d => d.x) / dots.length;\n const t = inverseT(CONFIDENCE_LEVEL, n - 2);\n\n const se_b = Math.sqrt(\n sum(dots, dot => (dot.y - predict(dot.x)) ** 2) / (n - 2) / sum(dots, dot => (dot.x - meanX) ** 2)\n );\n const slopeError = se_b * t;\n\n const se_a = se_b * Math.sqrt(sum(dots, dot => dot.x ** 2) / n);\n const interceptError = se_a * t;\n\n return {slope, intercept, slopeError, interceptError};\n}\n\nexport type PointIntervalInfo = {\n x: number; y: number, left: number; right: number\n}\n// https://stats.stackexchange.com/questions/101318/understanding-shape-and-calculation-of-confidence-bands-in-linear-regression\nexport function confidenceInterval(\n data: {x: number; y: number}[],\n predict: (x: number) => number\n): (x: number) => PointIntervalInfo {\n const mean = sum(data, d => d.x) / data.length;\n let a = 0,\n b = 0;\n for (let i = 0; i < data.length; ++i) {\n a += Math.pow(data[i].x - mean, 2);\n b += Math.pow(data[i].y - predict(data[i].x), 2);\n }\n const sy = Math.sqrt(b / (data.length - 2));\n const t = inverseT(CONFIDENCE_LEVEL, data.length - 2);\n return function (x: number) {\n const Y = predict(x);\n const se = sy * Math.sqrt(1 / data.length + Math.pow(x - mean, 2) / a);\n const left = Y - t * se;\n const right = Y + t * se;\n return {x, y: Y, left: isNaN(left) ? Y : left, right: isNaN(right) ? Y : right};\n };\n}\n\nfunction getR2(dots: Dot[]) {\n const n = dots.length;\n return Math.pow(\n (n * sum(dots, (d: Dot) => d.x * d.y) - sum(dots, (d: Dot) => d.x) * sum(dots, (d: Dot) => d.y)) /\n (Math.sqrt(\n n * sum(dots, d => d.x * d.x) -\n Math.pow(\n sum(dots, d => d.x),\n 2\n )\n ) *\n Math.sqrt(\n n * sum(dots, d => d.y * d.y) -\n Math.pow(\n sum(dots, d => d.y),\n 2\n )\n )),\n 2\n );\n}\n\nfunction getVariance(arr: Dot[], getter: (d: Dot) => number) {\n const vMean = mean(arr, getter) as number;\n\n return mean(arr.map(v => (getter(v) - vMean) ** 2)) as number;\n}\n\nfunction getStandardDeviation(arr: Dot[], getter: (d: Dot) => number) {\n return Math.sqrt(getVariance(arr, getter));\n}\n\nfunction getCovariance(arr: Dot[], getterX: (d: Dot) => number, getterY: (d: Dot) => number) {\n const meanX = mean(arr, getterX) as number;\n const meanY = mean(arr, getterY) as number;\n const n = arr.length;\n\n return sum(arr, d => (d.x - meanX) * (d.y - meanY)) / n;\n}\n\nfunction getR(dots: Dot[]) {\n const cov = getCovariance(\n dots,\n d => d.x,\n d => d.y\n );\n const sigmaX = getStandardDeviation(dots, d => d.x);\n const sigmaY = getStandardDeviation(dots, d => d.y);\n\n return cov / (sigmaX * sigmaY);\n}\n\nfunction getPValue(dots: Dot[], predict: (x: number) => number) {\n const n = dots.length;\n const p = 1; // number of coefficients\n const dfm = 1; // degrees of freedom model\n const dfe = n - p - 1; // degrees of freedom error\n const meanY = mean(dots, d => d.y) as number;\n const ssr = sum(dots, d => (predict(d.x) - meanY) ** 2); // sum of squares regression\n const sse = sum(dots, d => (predict(d.x) - d.y) ** 2); // sum of squares errors\n\n const msr = ssr / dfm;\n const mse = sse / dfe;\n\n const f = msr / mse;\n\n const pval = fCDF(f, dfm, dfe);\n\n return 1.0 - pval; // \"greater\" p-value\n}\n\ntype TrendInfo = {\n idx: number;\n predict: (x: number) => number;\n getInterval: (x: number) => PointIntervalInfo;\n getArea: (x: ScaleLinear<number, number>, y: ScaleLinear<number, number>, range: number[]) => string;\n color: string | InheritAesScatterplot | ContinuousAesFromColumn<string>;\n bounded: boolean;\n showStats: boolean;\n xBounds: [number, number];\n stats: {\n r2?: number;\n r?: number;\n pValue?: number;\n coefficients?: {slope: number, intercept: number, slopeError:number, interceptError: number};\n };\n};\nexport type TrendsData = Record<string, TrendInfo[]>;\n\nexport function getRegressionData(\n dataFrame: DataFrame,\n dotsByFacets: GroupedDots,\n facetKeys: string[],\n groupingKeysValues: string[][],\n grouping: ColumnName[],\n trend: ScatterplotSettingsImpl['trend']\n): TrendsData | null {\n if (!trend) {\n return null;\n }\n return facetKeys.reduce((res: TrendsData, facetKey) => {\n const facetDots = dotsByFacets[facetKey].dots;\n \n res[facetKey] = groupingKeysValues\n .map(values => {\n const dots = facetDots.filter(dot =>\n grouping.every((column, idx) => String(dataFrame.getColumnValue(column.value, dot.idx)) === values[idx])\n );\n\n if (dots.length === 0) return null;\n\n const [minX = 0, maxX = 0] = extent(dots, (dot: Dot) => dot.x);\n const [slope, intercept] = linearRegression(dots);\n const predict = (x: number) => slope * x + intercept;\n const getInterval = confidenceInterval(dots, predict);\n\n return {\n idx: dots[0].idx,\n predict,\n getInterval,\n getArea: (scaleX: ScaleLinear<number, number>, scaleY: ScaleLinear<number, number>, range: number[]) =>\n area<PointIntervalInfo>()\n .x(d => scaleX(d.x))\n .y0(d => scaleY(d.left))\n .y1(d => scaleY(d.right))(range.map(getInterval)) ?? '',\n color: trend.color,\n bounded: trend.bounded,\n showStats: true,\n xBounds: [minX, maxX],\n stats: {\n r2: getR2(dots),\n r: getR(dots),\n pValue: getPValue(dots, predict),\n coefficients: getCoefficientsInterval(dots, slope, intercept),\n },\n };\n })\n .filter((item) => item !== null) as TrendInfo[];\n \n return res;\n }, {});\n}\n"],"names":["CONFIDENCE_LEVEL","normdev","p","a0","a1","a2","a3","a4","a5","a6","a7","b1","b2","b3","b4","b5","b6","b7","c0","c1","c2","c3","c4","c5","c6","c7","d1","d2","d3","d4","d5","d6","d7","e0","e1","e2","e3","e4","e5","e6","e7","f1","f2","f3","f4","f5","f6","f7","q","r","z","inverseT","df","sin","cos","sqrt","pow","exp","PI","x","y","a","b","c","d","linearRegression","data","n","sumX","sumY","sumXY","sumX2","xi","yi","slope","intercept","getCoefficientsInterval","dots","predict","meanX","sum","t","se_b","dot","slopeError","interceptError","confidenceInterval","mean","i","sy","Y","se","left","right","getR2","getVariance","arr","getter","vMean","v","getStandardDeviation","getCovariance","getterX","getterY","meanY","getR","cov","sigmaX","sigmaY","getPValue","dfm","dfe","ssr","sse","msr","mse","f","fCDF","getRegressionData","dataFrame","dotsByFacets","facetKeys","groupingKeysValues","grouping","trend","res","facetKey","facetDots","values","column","idx","minX","maxX","extent","getInterval","scaleX","scaleY","range","area","item"],"mappings":"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"}
@@ -1,3 +1,4 @@
1
- import { AesItem, ContinuousAesFromColumn, InheritAesScatterplot, LineShape, PointShape, Row, ScatterplotLegendInfo } from '../../types';
2
- export declare function createAesGetter<ValueType extends string | number | PointShape | LineShape>(legendInfo: ScatterplotLegendInfo, aesItem: ValueType | ContinuousAesFromColumn<ValueType> | InheritAesScatterplot, field: keyof AesItem): (row: Row) => ValueType;
1
+ import { DataFrame } from '../../DataFrame';
2
+ import { AesItem, ContinuousAesFromColumn, InheritAesScatterplot, LineShape, PointShape, ScatterplotLegendInfo } from '../../types';
3
+ export declare function createAesGetter<ValueType extends string | number | PointShape | LineShape>(dataFrame: DataFrame, legendInfo: ScatterplotLegendInfo, aesItem: ValueType | ContinuousAesFromColumn<ValueType> | InheritAesScatterplot, field: keyof AesItem): (rowIndex: number) => ValueType;
3
4
  //# sourceMappingURL=createAesGetter.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"createAesGetter.d.ts","sourceRoot":"","sources":["../../../src/scatterplot/utils/createAesGetter.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EACR,OAAO,EACP,uBAAuB,EACvB,qBAAqB,EACrB,SAAS,EACT,UAAU,EAAE,GAAG,EACf,qBAAqB,EACxB,MAAM,aAAa,CAAC;AASrB,wBAAgB,eAAe,CAAC,SAAS,SAAS,MAAM,GAAG,MAAM,GAAG,UAAU,GAAG,SAAS,EACtF,UAAU,EAAE,qBAAqB,EACjC,OAAO,EAAE,SAAS,GAAG,uBAAuB,CAAC,SAAS,CAAC,GAAG,qBAAqB,EAC/E,KAAK,EAAE,MAAM,OAAO,SAOI,GAAG,KAEgB,SAAS,CAsBvD"}
1
+ {"version":3,"file":"createAesGetter.d.ts","sourceRoot":"","sources":["../../../src/scatterplot/utils/createAesGetter.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAC;AACjD,OAAO,KAAK,EACR,OAAO,EACP,uBAAuB,EACvB,qBAAqB,EACrB,SAAS,EACT,UAAU,EACV,qBAAqB,EACxB,MAAM,aAAa,CAAC;AAQrB,wBAAgB,eAAe,CAAC,SAAS,SAAS,MAAM,GAAG,MAAM,GAAG,UAAU,GAAG,SAAS,EACtF,SAAS,EAAE,SAAS,EACpB,UAAU,EAAE,qBAAqB,EACjC,OAAO,EAAE,SAAS,GAAG,uBAAuB,CAAC,SAAS,CAAC,GAAG,qBAAqB,EAC/E,KAAK,EAAE,MAAM,OAAO,cAOU,MAAM,KAEO,SAAS,CAuBvD"}
@@ -1,4 +1,3 @@
1
- import { DEFAULT_DOT_AES as p, DEFAULT_COMMON_AES as a } from "../constants.js";
2
1
  import { isContinuousAes as m } from "../../types/common.js";
3
2
  import "../../types/discrete.js";
4
3
  import "../../types/scatterplot.js";
@@ -6,36 +5,37 @@ import "../../types/heatmap.js";
6
5
  import "../../types/dendro.js";
7
6
  import "../../types/histogram.js";
8
7
  import "../../types/bubble.js";
9
- import { getContinuousColorScale as f } from "../../utils/getContinuousColorScale.js";
10
- import { sqrt as s } from "../../node_modules/d3-scale/src/pow.js";
11
- function A(n) {
12
- return typeof n == "object" && n !== null && "type" in n && "value" in n && n.type === "grouping";
8
+ import { getContinuousColorScale as a } from "../../utils/getContinuousColorScale.js";
9
+ import { DEFAULT_DOT_AES as g, DEFAULT_COMMON_AES as s } from "../constants.js";
10
+ import { sqrt as f } from "../../node_modules/d3-scale/src/pow.js";
11
+ function C(o) {
12
+ return typeof o == "object" && o !== null && "type" in o && "value" in o && o.type === "grouping";
13
13
  }
14
- function D(n, o, e) {
15
- if (m(o) && e === "dotSize") {
16
- const { domain: t, range: r } = o, u = s().domain(t).range(r);
17
- return function(i) {
18
- const c = u(Number(i[o.columnName.value]));
14
+ function T(o, p, n, t) {
15
+ if (m(n) && t === "dotSize") {
16
+ const { domain: r, range: u } = n, i = f().domain(r).range(u);
17
+ return function(e) {
18
+ const c = i(Number(o.getColumnValue(n.columnName.value, e)));
19
19
  return Math.max(1, c);
20
20
  };
21
21
  }
22
- if (m(o) && (e === "dotFill" || e === "lineColor")) {
23
- const { domain: t, range: r, type: u = "linear" } = o, i = f(r, t, u);
22
+ if (m(n) && (t === "dotFill" || t === "lineColor")) {
23
+ const { domain: r, range: u, type: i = "linear" } = n, e = a(u, r, i);
24
24
  return function(c) {
25
- const l = c[o.columnName.value];
26
- return l === null ? p.color : i(Number(l));
25
+ const l = o.getColumnValue(n.columnName.value, c);
26
+ return l === null ? g.color : e(Number(l));
27
27
  };
28
28
  }
29
- if (A(o)) {
30
- const t = o.value, r = n[t].aesMap;
31
- return function(u) {
32
- var i;
33
- return (i = (r == null ? void 0 : r[String(u[t])]) ?? a) == null ? void 0 : i[e];
29
+ if (C(n)) {
30
+ const r = n.value, u = p[r].aesMap;
31
+ return function(i) {
32
+ const e = o.getColumnValueCategory(r, i);
33
+ return u(e, t) ?? s[t];
34
34
  };
35
35
  }
36
- return () => o;
36
+ return () => n;
37
37
  }
38
38
  export {
39
- D as createAesGetter
39
+ T as createAesGetter
40
40
  };
41
41
  //# sourceMappingURL=createAesGetter.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"createAesGetter.js","sources":["../../../src/scatterplot/utils/createAesGetter.ts"],"sourcesContent":["import {DEFAULT_COMMON_AES, DEFAULT_DOT_AES} from '../constants';\nimport type {\n AesItem,\n ContinuousAesFromColumn,\n InheritAesScatterplot,\n LineShape,\n PointShape, Row,\n ScatterplotLegendInfo\n} from '../../types';\nimport {isContinuousAes} from '../../types';\nimport {getContinuousColorScale} from '../../utils/getContinuousColorScale';\nimport type {ScalePower} from 'd3-scale';\nimport {scaleSqrt} from 'd3-scale';\n\nfunction isInheritedAes(v: InheritAesScatterplot | unknown): v is InheritAesScatterplot {\n return typeof v === 'object' && v !== null && 'type' in v && 'value' in v && v.type === 'grouping';\n}\nexport function createAesGetter<ValueType extends string | number | PointShape | LineShape>(\n legendInfo: ScatterplotLegendInfo,\n aesItem: ValueType | ContinuousAesFromColumn<ValueType> | InheritAesScatterplot,\n field: keyof AesItem\n) {\n if (isContinuousAes<ValueType>(aesItem) && field === 'dotSize') {\n const {domain, range} = aesItem;\n const scale: ScalePower<number, number> = scaleSqrt<number, number>()\n .domain(domain)\n .range(range as number[]);\n return function(row:Row) {\n const v = scale(Number(row[aesItem.columnName.value]));\n return Math.max(1, v as number) as ValueType;\n };\n }\n if (isContinuousAes<ValueType>(aesItem) && (field === 'dotFill' || field === 'lineColor')) {\n const {domain, range, type = 'linear'} = aesItem;\n const scale = getContinuousColorScale(range as string[], domain, type);\n return function(row:Row) {\n const v = row[aesItem.columnName.value];\n if (v === null) {\n return DEFAULT_DOT_AES.color as ValueType;\n }\n return scale(Number(v)) as ValueType;\n };\n }\n if (isInheritedAes(aesItem)) {\n const columnId = aesItem.value;\n const mapping = legendInfo[columnId].aesMap;\n return function(row:Row) {\n return (mapping?.[String(row[columnId])] ?? DEFAULT_COMMON_AES)?.[field] as ValueType;\n };\n }\n return () => aesItem as ValueType;\n}\n"],"names":["isInheritedAes","v","createAesGetter","legendInfo","aesItem","field","isContinuousAes","domain","range","scale","scaleSqrt","row","type","getContinuousColorScale","DEFAULT_DOT_AES","columnId","mapping","_a","DEFAULT_COMMON_AES"],"mappings":";;;;;;;;;;AAcA,SAASA,EAAeC,GAAgE;AACpF,SAAO,OAAOA,KAAM,YAAYA,MAAM,QAAQ,UAAUA,KAAK,WAAWA,KAAKA,EAAE,SAAS;AAC5F;AACO,SAASC,EACZC,GACAC,GACAC,GACF;AACE,MAAIC,EAA2BF,CAAO,KAAKC,MAAU,WAAW;AAC5D,UAAM,EAAC,QAAAE,GAAQ,OAAAC,EAAA,IAASJ,GAClBK,IAAoCC,IACrC,OAAOH,CAAM,EACb,MAAMC,CAAiB;AAC5B,WAAO,SAASG,GAAS;AACrB,YAAMV,IAAIQ,EAAM,OAAOE,EAAIP,EAAQ,WAAW,KAAK,CAAC,CAAC;AACrD,aAAO,KAAK,IAAI,GAAGH,CAAW;AAAA,IAClC;AAAA,EACJ;AACA,MAAIK,EAA2BF,CAAO,MAAMC,MAAU,aAAaA,MAAU,cAAc;AACvF,UAAM,EAAC,QAAAE,GAAQ,OAAAC,GAAO,MAAAI,IAAO,aAAYR,GACnCK,IAAQI,EAAwBL,GAAmBD,GAAQK,CAAI;AACrE,WAAO,SAASD,GAAS;AACrB,YAAMV,IAAIU,EAAIP,EAAQ,WAAW,KAAK;AACtC,aAAIH,MAAM,OACCa,EAAgB,QAEpBL,EAAM,OAAOR,CAAC,CAAC;AAAA,IAC1B;AAAA,EACJ;AACA,MAAID,EAAeI,CAAO,GAAG;AACzB,UAAMW,IAAWX,EAAQ,OACnBY,IAAUb,EAAWY,CAAQ,EAAE;AACrC,WAAO,SAASJ,GAAS;;AACrB,cAAQM,KAAAD,KAAA,gBAAAA,EAAU,OAAOL,EAAII,CAAQ,CAAC,OAAMG,MAApC,gBAAAD,EAA0DZ;AAAA,IACtE;AAAA,EACJ;AACA,SAAO,MAAMD;AACjB;"}
1
+ {"version":3,"file":"createAesGetter.js","sources":["../../../src/scatterplot/utils/createAesGetter.ts"],"sourcesContent":["import type { ScalePower } from 'd3-scale';\nimport { scaleSqrt } from 'd3-scale';\nimport type { DataFrame } from '../../DataFrame';\nimport type {\n AesItem,\n ContinuousAesFromColumn,\n InheritAesScatterplot,\n LineShape,\n PointShape,\n ScatterplotLegendInfo\n} from '../../types';\nimport { isContinuousAes } from '../../types';\nimport { getContinuousColorScale } from '../../utils/getContinuousColorScale';\nimport { DEFAULT_COMMON_AES, DEFAULT_DOT_AES } from '../constants';\n\nfunction isInheritedAes(v: InheritAesScatterplot | unknown): v is InheritAesScatterplot {\n return typeof v === 'object' && v !== null && 'type' in v && 'value' in v && v.type === 'grouping';\n}\nexport function createAesGetter<ValueType extends string | number | PointShape | LineShape>(\n dataFrame: DataFrame,\n legendInfo: ScatterplotLegendInfo,\n aesItem: ValueType | ContinuousAesFromColumn<ValueType> | InheritAesScatterplot,\n field: keyof AesItem\n) {\n if (isContinuousAes<ValueType>(aesItem) && field === 'dotSize') {\n const {domain, range} = aesItem;\n const scale: ScalePower<number, number> = scaleSqrt<number, number>()\n .domain(domain)\n .range(range as number[]);\n return function(rowIndex: number) {\n const v = scale(Number(dataFrame.getColumnValue(aesItem.columnName.value, rowIndex)));\n return Math.max(1, v as number) as ValueType;\n };\n }\n if (isContinuousAes<ValueType>(aesItem) && (field === 'dotFill' || field === 'lineColor')) {\n const {domain, range, type = 'linear'} = aesItem;\n const scale = getContinuousColorScale(range as string[], domain, type);\n return function(rowIndex: number) {\n const v = dataFrame.getColumnValue(aesItem.columnName.value, rowIndex);\n if (v === null) {\n return DEFAULT_DOT_AES.color as ValueType;\n }\n return scale(Number(v)) as ValueType;\n };\n }\n if (isInheritedAes(aesItem)) {\n const columnId = aesItem.value;\n const mapping = legendInfo[columnId].aesMap;\n return function(rowIndex: number) {\n const category = dataFrame.getColumnValueCategory(columnId, rowIndex);\n return (mapping(category, field) ?? DEFAULT_COMMON_AES[field]) as ValueType;\n };\n }\n return () => aesItem as ValueType;\n}\n"],"names":["isInheritedAes","v","createAesGetter","dataFrame","legendInfo","aesItem","field","isContinuousAes","domain","range","scale","scaleSqrt","rowIndex","type","getContinuousColorScale","DEFAULT_DOT_AES","columnId","mapping","category","DEFAULT_COMMON_AES"],"mappings":";;;;;;;;;;AAeA,SAASA,EAAeC,GAAgE;AACpF,SAAO,OAAOA,KAAM,YAAYA,MAAM,QAAQ,UAAUA,KAAK,WAAWA,KAAKA,EAAE,SAAS;AAC5F;AACO,SAASC,EACZC,GACAC,GACAC,GACAC,GACF;AACE,MAAIC,EAA2BF,CAAO,KAAKC,MAAU,WAAW;AAC5D,UAAM,EAAC,QAAAE,GAAQ,OAAAC,EAAA,IAASJ,GAClBK,IAAoCC,IACrC,OAAOH,CAAM,EACb,MAAMC,CAAiB;AAC5B,WAAO,SAASG,GAAkB;AAC9B,YAAMX,IAAIS,EAAM,OAAOP,EAAU,eAAeE,EAAQ,WAAW,OAAOO,CAAQ,CAAC,CAAC;AACpF,aAAO,KAAK,IAAI,GAAGX,CAAW;AAAA,IAClC;AAAA,EACJ;AACA,MAAIM,EAA2BF,CAAO,MAAMC,MAAU,aAAaA,MAAU,cAAc;AACvF,UAAM,EAAC,QAAAE,GAAQ,OAAAC,GAAO,MAAAI,IAAO,aAAYR,GACnCK,IAAQI,EAAwBL,GAAmBD,GAAQK,CAAI;AACrE,WAAO,SAASD,GAAkB;AAC9B,YAAMX,IAAIE,EAAU,eAAeE,EAAQ,WAAW,OAAOO,CAAQ;AACrE,aAAIX,MAAM,OACCc,EAAgB,QAEpBL,EAAM,OAAOT,CAAC,CAAC;AAAA,IAC1B;AAAA,EACJ;AACA,MAAID,EAAeK,CAAO,GAAG;AACzB,UAAMW,IAAWX,EAAQ,OACnBY,IAAUb,EAAWY,CAAQ,EAAE;AACrC,WAAO,SAASJ,GAAkB;AAC9B,YAAMM,IAAWf,EAAU,uBAAuBa,GAAUJ,CAAQ;AACpE,aAAQK,EAAQC,GAAUZ,CAAK,KAAKa,EAAmBb,CAAK;AAAA,IAChE;AAAA,EACJ;AACA,SAAO,MAAMD;AACjB;"}
@@ -1,14 +1,6 @@
1
1
  import { DataFrame } from '../../DataFrame';
2
+ import { AesItem, Category, ColumnName, ScatterplotLayer, ScatterplotLegendInfo } from '../../types';
2
3
  import { ScatterplotSettingsImpl } from '../ScatterplotSettingsImpl';
3
- import { AesItem, ColumnName, ScatterplotLayer, ScatterplotLegendInfo } from '../../types';
4
- export declare function addPalettesToAesMapping(uniqueValues: string[], usedAesFromPalettes: Partial<Record<keyof AesItem, string[]>>, inheritedAes?: ScatterplotSettingsImpl['inheritedAes'][string]): Record<string, {
5
- dotFill?: string | undefined;
6
- dotShape?: "0" | "1" | "2" | "3" | "4" | "5" | "6" | "7" | "8" | "9" | "10" | "11" | "12" | "13" | "14" | "15" | "16" | "17" | "18" | "20" | "21" | "22" | "23" | "24" | "25" | undefined;
7
- dotSize?: number | undefined;
8
- lineWidth?: number | undefined;
9
- lineShape?: "solid" | "dashed" | "dotted" | "dotdash" | "longdash" | "twodash" | undefined;
10
- lineColor?: string | undefined;
11
- fillColor?: string | undefined;
12
- }>;
4
+ export declare function addPalettesToAesMapping(columnName: ColumnName, usedAesFromPalettes: Partial<Record<keyof AesItem, string[]>>, inheritedAes?: ScatterplotSettingsImpl['inheritedAes'][string]): (category: Category, field: keyof AesItem) => string | number | undefined;
13
5
  export declare function createLegendInfo(data: DataFrame, grouping: ColumnName[], layers: ScatterplotLayer[], inheritedAes: ScatterplotSettingsImpl['inheritedAes']): ScatterplotLegendInfo;
14
6
  //# sourceMappingURL=createLegendInfo.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"createLegendInfo.d.ts","sourceRoot":"","sources":["../../../src/scatterplot/utils/createLegendInfo.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAC,SAAS,EAAC,MAAM,iBAAiB,CAAC;AAC/C,OAAO,KAAK,EAAC,uBAAuB,EAAC,MAAM,4BAA4B,CAAC;AACxE,OAAO,KAAK,EACR,OAAO,EACP,UAAU,EAIV,gBAAgB,EAChB,qBAAqB,EACxB,MAAM,aAAa,CAAC;AAGrB,wBAAgB,uBAAuB,CACnC,YAAY,EAAE,MAAM,EAAE,EACtB,mBAAmB,EAAE,OAAO,CAAC,MAAM,CAAC,MAAM,OAAO,EAAE,MAAM,EAAE,CAAC,CAAC,EAC7D,YAAY,CAAC,EAAE,uBAAuB,CAAC,cAAc,CAAC,CAAC,MAAM,CAAC;;;;;;;;GAoBjE;AAKD,wBAAgB,gBAAgB,CAC5B,IAAI,EAAE,SAAS,EACf,QAAQ,EAAE,UAAU,EAAE,EACtB,MAAM,EAAE,gBAAgB,EAAE,EAC1B,YAAY,EAAE,uBAAuB,CAAC,cAAc,CAAC,GACtD,qBAAqB,CA2CvB"}
1
+ {"version":3,"file":"createLegendInfo.d.ts","sourceRoot":"","sources":["../../../src/scatterplot/utils/createLegendInfo.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAC;AACjD,OAAO,KAAK,EACR,OAAO,EACP,QAAQ,EACR,UAAU,EAGV,gBAAgB,EAChB,qBAAqB,EACxB,MAAM,aAAa,CAAC;AACrB,OAAO,KAAK,EAAE,uBAAuB,EAAE,MAAM,4BAA4B,CAAC;AAyB1E,wBAAgB,uBAAuB,CACnC,UAAU,EAAE,UAAU,EACtB,mBAAmB,EAAE,OAAO,CAAC,MAAM,CAAC,MAAM,OAAO,EAAE,MAAM,EAAE,CAAC,CAAC,EAC7D,YAAY,CAAC,EAAE,uBAAuB,CAAC,cAAc,CAAC,CAAC,MAAM,CAAC,cAQ/B,QAAQ,SAAS,MAAM,OAAO,iCAchE;AAKD,wBAAgB,gBAAgB,CAC5B,IAAI,EAAE,SAAS,EACf,QAAQ,EAAE,UAAU,EAAE,EACtB,MAAM,EAAE,gBAAgB,EAAE,EAC1B,YAAY,EAAE,uBAAuB,CAAC,cAAc,CAAC,GACtD,qBAAqB,CA4CvB"}
@@ -1,50 +1,57 @@
1
- import { MAX_SHOWN_UNIQUE_VALUES_IN_LABELS as b } from "../../constants.js";
2
- import L from "../../node_modules/lodash/lodash.js";
3
- function C(o, l, p) {
4
- const f = p ?? {};
5
- return Object.keys(l).length ? o.reduce((r, e, a) => {
6
- if (r[e] || (r[e] = {}), l.dotFill) {
7
- const t = l.dotFill;
8
- r[e].dotFill = t[a % (t == null ? void 0 : t.length)];
1
+ import { MAX_SHOWN_UNIQUE_VALUES_IN_LABELS as v } from "../../constants.js";
2
+ const h = /* @__PURE__ */ (() => {
3
+ const t = /* @__PURE__ */ new Map();
4
+ return {
5
+ clear: () => t.clear(),
6
+ getIndex: (g, o) => {
7
+ let e = t.get(g.value);
8
+ e === void 0 && (e = /* @__PURE__ */ new Map(), t.set(g.value, e));
9
+ let r = e.get(o);
10
+ return r === void 0 && (r = e.size, e.set(o, r)), r;
9
11
  }
10
- if (l.lineColor) {
11
- const t = l.lineColor;
12
- r[e].lineColor = t[a % (t == null ? void 0 : t.length)];
13
- }
14
- return r;
15
- }, f) : f;
12
+ };
13
+ })();
14
+ function C(t, c, u) {
15
+ h.clear();
16
+ const g = u && Object.keys(u).length > 0, o = c.dotFill, e = o && o.length > 0, r = c.lineColor, d = r && r.length > 0;
17
+ return (s, a) => {
18
+ var l;
19
+ const n = g ? (l = u[s]) == null ? void 0 : l[a] : void 0;
20
+ return a === "dotFill" && e ? o[h.getIndex(t, s) % o.length] ?? n : a === "lineColor" && d ? r[h.getIndex(t, s) % r.length] ?? n : n;
21
+ };
16
22
  }
17
- function S(o) {
18
- return typeof o == "object" && "type" in o && o.type === "grouping";
23
+ function I(t) {
24
+ return typeof t == "object" && "type" in t && t.type === "grouping";
19
25
  }
20
- function y(o, l, p, f) {
21
- return l.reduce((r, e) => {
22
- const a = (i) => String(i[e.value]), t = (i) => e.valueLabels ? String(i[e.valueLabels]) : a(i), d = /* @__PURE__ */ new Set(), h = {};
23
- p.forEach((i) => {
24
- i.aes && Object.entries(i.aes).forEach(([s, n]) => {
25
- S(n) && n.value === e.value && (d.add(s), n.palette && (h[s] = n.palette));
26
+ function L(t, c, u, g) {
27
+ return c.reduce((o, e) => {
28
+ const r = (n) => e.valueLabels ? t.getColumnValueCategory(e.valueLabels, n) : void 0, d = /* @__PURE__ */ new Set(), f = {};
29
+ u.forEach((n) => {
30
+ n.aes && Object.entries(n.aes).forEach(([l, i]) => {
31
+ I(i) && i.value === e.value && (d.add(l), f[l] = i.palette);
26
32
  });
27
33
  });
28
- let u = {}, c = [];
29
- if (d.has("dotFill")) {
30
- const i = o.getColumnCategories(e.value);
31
- if (i.length > b)
32
- c = i, u = {};
33
- else {
34
- const s = L.uniqBy(o.rows, (n) => n[e.value]);
35
- u = s.reduce((n, g) => (n[a(g)] = t(g), n), {}), c = s.map(a).sort((n, g) => u[n].localeCompare(u[g], "en", { numeric: !0 }));
36
- }
34
+ let s = {}, a = [];
35
+ if (d.has("dotFill") || d.has("dotShape")) {
36
+ const n = t.getColumnCategories(e.value);
37
+ n.length < v ? (s = n.reduce((l, i) => {
38
+ const p = t.getColumnCategoryRowIndex(e.value, i);
39
+ return l[i] = r(p) ?? i, l;
40
+ }, s), a = n.sort((l, i) => {
41
+ var p;
42
+ return ((p = s[l]) == null ? void 0 : p.localeCompare(s[i] ?? "", "en", { numeric: !0 })) ?? 0;
43
+ })) : a = n;
37
44
  }
38
- return r[e.value] = {
39
- values: c,
45
+ return o[e.value] = {
46
+ values: a,
40
47
  usedAes: [...d],
41
- aesMap: C(c, h, f[e.value]),
42
- labels: u
43
- }, r;
48
+ aesMap: C(e, f, g[e.value]),
49
+ labels: s
50
+ }, o;
44
51
  }, {});
45
52
  }
46
53
  export {
47
54
  C as addPalettesToAesMapping,
48
- y as createLegendInfo
55
+ L as createLegendInfo
49
56
  };
50
57
  //# sourceMappingURL=createLegendInfo.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"createLegendInfo.js","sources":["../../../src/scatterplot/utils/createLegendInfo.ts"],"sourcesContent":["import {MAX_SHOWN_UNIQUE_VALUES_IN_LABELS} from '../../constants';\nimport type {DataFrame} from '../../DataFrame';\nimport type {ScatterplotSettingsImpl} from '../ScatterplotSettingsImpl';\nimport type {\n AesItem,\n ColumnName,\n ContinuousAesFromColumn,\n InheritAesScatterplot,\n Row,\n ScatterplotLayer,\n ScatterplotLegendInfo,\n} from '../../types';\nimport lodash from 'lodash';\n\nexport function addPalettesToAesMapping(\n uniqueValues: string[],\n usedAesFromPalettes: Partial<Record<keyof AesItem, string[]>>,\n inheritedAes?: ScatterplotSettingsImpl['inheritedAes'][string],\n) {\n const result = inheritedAes ?? {};\n if (!Object.keys(usedAesFromPalettes).length) {\n return result;\n }\n return uniqueValues.reduce((res:Record<string, AesItem>, value, idx) => {\n if (!res[value]) {\n res[value] = {};\n }\n if (usedAesFromPalettes['dotFill']) {\n const palette = usedAesFromPalettes['dotFill'];\n res[value]['dotFill'] = palette[idx % palette?.length];\n }\n if (usedAesFromPalettes['lineColor']) {\n const palette = usedAesFromPalettes['lineColor'];\n res[value]['lineColor'] = palette[idx % palette?.length];\n }\n return res;\n }, result);\n}\n\nfunction isInheritMapping<T extends (string | number)>(value:T | InheritAesScatterplot | ContinuousAesFromColumn<T>):value is InheritAesScatterplot {\n return typeof value === 'object' && 'type' in value && value.type === 'grouping';\n}\nexport function createLegendInfo(\n data: DataFrame,\n grouping: ColumnName[],\n layers: ScatterplotLayer[],\n inheritedAes: ScatterplotSettingsImpl['inheritedAes']\n): ScatterplotLegendInfo {\n return grouping.reduce((res: ScatterplotLegendInfo, column) => {\n const getValue = (row: Row) => String(row[column.value]);\n const getValueLabel = (row: Row) => (column.valueLabels ? String(row[column.valueLabels]) : getValue(row));\n\n const usedAes = new Set<keyof AesItem>();\n const usedAesFromPalettes:Partial<Record<keyof AesItem, string[]>> = {}; // if there is palette in mapping then\n layers.forEach(layer => {\n if (layer.aes) {\n Object.entries(layer.aes).forEach(([key, value]) => {\n if (isInheritMapping(value) && value.value === column.value) {\n usedAes.add(key as keyof AesItem);\n if (value.palette) {\n usedAesFromPalettes[key as keyof AesItem] = value.palette;\n }\n }\n });\n }\n });\n let labels:Record<string, string> = {};\n let values:string[] = [];\n if (usedAes.has('dotFill')) {\n const uniqueValues = data.getColumnCategories(column.value);\n if (uniqueValues.length > MAX_SHOWN_UNIQUE_VALUES_IN_LABELS) {\n values = uniqueValues;\n labels = {};\n } else {\n const uniqRowsByGrouping = lodash.uniqBy(data.rows, row => row[column.value]);\n labels = uniqRowsByGrouping.reduce((res: Record<string, string>, row) => {\n res[getValue(row)] = getValueLabel(row);\n return res;\n }, {});\n values = uniqRowsByGrouping.map(getValue).sort((a, b) => labels[a].localeCompare(labels[b], 'en', {numeric: true}));\n }\n }\n res[column.value] = {\n values,\n usedAes: [...usedAes],\n aesMap: addPalettesToAesMapping(values, usedAesFromPalettes, inheritedAes[column.value]),\n labels,\n };\n return res;\n }, {});\n}"],"names":["addPalettesToAesMapping","uniqueValues","usedAesFromPalettes","inheritedAes","result","res","value","idx","palette","isInheritMapping","createLegendInfo","data","grouping","layers","column","getValue","row","getValueLabel","usedAes","layer","key","labels","values","MAX_SHOWN_UNIQUE_VALUES_IN_LABELS","uniqRowsByGrouping","lodash","a","b"],"mappings":";;AAcO,SAASA,EACZC,GACAC,GACAC,GACF;AACE,QAAMC,IAASD,KAAgB,CAAA;AAC/B,SAAK,OAAO,KAAKD,CAAmB,EAAE,SAG/BD,EAAa,OAAO,CAACI,GAA6BC,GAAOC,MAAQ;AAIpE,QAHKF,EAAIC,CAAK,MACVD,EAAIC,CAAK,IAAI,CAAA,IAEbJ,EAAoB,SAAY;AAChC,YAAMM,IAAUN,EAAoB;AACpC,MAAAG,EAAIC,CAAK,EAAE,UAAaE,EAAQD,KAAMC,KAAA,gBAAAA,EAAS,OAAM;AAAA,IACzD;AACA,QAAIN,EAAoB,WAAc;AAClC,YAAMM,IAAUN,EAAoB;AACpC,MAAAG,EAAIC,CAAK,EAAE,YAAeE,EAAQD,KAAMC,KAAA,gBAAAA,EAAS,OAAM;AAAA,IAC3D;AACA,WAAOH;AAAA,EACX,GAAGD,CAAM,IAfEA;AAgBf;AAEA,SAASK,EAA8CH,GAA6F;AAChJ,SAAO,OAAOA,KAAU,YAAY,UAAUA,KAASA,EAAM,SAAS;AAC1E;AACO,SAASI,EACZC,GACAC,GACAC,GACAV,GACqB;AACrB,SAAOS,EAAS,OAAO,CAACP,GAA4BS,MAAW;AAC3D,UAAMC,IAAW,CAACC,MAAa,OAAOA,EAAIF,EAAO,KAAK,CAAC,GACjDG,IAAgB,CAACD,MAAcF,EAAO,cAAc,OAAOE,EAAIF,EAAO,WAAW,CAAC,IAAIC,EAASC,CAAG,GAElGE,wBAAc,IAAA,GACdhB,IAA+D,CAAA;AACrE,IAAAW,EAAO,QAAQ,CAAAM,MAAS;AACpB,MAAIA,EAAM,OACN,OAAO,QAAQA,EAAM,GAAG,EAAE,QAAQ,CAAC,CAACC,GAAKd,CAAK,MAAM;AAChD,QAAIG,EAAiBH,CAAK,KAAKA,EAAM,UAAUQ,EAAO,UAClDI,EAAQ,IAAIE,CAAoB,GAC5Bd,EAAM,YACNJ,EAAoBkB,CAAoB,IAAId,EAAM;AAAA,MAG9D,CAAC;AAAA,IAET,CAAC;AACD,QAAIe,IAAgC,CAAA,GAChCC,IAAkB,CAAA;AACtB,QAAIJ,EAAQ,IAAI,SAAS,GAAG;AACxB,YAAMjB,IAAeU,EAAK,oBAAoBG,EAAO,KAAK;AAC1D,UAAIb,EAAa,SAASsB;AACtB,QAAAD,IAASrB,GACToB,IAAS,CAAA;AAAA,WACN;AACH,cAAMG,IAAqBC,EAAO,OAAOd,EAAK,MAAM,CAAAK,MAAOA,EAAIF,EAAO,KAAK,CAAC;AAC5E,QAAAO,IAASG,EAAmB,OAAO,CAACnB,GAA6BW,OAC7DX,EAAIU,EAASC,CAAG,CAAC,IAAIC,EAAcD,CAAG,GAC/BX,IACR,CAAA,CAAE,GACLiB,IAASE,EAAmB,IAAIT,CAAQ,EAAE,KAAK,CAACW,GAAGC,MAAMN,EAAOK,CAAC,EAAE,cAAcL,EAAOM,CAAC,GAAG,MAAM,EAAC,SAAS,GAAA,CAAK,CAAC;AAAA,MACtH;AAAA,IACJ;AACA,WAAAtB,EAAIS,EAAO,KAAK,IAAI;AAAA,MAChB,QAAAQ;AAAA,MACA,SAAS,CAAC,GAAGJ,CAAO;AAAA,MACpB,QAAQlB,EAAwBsB,GAAQpB,GAAqBC,EAAaW,EAAO,KAAK,CAAC;AAAA,MACvF,QAAAO;AAAA,IAAA,GAEGhB;AAAA,EACX,GAAG,CAAA,CAAE;AACT;"}
1
+ {"version":3,"file":"createLegendInfo.js","sources":["../../../src/scatterplot/utils/createLegendInfo.ts"],"sourcesContent":["import { MAX_SHOWN_UNIQUE_VALUES_IN_LABELS } from '../../constants';\nimport type { DataFrame } from '../../DataFrame';\nimport type {\n AesItem,\n Category,\n ColumnName,\n ContinuousAesFromColumn,\n InheritAesScatterplot,\n ScatterplotLayer,\n ScatterplotLegendInfo\n} from '../../types';\nimport type { ScatterplotSettingsImpl } from '../ScatterplotSettingsImpl';\n\nconst categoryIndexer = (() => {\n const map = new Map<string, Map<Category, number>>();\n const clear = () => map.clear();\n const getIndex = (columnName: ColumnName, category: Category): number => {\n let categoryMap = map.get(columnName.value);\n if (categoryMap === undefined) {\n categoryMap = new Map();\n map.set(columnName.value, categoryMap);\n }\n let index = categoryMap.get(category);\n if (index === undefined) {\n index = categoryMap.size;\n categoryMap.set(category, index);\n }\n return index;\n };\n\n return {\n clear,\n getIndex,\n };\n})();\n\nexport function addPalettesToAesMapping(\n columnName: ColumnName,\n usedAesFromPalettes: Partial<Record<keyof AesItem, string[]>>,\n inheritedAes?: ScatterplotSettingsImpl['inheritedAes'][string],\n) {\n categoryIndexer.clear();\n const hasIngeritedAes = inheritedAes && Object.keys(inheritedAes).length > 0;\n const dotFill = usedAesFromPalettes['dotFill'];\n const hasDotFill = dotFill && dotFill.length > 0;\n const lineColor = usedAesFromPalettes['lineColor'];\n const hasLineColor = lineColor && lineColor.length > 0;\n const getAesField = (category: Category, field: keyof AesItem) => {\n const inheritedResult = hasIngeritedAes ? inheritedAes[category]?.[field] : undefined;\n \n if (field === 'dotFill' && hasDotFill) {\n return dotFill[categoryIndexer.getIndex(columnName, category) % dotFill.length] ?? inheritedResult;\n }\n if (field === 'lineColor' && hasLineColor) {\n return lineColor[categoryIndexer.getIndex(columnName, category) % lineColor.length] ?? inheritedResult;\n }\n \n return inheritedResult;\n };\n\n return getAesField;\n}\n\nfunction isInheritMapping<T extends (string | number)>(value:T | InheritAesScatterplot | ContinuousAesFromColumn<T>):value is InheritAesScatterplot {\n return typeof value === 'object' && 'type' in value && value.type === 'grouping';\n}\nexport function createLegendInfo(\n data: DataFrame,\n grouping: ColumnName[],\n layers: ScatterplotLayer[],\n inheritedAes: ScatterplotSettingsImpl['inheritedAes']\n): ScatterplotLegendInfo {\n return grouping.reduce((res: ScatterplotLegendInfo, column) => {\n // TODO: remove String conversion\n const getValueLabel = (index: number) => {\n return column.valueLabels\n ? data.getColumnValueCategory(column.valueLabels, index)\n : undefined;\n };\n\n const usedAes = new Set<keyof AesItem>();\n const usedAesFromPalettes:Partial<Record<keyof AesItem, string[]>> = {}; // if there is palette in mapping then\n layers.forEach(layer => {\n if (!layer.aes) return;\n \n Object.entries(layer.aes).forEach(([key, value]) => {\n if (!(isInheritMapping(value) && value.value === column.value)) return;\n \n usedAes.add(key as keyof AesItem);\n usedAesFromPalettes[key as keyof AesItem] = value.palette;\n });\n });\n let labels: Record<Category, string> = {};\n let values: Category[] = [];\n if (usedAes.has('dotFill') || usedAes.has('dotShape')) {\n const categories = data.getColumnCategories(column.value);\n if (categories.length < MAX_SHOWN_UNIQUE_VALUES_IN_LABELS) {\n labels = categories.reduce((res, category) => {\n const index = data.getColumnCategoryRowIndex(column.value, category);\n res[category] = getValueLabel(index) ?? category;\n return res;\n }, labels);\n values = categories.sort((a, b) => labels[a]?.localeCompare(labels[b] ?? '', 'en', {numeric: true}) ?? 0);\n } else {\n values = categories;\n }\n }\n res[column.value] = {\n values,\n usedAes: [...usedAes],\n aesMap: addPalettesToAesMapping(column, usedAesFromPalettes, inheritedAes[column.value]),\n labels,\n };\n return res;\n }, {});\n}"],"names":["categoryIndexer","map","columnName","category","categoryMap","index","addPalettesToAesMapping","usedAesFromPalettes","inheritedAes","hasIngeritedAes","dotFill","hasDotFill","lineColor","hasLineColor","field","inheritedResult","_a","isInheritMapping","value","createLegendInfo","data","grouping","layers","res","column","getValueLabel","usedAes","layer","key","labels","values","categories","MAX_SHOWN_UNIQUE_VALUES_IN_LABELS","a","b"],"mappings":"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"}
@@ -0,0 +1,5 @@
1
+ import { DataFrame } from '../../DataFrame';
2
+ import { ColumnName } from '../../types';
3
+ import { numberFormat } from '../../utils/numberFormat';
4
+ export declare function formatColumnValue(data: DataFrame, rowIdx: number, column: ColumnName | null | undefined, numberFormatter?: typeof numberFormat): string | null;
5
+ //# sourceMappingURL=formatColumnValue.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"formatColumnValue.d.ts","sourceRoot":"","sources":["../../../src/scatterplot/utils/formatColumnValue.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAC,SAAS,EAAC,MAAM,iBAAiB,CAAC;AAC/C,OAAO,KAAK,EAAC,UAAU,EAAC,MAAM,aAAa,CAAC;AAC5C,OAAO,EAAC,YAAY,EAAC,MAAM,0BAA0B,CAAC;AAEtD,wBAAgB,iBAAiB,CAAC,IAAI,EAAC,SAAS,EAAE,MAAM,EAAC,MAAM,EAAE,MAAM,EAAC,UAAU,GAAG,IAAI,GAAG,SAAS,EAAE,eAAe,sBAAe,iBAUpI"}
@@ -0,0 +1,11 @@
1
+ import { numberFormat as l } from "../../utils/numberFormat.js";
2
+ function m(u, t, r, n = l) {
3
+ if (!r)
4
+ return null;
5
+ const e = u.getColumnValue(r.valueLabels ?? r.value, t);
6
+ return !(typeof e == "number") || e === null ? e : n(e);
7
+ }
8
+ export {
9
+ m as formatColumnValue
10
+ };
11
+ //# sourceMappingURL=formatColumnValue.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"formatColumnValue.js","sources":["../../../src/scatterplot/utils/formatColumnValue.ts"],"sourcesContent":["import type {DataFrame} from '../../DataFrame';\nimport type {ColumnName} from '../../types';\nimport {numberFormat} from '../../utils/numberFormat';\n\nexport function formatColumnValue(data:DataFrame, rowIdx:number, column:ColumnName | null | undefined, numberFormatter = numberFormat) {\n if (!column) {\n return null;\n }\n const value = data.getColumnValue(column.valueLabels ?? column.value, rowIdx);\n const isNumber = typeof value === 'number';\n if (!isNumber || value === null) {\n return value;\n }\n return numberFormatter(value);\n}"],"names":["formatColumnValue","data","rowIdx","column","numberFormatter","numberFormat","value"],"mappings":";AAIO,SAASA,EAAkBC,GAAgBC,GAAeC,GAAsCC,IAAkBC,GAAc;AACnI,MAAI,CAACF;AACD,WAAO;AAEX,QAAMG,IAAQL,EAAK,eAAeE,EAAO,eAAeA,EAAO,OAAOD,CAAM;AAE5E,SAAI,EADa,OAAOI,KAAU,aACjBA,MAAU,OAChBA,IAEJF,EAAgBE,CAAK;AAChC;"}
@@ -2,17 +2,15 @@ import { Dot } from '../dots';
2
2
  type XPosition = 'right' | 'middle' | 'left';
3
3
  type YPosition = 'top' | 'middle' | 'bottom';
4
4
  export type Label = {
5
+ x: number;
6
+ y: number;
7
+ dot: Dot;
5
8
  name: string;
6
9
  width: number;
7
10
  height: number;
8
- x: number;
9
- y: number;
10
11
  padding: number;
11
12
  xPosition: XPosition;
12
13
  yPosition: YPosition;
13
- bbox: LabelBBox;
14
- outerBBox: LabelBBox;
15
- dot: Dot;
16
14
  };
17
15
  export type LabelBBox = {
18
16
  minX: number;
@@ -20,9 +18,8 @@ export type LabelBBox = {
20
18
  minY: number;
21
19
  maxY: number;
22
20
  };
23
- export declare function getLabelBBox(label: Label): LabelBBox;
24
- export declare function getLabelOuterBBox(label: Label, vOffset: number, hOffset: number): LabelBBox;
25
- export declare function updateLabelsBBoxes(labels: Label[], vOffset?: number, hOffset?: number): void;
26
- export declare function getFilteredLabels(labels: Label[], width: number, height: number, vOffset?: number, hOffset?: number): Label[];
21
+ export declare function getLabelMinX(label: Label): number;
22
+ export declare function getLabelMinY(label: Label): number;
23
+ export declare function createLabelPositioner(chartW: number, chartH: number, yOffset?: number, xOffset?: number): (x: number, y: number, w: number, h: number, padding: number) => null | [XPosition, YPosition];
27
24
  export {};
28
25
  //# sourceMappingURL=getVisibleLabels.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"getVisibleLabels.d.ts","sourceRoot":"","sources":["../../../src/scatterplot/utils/getVisibleLabels.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAC,GAAG,EAAC,MAAM,SAAS,CAAC;AAGjC,KAAK,SAAS,GAAG,OAAO,GAAG,QAAQ,GAAG,MAAM,CAAC;AAC7C,KAAK,SAAS,GAAG,KAAK,GAAG,QAAQ,GAAG,QAAQ,CAAC;AAC7C,MAAM,MAAM,KAAK,GAAG;IAChB,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,MAAM,CAAC;IACf,CAAC,EAAE,MAAM,CAAC;IACV,CAAC,EAAE,MAAM,CAAC;IACV,OAAO,EAAE,MAAM,CAAC;IAChB,SAAS,EAAE,SAAS,CAAC;IACrB,SAAS,EAAE,SAAS,CAAC;IACrB,IAAI,EAAE,SAAS,CAAC;IAChB,SAAS,EAAE,SAAS,CAAC;IACrB,GAAG,EAAE,GAAG,CAAC;CACZ,CAAC;AACF,MAAM,MAAM,SAAS,GAAG;IACpB,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;CAChB,CAAA;AA4BD,wBAAgB,YAAY,CAAC,KAAK,EAAE,KAAK,GAAE,SAAS,CAOnD;AACD,wBAAgB,iBAAiB,CAAC,KAAK,EAAE,KAAK,EAAE,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAE,SAAS,CAO1F;AAQD,wBAAgB,kBAAkB,CAAC,MAAM,EAAE,KAAK,EAAE,EAAE,OAAO,SAAe,EAAE,OAAO,SAAe,QAKjG;AACD,wBAAgB,iBAAiB,CAAC,MAAM,EAAE,KAAK,EAAE,EAAE,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,OAAO,SAAe,EAAE,OAAO,SAAe,WA4B/H"}
1
+ {"version":3,"file":"getVisibleLabels.d.ts","sourceRoot":"","sources":["../../../src/scatterplot/utils/getVisibleLabels.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,GAAG,EAAE,MAAM,SAAS,CAAC;AAEnC,KAAK,SAAS,GAAG,OAAO,GAAG,QAAQ,GAAG,MAAM,CAAC;AAC7C,KAAK,SAAS,GAAG,KAAK,GAAG,QAAQ,GAAG,QAAQ,CAAC;AAC7C,MAAM,MAAM,KAAK,GAAG;IAChB,CAAC,EAAE,MAAM,CAAC;IACV,CAAC,EAAE,MAAM,CAAC;IACV,GAAG,EAAE,GAAG,CAAC;IACT,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,MAAM,CAAC;IACf,OAAO,EAAE,MAAM,CAAC;IAChB,SAAS,EAAE,SAAS,CAAC;IACrB,SAAS,EAAE,SAAS,CAAC;CACxB,CAAC;AACF,MAAM,MAAM,SAAS,GAAG;IACpB,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;CAChB,CAAA;AAkDD,wBAAgB,YAAY,CAAC,KAAK,EAAE,KAAK,UAExC;AACD,wBAAgB,YAAY,CAAC,KAAK,EAAE,KAAK,UAExC;AAcD,wBAAgB,qBAAqB,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,OAAO,SAAe,EAAE,OAAO,SAAe,IAIxG,GAAG,MAAM,EAAE,GAAG,MAAM,EAAE,GAAG,MAAM,EAAE,GAAG,MAAM,EAAE,SAAS,MAAM,KAAG,IAAI,GAAG,CAAC,SAAS,EAAE,SAAS,CAAC,CAYtG"}
@@ -1,60 +1,50 @@
1
- import P from "../../node_modules/rbush/index.js";
2
- function u(t) {
3
- const o = t.xPosition !== "middle" && t.yPosition !== "middle", n = t.padding * (o ? 0.7 : 1);
4
- return t.xPosition === "right" ? t.x + n : t.xPosition === "middle" ? t.x - t.width / 2 : t.x - t.width - n;
5
- }
6
- function m(t) {
7
- const o = t.xPosition !== "middle" && t.yPosition !== "middle", n = t.padding * (o ? 0.7 : 1);
8
- return t.yPosition === "middle" ? t.y - t.height / 2 : t.yPosition === "top" ? t.y - n - t.height : t.y + n;
9
- }
10
- function y(t, o) {
11
- return u(t) - o;
12
- }
13
- function X(t, o) {
14
- return m(t) - o;
15
- }
16
- function x(t) {
17
- const o = u(t), n = o + t.width, i = m(t), d = i + t.height;
18
- return { minX: o, maxX: n, minY: i, maxY: d };
19
- }
20
- function g(t, o, n) {
21
- const i = y(t, n), d = u(t) + t.width + n, s = X(t, o), e = s + t.height + 2 * o;
22
- return { minX: i, maxX: d, minY: s, maxY: e };
23
- }
24
- function Y(t, o, n) {
25
- return t.minX >= 0 && t.maxX <= o && t.minY >= 0 && t.maxY <= n;
26
- }
27
- const c = 2;
28
- function w(t, o = c, n = c) {
29
- t.forEach((i) => {
30
- i.bbox = x(i), i.outerBBox = g(i, o, n);
31
- });
32
- }
33
- function E(t, o, n, i = c, d = c) {
34
- const s = [], e = new P(), B = [
35
- ["middle", "right"],
36
- ["top", "right"],
37
- ["bottom", "right"],
38
- ["middle", "left"],
39
- ["top", "left"],
40
- ["bottom", "left"],
41
- ["top", "middle"],
42
- ["bottom", "middle"]
43
- ];
44
- for (const h of t)
45
- for (const [f, p] of B) {
46
- const r = { ...h, yPosition: f, xPosition: p };
47
- if (r.bbox = x(r), r.outerBBox = g(r, i, d), Y(r.outerBBox, o, n) && !e.collides(r.outerBBox)) {
48
- s.push(r), e.insert(r.outerBBox);
49
- break;
50
- }
51
- }
52
- return s;
1
+ import L from "../../node_modules/rbush/index.js";
2
+ function d(n, r, t, o, i) {
3
+ return o !== "middle" && i !== "middle" && (t *= 0.7), o === "right" ? n + t : o === "middle" ? n - r / 2 : n - r - t;
4
+ }
5
+ function B(n, r, t, o, i) {
6
+ return o !== "middle" && i !== "middle" && (t *= 0.7), i === "middle" ? n - r / 2 : i === "top" ? n - t - r : n + t;
7
+ }
8
+ function l(n, r, t, o, i, e) {
9
+ return d(n, r, t, o, i) - e;
10
+ }
11
+ function x(n, r, t, o, i, e) {
12
+ return B(n, r, t, o, i) - e;
13
+ }
14
+ function p(n, r, t, o, i, e, u, c, s, m = { minX: 0, maxX: 0, minY: 0, maxY: 0 }) {
15
+ return m.minX = l(n, t, i, e, u, s), m.maxX = d(n, t, i, e, u) + t + s, m.minY = x(r, o, i, e, u, c), m.maxY = m.minY + o + 2 * c, m;
16
+ }
17
+ function C(n, r, t) {
18
+ return n.minX >= 0 && n.maxX <= r && n.minY >= 0 && n.maxY <= t;
19
+ }
20
+ function E(n) {
21
+ return d(n.x, n.width, n.padding, n.xPosition, n.yPosition);
22
+ }
23
+ function F(n) {
24
+ return B(n.y, n.height, n.padding, n.xPosition, n.yPosition);
25
+ }
26
+ const O = [
27
+ ["middle", "right"],
28
+ ["top", "right"],
29
+ ["bottom", "right"],
30
+ ["middle", "left"],
31
+ ["top", "left"],
32
+ ["bottom", "left"],
33
+ ["top", "middle"],
34
+ ["bottom", "middle"]
35
+ ], Y = 2, M = { minX: 0, maxX: 0, minY: 0, maxY: 0 };
36
+ function _(n, r, t = Y, o = Y) {
37
+ const i = M, e = new L();
38
+ return (u, c, s, m, g) => {
39
+ for (const [f, X] of O)
40
+ if (p(u, c, s, m, g, X, f, t, o, i), C(i, n, r) && !e.collides(i))
41
+ return e.insert({ ...i }), [X, f];
42
+ return null;
43
+ };
53
44
  }
54
45
  export {
55
- E as getFilteredLabels,
56
- x as getLabelBBox,
57
- g as getLabelOuterBBox,
58
- w as updateLabelsBBoxes
46
+ _ as createLabelPositioner,
47
+ E as getLabelMinX,
48
+ F as getLabelMinY
59
49
  };
60
50
  //# sourceMappingURL=getVisibleLabels.js.map