@milaboratories/graph-maker 1.1.138 → 1.1.139

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 (219) hide show
  1. package/dist/GraphMaker/components/LassoControls/index.vue.js +15 -13
  2. package/dist/GraphMaker/components/LassoControls/index.vue.js.map +1 -1
  3. package/dist/GraphMaker/utils/createChartSettingsForRender/composeBubbleSettings.d.ts +9 -3
  4. package/dist/GraphMaker/utils/createChartSettingsForRender/composeBubbleSettings.d.ts.map +1 -1
  5. package/dist/GraphMaker/utils/createChartSettingsForRender/composeDendroSettings.d.ts +17 -2
  6. package/dist/GraphMaker/utils/createChartSettingsForRender/composeDendroSettings.d.ts.map +1 -1
  7. package/dist/GraphMaker/utils/createChartSettingsForRender/composeDiscreteSettings.d.ts +13 -4
  8. package/dist/GraphMaker/utils/createChartSettingsForRender/composeDiscreteSettings.d.ts.map +1 -1
  9. package/dist/GraphMaker/utils/createChartSettingsForRender/composeHeatmapSettings.d.ts +28 -7
  10. package/dist/GraphMaker/utils/createChartSettingsForRender/composeHeatmapSettings.d.ts.map +1 -1
  11. package/dist/GraphMaker/utils/createChartSettingsForRender/composeHistogramSettings.d.ts +6 -2
  12. package/dist/GraphMaker/utils/createChartSettingsForRender/composeHistogramSettings.d.ts.map +1 -1
  13. package/dist/GraphMaker/utils/createChartSettingsForRender/composeScatterplotSettings.d.ts +16 -2
  14. package/dist/GraphMaker/utils/createChartSettingsForRender/composeScatterplotSettings.d.ts.map +1 -1
  15. package/dist/GraphMaker/utils/createChartSettingsForRender/composeScatterplotUmapSettings.d.ts +14 -2
  16. package/dist/GraphMaker/utils/createChartSettingsForRender/composeScatterplotUmapSettings.d.ts.map +1 -1
  17. package/dist/node_modules/@milaboratories/miplots4/dist/DataFrame.js +95 -72
  18. package/dist/node_modules/@milaboratories/miplots4/dist/DataFrame.js.map +1 -1
  19. package/dist/node_modules/@milaboratories/miplots4/dist/MiPlots.js +1 -1
  20. package/dist/node_modules/@milaboratories/miplots4/dist/bubble/ChartRenderer.js +124 -122
  21. package/dist/node_modules/@milaboratories/miplots4/dist/bubble/ChartRenderer.js.map +1 -1
  22. package/dist/node_modules/@milaboratories/miplots4/dist/bubble/components/Chart.js +72 -91
  23. package/dist/node_modules/@milaboratories/miplots4/dist/bubble/components/Chart.js.map +1 -1
  24. package/dist/node_modules/@milaboratories/miplots4/dist/bubble/components/ChartsGroup.js +43 -41
  25. package/dist/node_modules/@milaboratories/miplots4/dist/bubble/components/ChartsGroup.js.map +1 -1
  26. package/dist/node_modules/@milaboratories/miplots4/dist/bubble/getCellTooltip.js +28 -0
  27. package/dist/node_modules/@milaboratories/miplots4/dist/bubble/getCellTooltip.js.map +1 -0
  28. package/dist/node_modules/@milaboratories/miplots4/dist/bubble/getGroupedCellsData.js +94 -0
  29. package/dist/node_modules/@milaboratories/miplots4/dist/bubble/getGroupedCellsData.js.map +1 -0
  30. package/dist/node_modules/@milaboratories/miplots4/dist/bubble/index.js +42 -38
  31. package/dist/node_modules/@milaboratories/miplots4/dist/bubble/index.js.map +1 -1
  32. package/dist/node_modules/@milaboratories/miplots4/dist/bubble/utils/calculateCaptionTails.js.map +1 -1
  33. package/dist/node_modules/@milaboratories/miplots4/dist/common/Legend.js.map +1 -1
  34. package/dist/node_modules/@milaboratories/miplots4/dist/common/Tooltip.js +11 -11
  35. package/dist/node_modules/@milaboratories/miplots4/dist/common/Tooltip.js.map +1 -1
  36. package/dist/node_modules/@milaboratories/miplots4/dist/common/useDataFrame.js +20 -0
  37. package/dist/node_modules/@milaboratories/miplots4/dist/common/useDataFrame.js.map +1 -0
  38. package/dist/node_modules/@milaboratories/miplots4/dist/dendro/ChartRenderer.js +181 -181
  39. package/dist/node_modules/@milaboratories/miplots4/dist/dendro/ChartRenderer.js.map +1 -1
  40. package/dist/node_modules/@milaboratories/miplots4/dist/dendro/DendroSettingsImpl.js +2 -2
  41. package/dist/node_modules/@milaboratories/miplots4/dist/dendro/DendroSettingsImpl.js.map +1 -1
  42. package/dist/node_modules/@milaboratories/miplots4/dist/dendro/components/Chart.js +45 -45
  43. package/dist/node_modules/@milaboratories/miplots4/dist/dendro/components/Chart.js.map +1 -1
  44. package/dist/node_modules/@milaboratories/miplots4/dist/dendro/components/Heatmap.js +27 -27
  45. package/dist/node_modules/@milaboratories/miplots4/dist/dendro/components/Heatmap.js.map +1 -1
  46. package/dist/node_modules/@milaboratories/miplots4/dist/dendro/components/Legend.js.map +1 -1
  47. package/dist/node_modules/@milaboratories/miplots4/dist/dendro/components/LinksGroup.js +18 -18
  48. package/dist/node_modules/@milaboratories/miplots4/dist/dendro/components/LinksGroup.js.map +1 -1
  49. package/dist/node_modules/@milaboratories/miplots4/dist/dendro/components/NodesGroup.js +36 -36
  50. package/dist/node_modules/@milaboratories/miplots4/dist/dendro/components/NodesGroup.js.map +1 -1
  51. package/dist/node_modules/@milaboratories/miplots4/dist/dendro/getHeatmapData.js +45 -41
  52. package/dist/node_modules/@milaboratories/miplots4/dist/dendro/getHeatmapData.js.map +1 -1
  53. package/dist/node_modules/@milaboratories/miplots4/dist/dendro/getHierarchyData.js +33 -33
  54. package/dist/node_modules/@milaboratories/miplots4/dist/dendro/getHierarchyData.js.map +1 -1
  55. package/dist/node_modules/@milaboratories/miplots4/dist/dendro/index.js +90 -93
  56. package/dist/node_modules/@milaboratories/miplots4/dist/dendro/index.js.map +1 -1
  57. package/dist/node_modules/@milaboratories/miplots4/dist/discrete/ChartRenderer.js +200 -199
  58. package/dist/node_modules/@milaboratories/miplots4/dist/discrete/ChartRenderer.js.map +1 -1
  59. package/dist/node_modules/@milaboratories/miplots4/dist/discrete/DiscreteSettingsImpl.js +17 -17
  60. package/dist/node_modules/@milaboratories/miplots4/dist/discrete/DiscreteSettingsImpl.js.map +1 -1
  61. package/dist/node_modules/@milaboratories/miplots4/dist/discrete/components/layers/BoxElement.js.map +1 -1
  62. package/dist/node_modules/@milaboratories/miplots4/dist/discrete/index.js +102 -99
  63. package/dist/node_modules/@milaboratories/miplots4/dist/discrete/index.js.map +1 -1
  64. package/dist/node_modules/@milaboratories/miplots4/dist/discrete/layers/bar.js +31 -36
  65. package/dist/node_modules/@milaboratories/miplots4/dist/discrete/layers/bar.js.map +1 -1
  66. package/dist/node_modules/@milaboratories/miplots4/dist/discrete/layers/binnedDots.js +62 -74
  67. package/dist/node_modules/@milaboratories/miplots4/dist/discrete/layers/binnedDots.js.map +1 -1
  68. package/dist/node_modules/@milaboratories/miplots4/dist/discrete/layers/boxes.js +52 -53
  69. package/dist/node_modules/@milaboratories/miplots4/dist/discrete/layers/boxes.js.map +1 -1
  70. package/dist/node_modules/@milaboratories/miplots4/dist/discrete/layers/dots.js +32 -32
  71. package/dist/node_modules/@milaboratories/miplots4/dist/discrete/layers/dots.js.map +1 -1
  72. package/dist/node_modules/@milaboratories/miplots4/dist/discrete/layers/lines.js +7 -6
  73. package/dist/node_modules/@milaboratories/miplots4/dist/discrete/layers/lines.js.map +1 -1
  74. package/dist/node_modules/@milaboratories/miplots4/dist/discrete/layers/logo.js +23 -23
  75. package/dist/node_modules/@milaboratories/miplots4/dist/discrete/layers/logo.js.map +1 -1
  76. package/dist/node_modules/@milaboratories/miplots4/dist/discrete/layers/pairedPoints.js +63 -63
  77. package/dist/node_modules/@milaboratories/miplots4/dist/discrete/layers/pairedPoints.js.map +1 -1
  78. package/dist/node_modules/@milaboratories/miplots4/dist/discrete/layers/sina.js +60 -64
  79. package/dist/node_modules/@milaboratories/miplots4/dist/discrete/layers/sina.js.map +1 -1
  80. package/dist/node_modules/@milaboratories/miplots4/dist/discrete/layers/stackedBar.js +23 -23
  81. package/dist/node_modules/@milaboratories/miplots4/dist/discrete/layers/stackedBar.js.map +1 -1
  82. package/dist/node_modules/@milaboratories/miplots4/dist/discrete/utils/getOutliersBounds.js +5 -5
  83. package/dist/node_modules/@milaboratories/miplots4/dist/discrete/utils/getOutliersBounds.js.map +1 -1
  84. package/dist/node_modules/@milaboratories/miplots4/dist/discrete/utils/splitTextByWidth.js +13 -13
  85. package/dist/node_modules/@milaboratories/miplots4/dist/discrete/utils/splitTextByWidth.js.map +1 -1
  86. package/dist/node_modules/@milaboratories/miplots4/dist/heatmap/ChartRenderer.js +258 -256
  87. package/dist/node_modules/@milaboratories/miplots4/dist/heatmap/ChartRenderer.js.map +1 -1
  88. package/dist/node_modules/@milaboratories/miplots4/dist/heatmap/HeatmapSettingsImpl.js +1 -1
  89. package/dist/node_modules/@milaboratories/miplots4/dist/heatmap/HeatmapSettingsImpl.js.map +1 -1
  90. package/dist/node_modules/@milaboratories/miplots4/dist/heatmap/components/Annotations/Annotation.js +45 -44
  91. package/dist/node_modules/@milaboratories/miplots4/dist/heatmap/components/Annotations/Annotation.js.map +1 -1
  92. package/dist/node_modules/@milaboratories/miplots4/dist/heatmap/components/Chart.js +107 -106
  93. package/dist/node_modules/@milaboratories/miplots4/dist/heatmap/components/Chart.js.map +1 -1
  94. package/dist/node_modules/@milaboratories/miplots4/dist/heatmap/components/ChartsGroup.js +18 -18
  95. package/dist/node_modules/@milaboratories/miplots4/dist/heatmap/components/ChartsGroup.js.map +1 -1
  96. package/dist/node_modules/@milaboratories/miplots4/dist/heatmap/getCells.js +99 -95
  97. package/dist/node_modules/@milaboratories/miplots4/dist/heatmap/getCells.js.map +1 -1
  98. package/dist/node_modules/@milaboratories/miplots4/dist/heatmap/index.js +30 -29
  99. package/dist/node_modules/@milaboratories/miplots4/dist/heatmap/index.js.map +1 -1
  100. package/dist/node_modules/@milaboratories/miplots4/dist/heatmap/utils/calculateAnnotationTitleSizes.js +1 -1
  101. package/dist/node_modules/@milaboratories/miplots4/dist/heatmap/utils/calculateAnnotationTitleSizes.js.map +1 -1
  102. package/dist/node_modules/@milaboratories/miplots4/dist/heatmap/utils/calculateCaptionTails.js.map +1 -1
  103. package/dist/node_modules/@milaboratories/miplots4/dist/histogram/ChartRenderer.js +143 -142
  104. package/dist/node_modules/@milaboratories/miplots4/dist/histogram/ChartRenderer.js.map +1 -1
  105. package/dist/node_modules/@milaboratories/miplots4/dist/histogram/HistogramSettingsImpl.js.map +1 -1
  106. package/dist/node_modules/@milaboratories/miplots4/dist/histogram/components/Chart.js +30 -30
  107. package/dist/node_modules/@milaboratories/miplots4/dist/histogram/components/Chart.js.map +1 -1
  108. package/dist/node_modules/@milaboratories/miplots4/dist/histogram/components/ChartsGroup.js +7 -7
  109. package/dist/node_modules/@milaboratories/miplots4/dist/histogram/getHistogramData.js +53 -54
  110. package/dist/node_modules/@milaboratories/miplots4/dist/histogram/getHistogramData.js.map +1 -1
  111. package/dist/node_modules/@milaboratories/miplots4/dist/histogram/index.js +59 -55
  112. package/dist/node_modules/@milaboratories/miplots4/dist/histogram/index.js.map +1 -1
  113. package/dist/node_modules/@milaboratories/miplots4/dist/node_modules/@d3fc/d3fc-axis/src/axisBase.js +7 -7
  114. package/dist/node_modules/@milaboratories/miplots4/dist/node_modules/d3-array/src/min.js +6 -12
  115. package/dist/node_modules/@milaboratories/miplots4/dist/node_modules/d3-array/src/min.js.map +1 -1
  116. package/dist/node_modules/@milaboratories/miplots4/dist/node_modules/d3-shape/src/line.js.map +1 -1
  117. package/dist/node_modules/@milaboratories/miplots4/dist/node_modules/kdbush/index.js +148 -0
  118. package/dist/node_modules/@milaboratories/miplots4/dist/node_modules/kdbush/index.js.map +1 -0
  119. package/dist/node_modules/@milaboratories/miplots4/dist/scatterplot/ChartRenderer.js +172 -168
  120. package/dist/node_modules/@milaboratories/miplots4/dist/scatterplot/ChartRenderer.js.map +1 -1
  121. package/dist/node_modules/@milaboratories/miplots4/dist/scatterplot/ScatterplotSettingsImpl.js +26 -26
  122. package/dist/node_modules/@milaboratories/miplots4/dist/scatterplot/ScatterplotSettingsImpl.js.map +1 -1
  123. package/dist/node_modules/@milaboratories/miplots4/dist/scatterplot/components/Chart.js +11 -11
  124. package/dist/node_modules/@milaboratories/miplots4/dist/scatterplot/components/ChartAxisTitles.js +30 -29
  125. package/dist/node_modules/@milaboratories/miplots4/dist/scatterplot/components/ChartAxisTitles.js.map +1 -1
  126. package/dist/node_modules/@milaboratories/miplots4/dist/scatterplot/components/ChartLayersData.js +135 -153
  127. package/dist/node_modules/@milaboratories/miplots4/dist/scatterplot/components/ChartLayersData.js.map +1 -1
  128. package/dist/node_modules/@milaboratories/miplots4/dist/scatterplot/components/ChartTooltip.js +35 -32
  129. package/dist/node_modules/@milaboratories/miplots4/dist/scatterplot/components/ChartTooltip.js.map +1 -1
  130. package/dist/node_modules/@milaboratories/miplots4/dist/scatterplot/components/ChartTrendsData.js +27 -27
  131. package/dist/node_modules/@milaboratories/miplots4/dist/scatterplot/components/ChartTrendsData.js.map +1 -1
  132. package/dist/node_modules/@milaboratories/miplots4/dist/scatterplot/components/ChartsGroup.js +14 -14
  133. package/dist/node_modules/@milaboratories/miplots4/dist/scatterplot/constants.js.map +1 -1
  134. package/dist/node_modules/@milaboratories/miplots4/dist/scatterplot/dots.js +24 -22
  135. package/dist/node_modules/@milaboratories/miplots4/dist/scatterplot/dots.js.map +1 -1
  136. package/dist/node_modules/@milaboratories/miplots4/dist/scatterplot/getLayersData.js +11 -14
  137. package/dist/node_modules/@milaboratories/miplots4/dist/scatterplot/getLayersData.js.map +1 -1
  138. package/dist/node_modules/@milaboratories/miplots4/dist/scatterplot/index.js +57 -58
  139. package/dist/node_modules/@milaboratories/miplots4/dist/scatterplot/index.js.map +1 -1
  140. package/dist/node_modules/@milaboratories/miplots4/dist/scatterplot/linearRegression.js +85 -83
  141. package/dist/node_modules/@milaboratories/miplots4/dist/scatterplot/linearRegression.js.map +1 -1
  142. package/dist/node_modules/@milaboratories/miplots4/dist/scatterplot/utils/createAesGetter.js +20 -20
  143. package/dist/node_modules/@milaboratories/miplots4/dist/scatterplot/utils/createAesGetter.js.map +1 -1
  144. package/dist/node_modules/@milaboratories/miplots4/dist/scatterplot/utils/createLegendInfo.js +44 -37
  145. package/dist/node_modules/@milaboratories/miplots4/dist/scatterplot/utils/createLegendInfo.js.map +1 -1
  146. package/dist/node_modules/@milaboratories/miplots4/dist/scatterplot/utils/formatColumnValue.js +11 -0
  147. package/dist/node_modules/@milaboratories/miplots4/dist/scatterplot/utils/formatColumnValue.js.map +1 -0
  148. package/dist/node_modules/@milaboratories/miplots4/dist/scatterplot/utils/getVisibleLabels.js +46 -56
  149. package/dist/node_modules/@milaboratories/miplots4/dist/scatterplot/utils/getVisibleLabels.js.map +1 -1
  150. package/dist/node_modules/@milaboratories/miplots4/dist/scatterplot-umap/ChartRenderer.js +223 -205
  151. package/dist/node_modules/@milaboratories/miplots4/dist/scatterplot-umap/ChartRenderer.js.map +1 -1
  152. package/dist/node_modules/@milaboratories/miplots4/dist/scatterplot-umap/SettingsImpl.js +22 -22
  153. package/dist/node_modules/@milaboratories/miplots4/dist/scatterplot-umap/SettingsImpl.js.map +1 -1
  154. package/dist/node_modules/@milaboratories/miplots4/dist/scatterplot-umap/colors.js +42 -0
  155. package/dist/node_modules/@milaboratories/miplots4/dist/scatterplot-umap/colors.js.map +1 -0
  156. package/dist/node_modules/@milaboratories/miplots4/dist/scatterplot-umap/components/LowerSVG.js +84 -81
  157. package/dist/node_modules/@milaboratories/miplots4/dist/scatterplot-umap/components/LowerSVG.js.map +1 -1
  158. package/dist/node_modules/@milaboratories/miplots4/dist/scatterplot-umap/components/SVGLayer.js +11 -11
  159. package/dist/node_modules/@milaboratories/miplots4/dist/scatterplot-umap/components/UpperSVG.js +15 -14
  160. package/dist/node_modules/@milaboratories/miplots4/dist/scatterplot-umap/components/UpperSVG.js.map +1 -1
  161. package/dist/node_modules/@milaboratories/miplots4/dist/scatterplot-umap/index.js +89 -114
  162. package/dist/node_modules/@milaboratories/miplots4/dist/scatterplot-umap/index.js.map +1 -1
  163. package/dist/node_modules/@milaboratories/miplots4/dist/types/common.js +3 -1
  164. package/dist/node_modules/@milaboratories/miplots4/dist/types/common.js.map +1 -1
  165. package/dist/node_modules/@milaboratories/miplots4/dist/types/dendro.js +1 -1
  166. package/dist/node_modules/@milaboratories/miplots4/dist/types/dendro.js.map +1 -1
  167. package/dist/node_modules/@milaboratories/miplots4/dist/types/discrete.js +1 -1
  168. package/dist/node_modules/@milaboratories/miplots4/dist/types/discrete.js.map +1 -1
  169. package/dist/node_modules/@milaboratories/miplots4/dist/types/heatmap.js +1 -1
  170. package/dist/node_modules/@milaboratories/miplots4/dist/types/heatmap.js.map +1 -1
  171. package/dist/node_modules/@milaboratories/miplots4/dist/types/histogram.js +1 -1
  172. package/dist/node_modules/@milaboratories/miplots4/dist/types/histogram.js.map +1 -1
  173. package/dist/node_modules/@milaboratories/miplots4/dist/types/scatterplot-umap.js +1 -1
  174. package/dist/node_modules/@milaboratories/miplots4/dist/types/scatterplot-umap.js.map +1 -1
  175. package/dist/node_modules/@milaboratories/miplots4/dist/types/scatterplot.js +4 -4
  176. package/dist/node_modules/@milaboratories/miplots4/dist/types/scatterplot.js.map +1 -1
  177. package/dist/node_modules/@milaboratories/miplots4/dist/utils/TextMeasurer/TextMeasurer.js +39 -0
  178. package/dist/node_modules/@milaboratories/miplots4/dist/utils/TextMeasurer/TextMeasurer.js.map +1 -0
  179. package/dist/node_modules/@milaboratories/miplots4/dist/utils/TextMeasurer/charToWidth.json.js +101 -0
  180. package/dist/node_modules/@milaboratories/miplots4/dist/utils/TextMeasurer/charToWidth.json.js.map +1 -0
  181. package/dist/node_modules/@milaboratories/miplots4/dist/utils/arrangeLegendParts.js +4 -4
  182. package/dist/node_modules/@milaboratories/miplots4/dist/utils/arrangeLegendParts.js.map +1 -1
  183. package/dist/node_modules/@milaboratories/miplots4/dist/utils/getLegendWidth.js +3 -3
  184. package/dist/node_modules/@milaboratories/miplots4/dist/utils/getLegendWidth.js.map +1 -1
  185. package/dist/node_modules/@milaboratories/pf-plots/dist/index.js +1031 -1023
  186. package/dist/node_modules/@milaboratories/pf-plots/dist/index.js.map +1 -1
  187. package/package.json +3 -3
  188. package/dist/node_modules/@milaboratories/miplots4/dist/bubble/getCells.js +0 -91
  189. package/dist/node_modules/@milaboratories/miplots4/dist/bubble/getCells.js.map +0 -1
  190. package/dist/node_modules/@milaboratories/miplots4/dist/node_modules/d3-quadtree/src/add.js +0 -30
  191. package/dist/node_modules/@milaboratories/miplots4/dist/node_modules/d3-quadtree/src/add.js.map +0 -1
  192. package/dist/node_modules/@milaboratories/miplots4/dist/node_modules/d3-quadtree/src/cover.js +0 -29
  193. package/dist/node_modules/@milaboratories/miplots4/dist/node_modules/d3-quadtree/src/cover.js.map +0 -1
  194. package/dist/node_modules/@milaboratories/miplots4/dist/node_modules/d3-quadtree/src/data.js +0 -12
  195. package/dist/node_modules/@milaboratories/miplots4/dist/node_modules/d3-quadtree/src/data.js.map +0 -1
  196. package/dist/node_modules/@milaboratories/miplots4/dist/node_modules/d3-quadtree/src/extent.js +0 -7
  197. package/dist/node_modules/@milaboratories/miplots4/dist/node_modules/d3-quadtree/src/extent.js.map +0 -1
  198. package/dist/node_modules/@milaboratories/miplots4/dist/node_modules/d3-quadtree/src/find.js +0 -26
  199. package/dist/node_modules/@milaboratories/miplots4/dist/node_modules/d3-quadtree/src/find.js.map +0 -1
  200. package/dist/node_modules/@milaboratories/miplots4/dist/node_modules/d3-quadtree/src/quad.js +0 -7
  201. package/dist/node_modules/@milaboratories/miplots4/dist/node_modules/d3-quadtree/src/quad.js.map +0 -1
  202. package/dist/node_modules/@milaboratories/miplots4/dist/node_modules/d3-quadtree/src/quadtree.js +0 -51
  203. package/dist/node_modules/@milaboratories/miplots4/dist/node_modules/d3-quadtree/src/quadtree.js.map +0 -1
  204. package/dist/node_modules/@milaboratories/miplots4/dist/node_modules/d3-quadtree/src/remove.js +0 -21
  205. package/dist/node_modules/@milaboratories/miplots4/dist/node_modules/d3-quadtree/src/remove.js.map +0 -1
  206. package/dist/node_modules/@milaboratories/miplots4/dist/node_modules/d3-quadtree/src/root.js +0 -7
  207. package/dist/node_modules/@milaboratories/miplots4/dist/node_modules/d3-quadtree/src/root.js.map +0 -1
  208. package/dist/node_modules/@milaboratories/miplots4/dist/node_modules/d3-quadtree/src/size.js +0 -12
  209. package/dist/node_modules/@milaboratories/miplots4/dist/node_modules/d3-quadtree/src/size.js.map +0 -1
  210. package/dist/node_modules/@milaboratories/miplots4/dist/node_modules/d3-quadtree/src/visit.js +0 -14
  211. package/dist/node_modules/@milaboratories/miplots4/dist/node_modules/d3-quadtree/src/visit.js.map +0 -1
  212. package/dist/node_modules/@milaboratories/miplots4/dist/node_modules/d3-quadtree/src/visitAfter.js +0 -19
  213. package/dist/node_modules/@milaboratories/miplots4/dist/node_modules/d3-quadtree/src/visitAfter.js.map +0 -1
  214. package/dist/node_modules/@milaboratories/miplots4/dist/node_modules/d3-quadtree/src/x.js +0 -11
  215. package/dist/node_modules/@milaboratories/miplots4/dist/node_modules/d3-quadtree/src/x.js.map +0 -1
  216. package/dist/node_modules/@milaboratories/miplots4/dist/node_modules/d3-quadtree/src/y.js +0 -11
  217. package/dist/node_modules/@milaboratories/miplots4/dist/node_modules/d3-quadtree/src/y.js.map +0 -1
  218. package/dist/node_modules/@milaboratories/miplots4/dist/utils/TextMeasurer.js +0 -24
  219. package/dist/node_modules/@milaboratories/miplots4/dist/utils/TextMeasurer.js.map +0 -1
@@ -1,99 +1,87 @@
1
- import { getOutliersBounds as k } from "../utils/getOutliersBounds.js";
2
- import { getFacetStringKey as C } from "../utils/getFacetStringKey.js";
3
- import N from "../../node_modules/d3-array/src/extent.js";
4
- var S = Object.defineProperty, E = (o, s, a) => s in o ? S(o, s, { enumerable: !0, configurable: !0, writable: !0, value: a }) : o[s] = a, d = (o, s, a) => E(o, typeof s != "symbol" ? s + "" : s, a);
5
- const M = 30;
6
- function F(o, s, a, l, h, p) {
7
- const r = o.map((t) => a(h(t))), i = o.length, u = o.map(g), m = [];
8
- function g(t, c) {
9
- return { key: p(t, c), value: h(t) };
10
- }
11
- let e = 0;
12
- for (let t = 1; t < i; ++t) {
13
- const c = r[e], n = r[t], y = r[t - 1];
14
- if (n >= c + s) {
15
- const b = Math.min((c + y) / 2, n - s);
16
- r.fill(b, e, t), m.push({
17
- x: l(b),
18
- count: t - e,
19
- dots: u.slice(e, t)
20
- }), e = t;
1
+ import { getOutliersBounds as C } from "../utils/getOutliersBounds.js";
2
+ import "../../utils/TextMeasurer/TextMeasurer.js";
3
+ import { getFacetStringKey as D } from "../utils/getFacetStringKey.js";
4
+ import $ from "../../node_modules/d3-array/src/extent.js";
5
+ var S = Object.defineProperty, I = (i, n, r) => n in i ? S(i, n, { enumerable: !0, configurable: !0, writable: !0, value: r }) : i[n] = r, d = (i, n, r) => I(i, typeof n != "symbol" ? n + "" : n, r);
6
+ const Y = 30;
7
+ function O(i, n, r, u, l, g) {
8
+ const a = i.map(l).map(r), s = i.length, h = i.map((e) => ({ key: g(e), value: l(e) })), m = [];
9
+ let o = 0;
10
+ for (let e = 1; e < s; ++e) {
11
+ const c = a[o], f = a[e], t = a[e - 1];
12
+ if (f >= c + n) {
13
+ const p = Math.min((c + t) / 2, f - n);
14
+ a.fill(p, o, e), m.push({
15
+ x: u(p),
16
+ count: e - o,
17
+ dots: h.slice(o, e)
18
+ }), o = e;
21
19
  }
22
20
  }
23
- return r.fill((r[e] + r[i - 1]) / 2, e, i), m.push({
24
- x: l((r[e] + r[i - 1]) / 2),
25
- count: i - e,
26
- dots: u.slice(e, i)
21
+ return a.fill((a[o] + a[s - 1]) / 2, o, s), m.push({
22
+ x: u((a[o] + a[s - 1]) / 2),
23
+ count: s - o,
24
+ dots: h.slice(o, s)
27
25
  }), m;
28
26
  }
29
- class O {
30
- constructor(s, a, l, h, p, r, i, u, m, g) {
31
- d(this, "bins"), d(this, "primaryGrouping"), d(this, "secondaryGrouping"), d(this, "key"), d(this, "boundsY"), this.primaryGrouping = String(l), this.secondaryGrouping = String(h), this.key = `binnedDots_${this.primaryGrouping}_${this.secondaryGrouping}`;
32
- const e = s.filter((t) => u(t) === 0 && m === "log" ? (console.warn(`Item with ${a} = 0 is not shown on chart with log scale`), !1) : !0).sort((t, c) => r(u(t)) - r(u(c)));
33
- this.bins = F(
34
- e,
35
- p,
36
- r,
37
- i,
38
- u,
39
- (t, c) => String(g ? t[g.value] : c)
40
- ), this.boundsY = {
27
+ class V {
28
+ constructor(n, r, u, l, g, a, s, h, m, o) {
29
+ d(this, "bins"), d(this, "primaryGrouping"), d(this, "secondaryGrouping"), d(this, "key"), d(this, "boundsY"), this.primaryGrouping = String(l), this.secondaryGrouping = String(g), this.key = `binnedDots_${this.primaryGrouping}_${this.secondaryGrouping}`;
30
+ const e = (t) => Number(n.getColumnValue(u.value, t)), c = (t) => String(o ? n.getColumnValue(o.value, t) : t), f = r.filter((t) => e(t) === 0 && m === "log" ? (console.warn(`Item with ${u.value} = 0 is not shown on chart with log scale`), !1) : !0).sort((t, p) => s(e(t)) - s(e(p)));
31
+ this.bins = O(f, a, s, h, e, c), this.boundsY = {
41
32
  min: this.bins[0].x,
42
33
  max: this.bins[this.bins.length - 1].x
43
34
  };
44
35
  }
45
36
  }
46
- function P(o, s, a, l, h) {
47
- const p = (n) => h.scale === "log" ? Math.log10(n) : n, r = (n) => h.scale === "log" ? Math.pow(10, n) : n, i = (n) => Number(n[l.value]);
48
- let u = 1 / 0, m = -1 / 0;
49
- const g = a.getRowsByGrouping([]), [e = i(g[0]), t = i(g[0])] = N(
50
- g.filter((n) => Number(n[l.value]) === 0 && h.scale === "log" ? (console.warn(`Item with ${l.value} = 0 is not shown on chart with log scale`), !1) : !0),
51
- (n) => Number(n[l.value])
52
- ), c = Math.abs(p(e) - p(t)) / M;
37
+ function N(i, n, r, u, l) {
38
+ const g = (t) => l.scale === "log" ? Math.log10(t) : t, a = (t) => l.scale === "log" ? Math.pow(10, t) : t, s = (t) => Number(r.getColumnValue(u.value, t));
39
+ let h = 1 / 0, m = -1 / 0;
40
+ const o = r.getRowsByGrouping([]), [e = s(o[0]), c = s(o[0])] = $(
41
+ o.filter((t) => s(t) === 0 && l.scale === "log" ? (console.warn(`Item with ${u.value} = 0 is not shown on chart with log scale`), !1) : !0),
42
+ s
43
+ ), f = Math.abs(g(e) - g(c)) / Y;
53
44
  return {
54
45
  type: "binnedDots",
55
- geoms: s.facet.reduce((n, y) => {
56
- const b = C(y);
57
- return n[b] = [], s.primary.forEach((v) => {
58
- s.secondary.forEach((x) => {
59
- const w = a.getRowsByGrouping([...y, v, x]);
60
- if (!w.length)
46
+ geoms: n.facet.reduce((t, p) => {
47
+ const w = D(p);
48
+ return t[w] = [], n.primary.forEach((v) => {
49
+ n.secondary.forEach((x) => {
50
+ const G = r.getRowsByGrouping([...p, v, x]);
51
+ if (!G.length)
61
52
  return;
62
- let $ = w;
63
- if (!o.aes.showOutliers) {
64
- const [Y, B] = k(w, h.scale, i);
65
- $ = w.filter((D) => {
66
- const G = i(D);
67
- return G >= Y && G <= B;
68
- });
53
+ let y = Array.from(G);
54
+ if (!i.aes.showOutliers) {
55
+ const [k, B] = C(y, l.scale);
56
+ y = y.filter((M) => s(M) >= k && s(M) <= B);
69
57
  }
70
- const f = new O(
71
- $,
72
- l.value,
58
+ const b = new V(
59
+ r,
60
+ y,
61
+ u,
73
62
  v,
74
63
  x,
75
- c,
76
- p,
77
- r,
78
- i,
79
- h.scale,
80
- o.keyColumn
64
+ f,
65
+ g,
66
+ a,
67
+ l.scale,
68
+ i.keyColumn
81
69
  );
82
- f.boundsY.min < u && (u = f.boundsY.min), f.boundsY.max > m && (m = f.boundsY.max), n[b].push(f);
70
+ b.boundsY.min < h && (h = b.boundsY.min), b.boundsY.max > m && (m = b.boundsY.max), t[w].push(b);
83
71
  });
84
- }), n;
72
+ }), t;
85
73
  }, {}),
86
74
  meta: {
87
- minY: Math.min(e, t, u),
88
- maxY: Math.max(e, t, m),
89
- binsCount: M,
90
- hasKeyFromColumn: o.keyColumn !== null
75
+ minY: Math.min(e, c, h),
76
+ maxY: Math.max(e, c, m),
77
+ binsCount: Y,
78
+ hasKeyFromColumn: i.keyColumn !== null
91
79
  },
92
- aes: o.aes
80
+ aes: i.aes
93
81
  };
94
82
  }
95
83
  export {
96
- O as BinnedDots,
97
- P as getBinnedDotsData
84
+ V as BinnedDots,
85
+ N as getBinnedDotsData
98
86
  };
99
87
  //# sourceMappingURL=binnedDots.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"binnedDots.js","sources":["../../../../../../../node_modules/@milaboratories/miplots4/src/discrete/layers/binnedDots.ts"],"sourcesContent":["import type {GroupKey, NO_GROUPED} from '../../DataFrame';\nimport type {DataFrame} from '../../DataFrame';\nimport type {BinnedDotsLayer} from '../DiscreteSettingsImpl';\nimport type {DiscreteSettingsImpl} from '../DiscreteSettingsImpl';\nimport type {BinnedDotsData} from './types';\nimport {getOutliersBounds} from '../utils';\nimport {getFacetStringKey} from '../utils/getFacetStringKey';\nimport type {ColumnName, DataValue, Row} from '../../types';\nimport {extent} from 'd3-array';\n\nconst DEFAULT_BINS_COUNT = 30;\n\nfunction dotbin(\n data: Row[],\n step: number,\n convertToScale: (v: number) => number,\n convertFromScale: (v: number) => number,\n valueGetter: (row: Row) => number,\n keyGetter: (row: Row, idx: number) => string\n) {\n const x = data.map(r => convertToScale(valueGetter(r))); // make a protective copy\n const n = data.length;\n const dotData = data.map(getDotData);\n const result: {x: number; count: number; dots: {key: string; value: number}[]}[] = [];\n\n function getDotData(row: Row, idx: number) {\n return {key: keyGetter(row, idx), value: valueGetter(row)};\n }\n\n let left = 0; // left index of the current bin\n\n // scan from left, group points less than one step away\n for (let j = 1; j < n; ++j) {\n const scaledLeft = x[left];\n const scaledCurrent = x[j];\n const scaledPrev = x[j - 1];\n if (scaledCurrent >= scaledLeft + step) {\n // use span mid-point, unless that could cause overlap\n const xmid = Math.min((scaledLeft + scaledPrev) / 2, scaledCurrent - step);\n x.fill(xmid, left, j);\n result.push({\n x: convertFromScale(xmid),\n count: j - left,\n dots: dotData.slice(left, j),\n });\n left = j;\n }\n }\n x.fill((x[left] + x[n - 1]) / 2, left, n);\n result.push({\n x: convertFromScale((x[left] + x[n - 1]) / 2),\n count: n - left,\n dots: dotData.slice(left, n),\n });\n\n return result;\n}\n\nexport class BinnedDots {\n bins: {x: number; count: number; dots: {key: string; value: number}[]}[];\n primaryGrouping: string;\n secondaryGrouping: string;\n key: string;\n\n boundsY: {\n min: number;\n max: number;\n };\n\n constructor(\n valueRows: Row[],\n valueColumn: string,\n primaryGrouping: DataValue | typeof NO_GROUPED,\n secondaryGrouping: DataValue | typeof NO_GROUPED,\n step: number,\n convertToScale: (v: number) => number,\n convertFromScale: (v: number) => number,\n yGetter: (r: Row) => number,\n scale: 'log' | 'linear',\n keyColumn: ColumnName | null\n ) {\n this.primaryGrouping = String(primaryGrouping);\n this.secondaryGrouping = String(secondaryGrouping);\n this.key = `binnedDots_${this.primaryGrouping}_${this.secondaryGrouping}`;\n\n const sortedGroup = valueRows\n .filter(row => {\n if (yGetter(row) === 0 && scale === 'log') {\n console.warn(`Item with ${valueColumn} = 0 is not shown on chart with log scale`);\n return false;\n }\n return true;\n })\n .sort((a, b) => convertToScale(yGetter(a)) - convertToScale(yGetter(b)));\n\n this.bins = dotbin(sortedGroup, step, convertToScale, convertFromScale, yGetter, (row: Row, idx: number) =>\n String(keyColumn ? row[keyColumn.value] : idx)\n );\n this.boundsY = {\n min: this.bins[0].x,\n max: this.bins[this.bins.length - 1].x,\n };\n }\n}\n\nexport function getBinnedDotsData(\n layer: BinnedDotsLayer,\n groupingKeys: {\n facet: GroupKey[][],\n primary: GroupKey[],\n secondary: GroupKey[]\n },\n data: DataFrame,\n y: DiscreteSettingsImpl['y'],\n yAxis: DiscreteSettingsImpl['chartSettings']['yAxis']\n): BinnedDotsData {\n const convertToScale = (v: number) => (yAxis.scale === 'log' ? Math.log10(v) : v);\n const convertFromScale = (v: number) => (yAxis.scale === 'log' ? Math.pow(10, v) : v);\n const yGetter = (row: Row) => Number(row[y.value]);\n let minY = Infinity;\n let maxY = -Infinity;\n\n const allRows = data.getRowsByGrouping([]);\n const [bound1 = yGetter(allRows[0]), bound2 = yGetter(allRows[0])] = extent(\n allRows.filter(row => {\n if (Number(row[y.value]) === 0 && yAxis.scale === 'log') {\n console.warn(`Item with ${y.value} = 0 is not shown on chart with log scale`);\n return false;\n }\n return true;\n }),\n row => Number(row[y.value])\n );\n const step = Math.abs(convertToScale(bound1) - convertToScale(bound2)) / DEFAULT_BINS_COUNT;\n\n const binnedDotsGroups = groupingKeys.facet.reduce((res: Record<string, BinnedDots[]>, facetKey) => {\n const strFacetKey = getFacetStringKey(facetKey);\n res[strFacetKey] = [];\n groupingKeys.primary.forEach(primaryKey => {\n groupingKeys.secondary.forEach(secondaryKey => {\n const valueRows = data.getRowsByGrouping([...facetKey, primaryKey, secondaryKey]);\n if (!valueRows.length) {\n return;\n }\n let valueRowsFiltered = valueRows;\n if (!layer.aes.showOutliers) {\n const [boundsMin, boundMax] = getOutliersBounds(valueRows, yAxis.scale, yGetter);\n valueRowsFiltered = valueRows.filter((row: Row) => {\n const value = yGetter(row);\n return value >= boundsMin && value <= boundMax;\n });\n }\n const binnedDots = new BinnedDots(\n valueRowsFiltered,\n y.value,\n primaryKey,\n secondaryKey,\n step,\n convertToScale,\n convertFromScale,\n yGetter,\n yAxis.scale,\n layer.keyColumn\n );\n\n if (binnedDots.boundsY.min < minY) {\n minY = binnedDots.boundsY.min;\n }\n if (binnedDots.boundsY.max > maxY) {\n maxY = binnedDots.boundsY.max;\n }\n res[strFacetKey].push(binnedDots);\n });\n });\n return res;\n }, {});\n\n return {\n type: 'binnedDots',\n geoms: binnedDotsGroups,\n meta: {\n minY: Math.min(bound1, bound2, minY),\n maxY: Math.max(bound1, bound2, maxY),\n binsCount: DEFAULT_BINS_COUNT,\n hasKeyFromColumn: layer.keyColumn !== null,\n },\n aes: layer.aes,\n };\n}\n"],"names":["DEFAULT_BINS_COUNT","dotbin","data","step","convertToScale","convertFromScale","valueGetter","keyGetter","x","r","n","dotData","getDotData","result","row","idx","left","j","scaledLeft","scaledCurrent","scaledPrev","xmid","BinnedDots","valueRows","valueColumn","primaryGrouping","secondaryGrouping","yGetter","scale","keyColumn","__publicField","sortedGroup","a","b","getBinnedDotsData","layer","groupingKeys","y","yAxis","v","minY","maxY","allRows","bound1","bound2","extent","res","facetKey","strFacetKey","getFacetStringKey","primaryKey","secondaryKey","valueRowsFiltered","boundsMin","boundMax","getOutliersBounds","value","binnedDots"],"mappings":"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","x_google_ignoreList":[0]}
1
+ {"version":3,"file":"binnedDots.js","sources":["../../../../../../../node_modules/@milaboratories/miplots4/src/discrete/layers/binnedDots.ts"],"sourcesContent":["import { extent } from 'd3-array';\nimport type { DataFrame, GroupKey, NO_GROUPED, RowIndex } from '../../DataFrame';\nimport type { ColumnName, DataValue } from '../../types';\nimport type { BinnedDotsLayer, DiscreteSettingsImpl } from '../DiscreteSettingsImpl';\nimport { getOutliersBounds } from '../utils';\nimport { getFacetStringKey } from '../utils/getFacetStringKey';\nimport type { BinnedDotsData } from './types';\n\nconst DEFAULT_BINS_COUNT = 30;\n\nfunction dotbin(\n indexes: RowIndex[],\n step: number,\n convertToScale: (v: number) => number,\n convertFromScale: (v: number) => number,\n valueGetter: (idx: number) => number,\n keyGetter: (idx: number) => string\n) {\n const x = indexes.map(valueGetter).map(convertToScale); // make a protective copy\n const n = indexes.length;\n const dotData = indexes.map((idx) => ({ key: keyGetter(idx), value: valueGetter(idx) }));\n const result: { x: number; count: number; dots: { key: string; value: number }[] }[] = [];\n\n let left = 0; // left index of the current bin\n\n // scan from left, group points less than one step away\n for (let j = 1; j < n; ++j) {\n const scaledLeft = x[left];\n const scaledCurrent = x[j];\n const scaledPrev = x[j - 1];\n if (scaledCurrent >= scaledLeft + step) {\n // use span mid-point, unless that could cause overlap\n const xmid = Math.min((scaledLeft + scaledPrev) / 2, scaledCurrent - step);\n x.fill(xmid, left, j);\n result.push({\n x: convertFromScale(xmid),\n count: j - left,\n dots: dotData.slice(left, j),\n });\n left = j;\n }\n }\n x.fill((x[left] + x[n - 1]) / 2, left, n);\n result.push({\n x: convertFromScale((x[left] + x[n - 1]) / 2),\n count: n - left,\n dots: dotData.slice(left, n),\n });\n\n return result;\n}\n\nexport class BinnedDots {\n bins: {x: number; count: number; dots: {key: string; value: number}[]}[];\n primaryGrouping: string;\n secondaryGrouping: string;\n key: string;\n\n boundsY: {\n min: number;\n max: number;\n };\n\n constructor(\n dataFrame: DataFrame,\n indexes: RowIndex[],\n column: ColumnName,\n primaryGrouping: DataValue | typeof NO_GROUPED,\n secondaryGrouping: DataValue | typeof NO_GROUPED,\n step: number,\n convertToScale: (v: number) => number,\n convertFromScale: (v: number) => number,\n scale: 'log' | 'linear',\n keyColumn: ColumnName | null\n ) {\n this.primaryGrouping = String(primaryGrouping);\n this.secondaryGrouping = String(secondaryGrouping);\n this.key = `binnedDots_${this.primaryGrouping}_${this.secondaryGrouping}`;\n\n const valueGetter = (idx: number) => Number(dataFrame.getColumnValue(column.value, idx));\n const keyGetter = (idx: number) => String(keyColumn ? dataFrame.getColumnValue(keyColumn.value, idx) : idx);\n const sortedGroup = indexes\n .filter(idx => {\n const y = valueGetter(idx);\n if (y === 0 && scale === 'log') {\n console.warn(`Item with ${column.value} = 0 is not shown on chart with log scale`);\n return false;\n }\n return true;\n })\n .sort((a, b) => convertToScale(valueGetter(a)) - convertToScale(valueGetter(b)));\n\n this.bins = dotbin(sortedGroup, step, convertToScale, convertFromScale, valueGetter, keyGetter);\n this.boundsY = {\n min: this.bins[0].x,\n max: this.bins[this.bins.length - 1].x,\n };\n }\n}\n\nexport function getBinnedDotsData(\n layer: BinnedDotsLayer,\n groupingKeys: {\n facet: GroupKey[][],\n primary: GroupKey[],\n secondary: GroupKey[]\n },\n data: DataFrame,\n y: DiscreteSettingsImpl['y'],\n yAxis: DiscreteSettingsImpl['chartSettings']['yAxis']\n): BinnedDotsData {\n const convertToScale = (v: number) => (yAxis.scale === 'log' ? Math.log10(v) : v);\n const convertFromScale = (v: number) => (yAxis.scale === 'log' ? Math.pow(10, v) : v);\n const yGetter = (idx: number) => Number(data.getColumnValue(y.value, idx));\n let minY = Infinity;\n let maxY = -Infinity;\n\n const allRowIndexes = data.getRowsByGrouping([]);\n const [bound1 = yGetter(allRowIndexes[0]), bound2 = yGetter(allRowIndexes[0])] = extent(\n allRowIndexes.filter(idx => {\n if (yGetter(idx) === 0 && yAxis.scale === 'log') {\n console.warn(`Item with ${y.value} = 0 is not shown on chart with log scale`);\n return false;\n }\n return true;\n }),\n yGetter\n );\n const step = Math.abs(convertToScale(bound1) - convertToScale(bound2)) / DEFAULT_BINS_COUNT;\n\n const binnedDotsGroups = groupingKeys.facet.reduce((res: Record<string, BinnedDots[]>, facetKey) => {\n const strFacetKey = getFacetStringKey(facetKey);\n res[strFacetKey] = [];\n groupingKeys.primary.forEach(primaryKey => {\n groupingKeys.secondary.forEach(secondaryKey => {\n const indexes = data.getRowsByGrouping([...facetKey, primaryKey, secondaryKey]);\n if (!indexes.length) {\n return;\n }\n let valueIndexesFiltered = Array.from(indexes);\n if (!layer.aes.showOutliers) {\n const [boundsMin, boundMax] = getOutliersBounds(valueIndexesFiltered, yAxis.scale);\n valueIndexesFiltered = valueIndexesFiltered.filter((idx: RowIndex) => {\n return yGetter(idx) >= boundsMin && yGetter(idx) <= boundMax;\n });\n }\n const binnedDots = new BinnedDots(\n data,\n valueIndexesFiltered,\n y,\n primaryKey,\n secondaryKey,\n step,\n convertToScale,\n convertFromScale,\n yAxis.scale,\n layer.keyColumn\n );\n\n if (binnedDots.boundsY.min < minY) {\n minY = binnedDots.boundsY.min;\n }\n if (binnedDots.boundsY.max > maxY) {\n maxY = binnedDots.boundsY.max;\n }\n res[strFacetKey].push(binnedDots);\n });\n });\n return res;\n }, {});\n\n return {\n type: 'binnedDots',\n geoms: binnedDotsGroups,\n meta: {\n minY: Math.min(bound1, bound2, minY),\n maxY: Math.max(bound1, bound2, maxY),\n binsCount: DEFAULT_BINS_COUNT,\n hasKeyFromColumn: layer.keyColumn !== null,\n },\n aes: layer.aes,\n };\n}\n"],"names":["DEFAULT_BINS_COUNT","dotbin","indexes","step","convertToScale","convertFromScale","valueGetter","keyGetter","x","n","dotData","idx","result","left","j","scaledLeft","scaledCurrent","scaledPrev","xmid","BinnedDots","dataFrame","column","primaryGrouping","secondaryGrouping","scale","keyColumn","__publicField","sortedGroup","a","b","getBinnedDotsData","layer","groupingKeys","data","y","yAxis","v","yGetter","minY","maxY","allRowIndexes","bound1","bound2","extent","res","facetKey","strFacetKey","getFacetStringKey","primaryKey","secondaryKey","valueIndexesFiltered","boundsMin","boundMax","getOutliersBounds","binnedDots"],"mappings":"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","x_google_ignoreList":[0]}
@@ -1,77 +1,76 @@
1
- import { getFacetStringKey as S } from "../utils/getFacetStringKey.js";
2
- import $ from "../../node_modules/lodash/lodash.js";
1
+ import M from "../../node_modules/lodash/lodash.js";
2
+ import { getFacetStringKey as $ } from "../utils/getFacetStringKey.js";
3
3
  import { quantileSorted as w } from "../../node_modules/d3-array/src/quantile.js";
4
- import k from "../../node_modules/d3-array/src/min.js";
5
- import I from "../../node_modules/d3-array/src/max.js";
6
- import B from "../../node_modules/d3-array/src/extent.js";
7
- var _ = Object.defineProperty, j = (i, t, o) => t in i ? _(i, t, { enumerable: !0, configurable: !0, writable: !0, value: o }) : i[t] = o, n = (i, t, o) => j(i, typeof t != "symbol" ? t + "" : t, o);
8
- function q(i, t, o, c = !1) {
9
- const a = i.map(t).sort((h, e) => h - e);
10
- if (c) {
11
- const h = $.find(a, (e) => e > 0);
12
- if (!h)
4
+ import E from "../../node_modules/d3-array/src/min.js";
5
+ import S from "../../node_modules/d3-array/src/max.js";
6
+ import k from "../../node_modules/d3-array/src/extent.js";
7
+ var I = Object.defineProperty, B = (t, r, i) => r in t ? I(t, r, { enumerable: !0, configurable: !0, writable: !0, value: i }) : t[r] = i, s = (t, r, i) => B(t, typeof r != "symbol" ? r + "" : r, i);
8
+ function C(t, r, i = !1) {
9
+ const a = t.sort((n, e) => n - e);
10
+ if (i) {
11
+ const n = M.find(a, (e) => e > 0);
12
+ if (!n)
13
13
  throw Error("Group with all zeros in log scale");
14
- return a.map((e) => e === 0 ? h : e).map(o);
14
+ return a.map((e) => e === 0 ? n : e).map(r);
15
15
  }
16
- return a.map(o);
16
+ return a.map(r);
17
17
  }
18
- class O {
19
- constructor(t, o, c, a, h, e, u, l, p, d, g = !0) {
20
- if (n(this, "lower"), n(this, "middle"), n(this, "upper"), n(this, "min"), n(this, "max"), n(this, "outliers"), n(this, "primaryGrouping"), n(this, "secondaryGrouping"), n(this, "key"), n(this, "boundsY"), t.length === 0)
18
+ class A {
19
+ constructor(r, i, a, n, e, u, h, p, d, c = !0) {
20
+ if (s(this, "lower"), s(this, "middle"), s(this, "upper"), s(this, "min"), s(this, "max"), s(this, "outliers"), s(this, "primaryGrouping"), s(this, "secondaryGrouping"), s(this, "key"), s(this, "boundsY"), r.length === 0)
21
21
  throw Error("Unable to create box on empty data");
22
- if (u > l || u > p || l > p)
23
- throw Error(`Invalid box bounds values: lower=${u}, middle=${l}, upper=${p}`);
22
+ if (u > h || u > p || h > p)
23
+ throw Error(`Invalid box bounds values: lower=${u}, middle=${h}, upper=${p}`);
24
24
  if (d < 0)
25
25
  throw Error(`Invalid box whiskers coefficient: k=${d}. It should be positive`);
26
- const m = (r) => Number(r[o]);
27
- this.primaryGrouping = String(h), this.secondaryGrouping = String(e), this.key = `box_${this.primaryGrouping}_${this.secondaryGrouping}`;
28
- const x = (r) => a === "log" ? Math.log10(r) : r, s = (r) => a === "log" ? Math.pow(10, r) : r, b = q(t, m, x, a === "log"), f = w(b, u), Y = w(b, l), y = w(b, p), v = y - f;
29
- this.upper = s(y), this.middle = s(Y), this.lower = s(f), this.min = Math.max(k(t, m), s(f - d * v)), this.max = Math.min(I(t, m), s(y + d * v)), this.outliers = t.filter((r) => m(r) < this.min || m(r) > this.max).map((r, M) => ({
30
- y: m(r),
31
- data: r,
32
- id: String(c ? r[c] : M)
26
+ this.primaryGrouping = String(n), this.secondaryGrouping = String(e), this.key = `box_${this.primaryGrouping}_${this.secondaryGrouping}`;
27
+ const y = (o) => a === "log" ? Math.log10(o) : o, l = (o) => a === "log" ? Math.pow(10, o) : o, f = C(r, y, a === "log"), x = w(f, u), b = w(f, h), m = w(f, p), g = m - x;
28
+ this.upper = l(m), this.middle = l(b), this.lower = l(x), this.min = Math.max(E(r), l(x - d * g)), this.max = Math.min(S(r), l(m + d * g)), this.outliers = r.filter((o) => o < this.min || o > this.max).map((o, v) => ({
29
+ y: o,
30
+ id: i[v] ?? String(v)
33
31
  }));
34
- const [G = 1 / 0, E = -1 / 0] = B(this.outliers, (r) => r.y);
32
+ const [G = 1 / 0, Y = -1 / 0] = k(this.outliers, (o) => o.y);
35
33
  this.boundsY = {
36
- min: g ? Math.min(this.min, G) : this.min,
37
- max: g ? Math.max(this.max, E) : this.max
34
+ min: c ? Math.min(this.min, G) : this.min,
35
+ max: c ? Math.max(this.max, Y) : this.max
38
36
  };
39
37
  }
40
38
  }
41
- function R(i, t, o, c, a, h) {
42
- let e = 1 / 0, u = -1 / 0;
39
+ function q(t, r, i, a, n, e) {
40
+ let u = 1 / 0, h = -1 / 0;
43
41
  return {
44
42
  type: "box",
45
- geoms: t.facet.reduce((l, p) => {
46
- const d = S(p);
47
- return l[d] = [], t.primary.forEach((g) => {
48
- t.secondary.forEach((m) => {
49
- const x = o.getRowsByGrouping([...p, g, m]);
50
- if (!x.length)
43
+ geoms: r.facet.reduce((p, d) => {
44
+ const c = $(d);
45
+ return p[c] = [], r.primary.forEach((y) => {
46
+ r.secondary.forEach((l) => {
47
+ const f = i.getRowsByGrouping([...d, y, l]);
48
+ if (!f.length)
51
49
  return;
52
- const s = new O(
50
+ const x = Array.from(f).map((g) => i.getColumnValue(a.value, g)), b = Array.from(f).map(
51
+ (g) => String((n ? i.getColumnValue(n.value, g) : void 0) ?? g)
52
+ ), m = new A(
53
53
  x,
54
- c.value,
55
- (a == null ? void 0 : a.value) ?? null,
56
- h.scale,
57
- g,
58
- m,
59
- i.stat.lower,
60
- i.stat.medium,
61
- i.stat.upper,
62
- i.stat.k,
63
- i.aes.showOutliers
54
+ b,
55
+ e.scale,
56
+ y,
57
+ l,
58
+ t.stat.lower,
59
+ t.stat.medium,
60
+ t.stat.upper,
61
+ t.stat.k,
62
+ t.aes.showOutliers
64
63
  );
65
- s.boundsY.min < e && (e = s.boundsY.min), s.boundsY.max > u && (u = s.boundsY.max), l[d].push(s);
64
+ m.boundsY.min < u && (u = m.boundsY.min), m.boundsY.max > h && (h = m.boundsY.max), p[c].push(m);
66
65
  });
67
- }), l;
66
+ }), p;
68
67
  }, {}),
69
- meta: { minY: e, maxY: u },
70
- aes: i.aes
68
+ meta: { minY: u, maxY: h },
69
+ aes: t.aes
71
70
  };
72
71
  }
73
72
  export {
74
- O as Box,
75
- R as getBoxesData
73
+ A as Box,
74
+ q as getBoxesData
76
75
  };
77
76
  //# sourceMappingURL=boxes.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"boxes.js","sources":["../../../../../../../node_modules/@milaboratories/miplots4/src/discrete/layers/boxes.ts"],"sourcesContent":["import type { NO_GROUPED} from '../../DataFrame';\nimport type {DataFrame,GroupKey} from '../../DataFrame';\nimport type {BoxLayer, DiscreteSettingsImpl} from '../DiscreteSettingsImpl';\nimport type {BoxesData} from './types';\nimport {getFacetStringKey} from '../utils/getFacetStringKey';\nimport {extent, max, min, quantileSorted} from 'd3-array';\nimport type {ColumnName, DataValue, Row} from '../../types';\nimport lodash from 'lodash';\n\nfunction getSortedConvertedValues (valuesRows: Row[], yGetter:(row:Row) => number, convertToScale:(v:number) => number, changeZeros = false) {\n const valuesSorted = valuesRows.map(yGetter).sort((a, b) => a - b);\n if (changeZeros) {\n const firstMoreThanZero = lodash.find(valuesSorted, (v) => v > 0);\n if (!firstMoreThanZero) {\n throw Error('Group with all zeros in log scale');\n }\n return valuesSorted.map((v) => v === 0 ? firstMoreThanZero : v).map(convertToScale);\n }\n return valuesSorted.map(convertToScale);\n}\n\nexport class Box {\n lower: number;\n middle: number;\n upper: number;\n min: number;\n max: number;\n outliers: {\n y: number;\n id: string;\n data: Row;\n }[];\n\n // Saved data for linking with visual properties (set color by grouping etc.)\n primaryGrouping: GroupKey;\n secondaryGrouping: GroupKey;\n key: string;\n\n // Bounds for correct chart viewport\n boundsY: {\n min: number;\n max: number;\n };\n\n constructor(\n valuesRows: Row[],\n valueColumn: string,\n keyColumn: string | null,\n scale: 'linear' | 'log',\n primaryGrouping: DataValue | typeof NO_GROUPED,\n secondaryGrouping: DataValue | typeof NO_GROUPED,\n lower: number,\n middle: number,\n upper: number,\n k: number,\n showOutliers = true\n ) {\n if (valuesRows.length === 0) {\n throw Error('Unable to create box on empty data');\n }\n if (lower > middle || lower > upper || middle > upper) {\n throw Error(`Invalid box bounds values: lower=${lower}, middle=${middle}, upper=${upper}`);\n }\n if (k < 0) {\n throw Error(`Invalid box whiskers coefficient: k=${k}. It should be positive`);\n }\n const yGetter = (row: Row) => Number(row[valueColumn]);\n\n this.primaryGrouping = String(primaryGrouping);\n this.secondaryGrouping = String(secondaryGrouping);\n this.key = `box_${this.primaryGrouping}_${this.secondaryGrouping}`;\n\n //TODO: for speed use own quantile calculation; for comparison https://github.com/JetBrains/lets-plot/blob/ef4aecfa451b332e6e7544cfb3a2118c873f09c6/plot-base-portable/src/commonMain/kotlin/jetbrains/datalore/plot/base/stat/FiveNumberSummary.kt#L17\n const convertToScale = (v: number) => (scale === 'log' ? Math.log10(v) : v);\n const convertFromScale = (v: number) => (scale === 'log' ? Math.pow(10, v) : v);\n\n // throw error for values <= 1\n const valuesSortedConverted = getSortedConvertedValues(valuesRows, yGetter, convertToScale, scale === 'log');\n\n const q1 = quantileSorted(valuesSortedConverted, lower) as number;\n const q2 = quantileSorted(valuesSortedConverted, middle) as number;\n const q3 = quantileSorted(valuesSortedConverted, upper) as number;\n const interQuantileRange = q3 - q1;\n\n this.upper = convertFromScale(q3);\n this.middle = convertFromScale(q2);\n this.lower = convertFromScale(q1);\n // NB: Cut whiskers by min and max array values\n this.min = Math.max(min(valuesRows, yGetter) as number, convertFromScale(q1 - k * interQuantileRange));\n this.max = Math.min(max(valuesRows, yGetter) as number, convertFromScale(q3 + k * interQuantileRange));\n this.outliers = valuesRows\n .filter(row => yGetter(row) < this.min || yGetter(row) > this.max)\n .map((row, idx) => ({\n y: yGetter(row),\n data: row,\n id: keyColumn ? String(row[keyColumn]) : String(idx),\n }));\n\n const [minOutlier = Infinity, maxOutlier = -Infinity] = extent(this.outliers, item => item.y);\n this.boundsY = {\n min: showOutliers ? Math.min(this.min, minOutlier) : this.min,\n max: showOutliers ? Math.max(this.max, maxOutlier) : this.max,\n };\n }\n}\n\nexport function getBoxesData(\n layer: BoxLayer,\n groupingKeys: {\n facet: GroupKey[][],\n primary: GroupKey[],\n secondary: GroupKey[]\n },\n data: DataFrame,\n y: ColumnName,\n keyColumn: ColumnName | null,\n yAxis: DiscreteSettingsImpl['chartSettings']['yAxis']\n): BoxesData {\n let minY = Infinity;\n let maxY = -Infinity;\n\n return {\n type: 'box',\n geoms: groupingKeys.facet.reduce((res: Record<string, Box[]>, facetKey) => {\n const strFacetKey = getFacetStringKey(facetKey);\n res[strFacetKey] = [];\n groupingKeys.primary.forEach(primaryKey => {\n groupingKeys.secondary.forEach(secondaryKey => {\n const rowValues = data.getRowsByGrouping([...facetKey, primaryKey, secondaryKey]);\n if (!rowValues.length) {\n return;\n }\n const box = new Box(\n rowValues,\n y.value,\n keyColumn?.value ?? null,\n yAxis.scale,\n primaryKey,\n secondaryKey,\n layer.stat.lower,\n layer.stat.medium,\n layer.stat.upper,\n layer.stat.k,\n layer.aes.showOutliers\n );\n if (box.boundsY.min < minY) {\n minY = box.boundsY.min;\n }\n if (box.boundsY.max > maxY) {\n maxY = box.boundsY.max;\n }\n res[strFacetKey].push(box);\n });\n });\n return res;\n }, {} as Record<GroupKey, Box[]>),\n meta: {minY, maxY},\n aes: layer.aes,\n };\n}\n"],"names":["getSortedConvertedValues","valuesRows","yGetter","convertToScale","changeZeros","valuesSorted","a","b","firstMoreThanZero","lodash","v","Box","valueColumn","keyColumn","scale","primaryGrouping","secondaryGrouping","lower","middle","upper","k","showOutliers","__publicField","row","convertFromScale","valuesSortedConverted","q1","quantileSorted","q2","q3","interQuantileRange","min","max","i","idx","minOutlier","maxOutlier","extent","item","getBoxesData","layer","groupingKeys","data","y","yAxis","minY","maxY","res","facetKey","strFacetKey","getFacetStringKey","primaryKey","secondaryKey","rowValues","box"],"mappings":"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","x_google_ignoreList":[0]}
1
+ {"version":3,"file":"boxes.js","sources":["../../../../../../../node_modules/@milaboratories/miplots4/src/discrete/layers/boxes.ts"],"sourcesContent":["import { extent, max, min, quantileSorted } from 'd3-array';\nimport lodash from 'lodash';\nimport type { DataFrame, GroupKey, NO_GROUPED } from '../../DataFrame';\nimport type { ColumnName, DataValue } from '../../types';\nimport type { BoxLayer, DiscreteSettingsImpl } from '../DiscreteSettingsImpl';\nimport { getFacetStringKey } from '../utils/getFacetStringKey';\nimport type { BoxesData } from './types';\n\nfunction getSortedConvertedValues (valuesRows: number[], convertToScale:(v:number) => number, changeZeros = false) {\n const valuesSorted = valuesRows.sort((a, b) => a - b);\n if (changeZeros) {\n const firstMoreThanZero = lodash.find(valuesSorted, (v) => v > 0);\n if (!firstMoreThanZero) {\n throw Error('Group with all zeros in log scale');\n }\n return valuesSorted.map((v) => v === 0 ? firstMoreThanZero : v).map(convertToScale);\n }\n return valuesSorted.map(convertToScale);\n}\n\nexport class Box {\n lower: number;\n middle: number;\n upper: number;\n min: number;\n max: number;\n outliers: {\n y: number;\n id: string;\n }[];\n\n // Saved data for linking with visual properties (set color by grouping etc.)\n primaryGrouping: GroupKey;\n secondaryGrouping: GroupKey;\n key: string;\n\n // Bounds for correct chart viewport\n boundsY: {\n min: number;\n max: number;\n };\n\n constructor(\n values: number[],\n keys: string[],\n scale: 'linear' | 'log',\n primaryGrouping: DataValue | typeof NO_GROUPED,\n secondaryGrouping: DataValue | typeof NO_GROUPED,\n lower: number,\n middle: number,\n upper: number,\n k: number,\n showOutliers = true\n ) {\n if (values.length === 0) {\n throw Error('Unable to create box on empty data');\n }\n if (lower > middle || lower > upper || middle > upper) {\n throw Error(`Invalid box bounds values: lower=${lower}, middle=${middle}, upper=${upper}`);\n }\n if (k < 0) {\n throw Error(`Invalid box whiskers coefficient: k=${k}. It should be positive`);\n }\n\n this.primaryGrouping = String(primaryGrouping);\n this.secondaryGrouping = String(secondaryGrouping);\n this.key = `box_${this.primaryGrouping}_${this.secondaryGrouping}`;\n\n //TODO: for speed use own quantile calculation; for comparison https://github.com/JetBrains/lets-plot/blob/ef4aecfa451b332e6e7544cfb3a2118c873f09c6/plot-base-portable/src/commonMain/kotlin/jetbrains/datalore/plot/base/stat/FiveNumberSummary.kt#L17\n const convertToScale = (v: number) => (scale === 'log' ? Math.log10(v) : v);\n const convertFromScale = (v: number) => (scale === 'log' ? Math.pow(10, v) : v);\n\n // throw error for values <= 1\n const valuesSortedConverted = getSortedConvertedValues(values, convertToScale, scale === 'log');\n\n const q1 = quantileSorted(valuesSortedConverted, lower) as number;\n const q2 = quantileSorted(valuesSortedConverted, middle) as number;\n const q3 = quantileSorted(valuesSortedConverted, upper) as number;\n const interQuantileRange = q3 - q1;\n\n this.upper = convertFromScale(q3);\n this.middle = convertFromScale(q2);\n this.lower = convertFromScale(q1);\n // NB: Cut whiskers by min and max array values\n this.min = Math.max(min(values) as number, convertFromScale(q1 - k * interQuantileRange));\n this.max = Math.min(max(values) as number, convertFromScale(q3 + k * interQuantileRange));\n this.outliers = values\n .filter((y: number) => y < this.min || y > this.max)\n .map((y, idx) => ({\n y,\n id: keys[idx] ?? String(idx),\n }));\n\n const [minOutlier = Infinity, maxOutlier = -Infinity] = extent(this.outliers, item => item.y);\n this.boundsY = {\n min: showOutliers ? Math.min(this.min, minOutlier) : this.min,\n max: showOutliers ? Math.max(this.max, maxOutlier) : this.max,\n };\n }\n}\n\nexport function getBoxesData(\n layer: BoxLayer,\n groupingKeys: {\n facet: GroupKey[][],\n primary: GroupKey[],\n secondary: GroupKey[]\n },\n data: DataFrame,\n y: ColumnName,\n keyColumn: ColumnName | null,\n yAxis: DiscreteSettingsImpl['chartSettings']['yAxis']\n): BoxesData {\n let minY = Infinity;\n let maxY = -Infinity;\n\n return {\n type: 'box',\n geoms: groupingKeys.facet.reduce((res: Record<string, Box[]>, facetKey) => {\n const strFacetKey = getFacetStringKey(facetKey);\n res[strFacetKey] = [];\n groupingKeys.primary.forEach(primaryKey => {\n groupingKeys.secondary.forEach(secondaryKey => {\n const indexes = data.getRowsByGrouping([...facetKey, primaryKey, secondaryKey]);\n if (!indexes.length) {\n return;\n }\n const values = Array.from(indexes).map(i => data.getColumnValue(y.value, i) as number);\n const keys = Array.from(indexes).map(i =>\n String((keyColumn ? data.getColumnValue(keyColumn.value, i) : undefined) ?? i)\n );\n const box = new Box(\n values,\n keys,\n yAxis.scale,\n primaryKey,\n secondaryKey,\n layer.stat.lower,\n layer.stat.medium,\n layer.stat.upper,\n layer.stat.k,\n layer.aes.showOutliers\n );\n if (box.boundsY.min < minY) {\n minY = box.boundsY.min;\n }\n if (box.boundsY.max > maxY) {\n maxY = box.boundsY.max;\n }\n res[strFacetKey].push(box);\n });\n });\n return res;\n }, {} as Record<GroupKey, Box[]>),\n meta: {minY, maxY},\n aes: layer.aes,\n };\n}\n"],"names":["getSortedConvertedValues","valuesRows","convertToScale","changeZeros","valuesSorted","a","b","firstMoreThanZero","lodash","v","Box","values","keys","scale","primaryGrouping","secondaryGrouping","lower","middle","upper","k","showOutliers","__publicField","convertFromScale","valuesSortedConverted","q1","quantileSorted","q2","q3","interQuantileRange","min","max","y","idx","minOutlier","maxOutlier","extent","item","getBoxesData","layer","groupingKeys","data","keyColumn","yAxis","minY","maxY","res","facetKey","strFacetKey","getFacetStringKey","primaryKey","secondaryKey","indexes","i","box"],"mappings":"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","x_google_ignoreList":[0]}
@@ -1,46 +1,46 @@
1
- import { getOutliersBounds as O } from "../utils/getOutliersBounds.js";
2
- import { getFacetStringKey as Y } from "../utils/getFacetStringKey.js";
3
- import b from "../../node_modules/d3-random/src/lcg.js";
4
- import w from "../../node_modules/d3-array/src/extent.js";
5
- function $(p, e, h, G, v, f) {
6
- let n = 1 / 0, o = -1 / 0;
7
- const x = b(1);
1
+ import { getOutliersBounds as b } from "../utils/getOutliersBounds.js";
2
+ import "../../utils/TextMeasurer/TextMeasurer.js";
3
+ import { getFacetStringKey as v } from "../utils/getFacetStringKey.js";
4
+ import w from "../../node_modules/d3-random/src/lcg.js";
5
+ import B from "../../node_modules/d3-array/src/extent.js";
6
+ function j(l, o, n, G, x, p) {
7
+ let s = 1 / 0, a = -1 / 0;
8
+ const V = w(1);
8
9
  return {
9
10
  type: "dot",
10
- geoms: e.facet.reduce((a, y) => {
11
- const d = Y(y);
12
- return a[d] = [], e.primary.forEach((s) => {
13
- e.secondary.forEach((i) => {
14
- const m = h.getRowsByGrouping([...y, s, i]);
15
- if (!m.length)
11
+ geoms: o.facet.reduce((i, f) => {
12
+ const y = v(f);
13
+ return i[y] = [], o.primary.forEach((m) => {
14
+ o.secondary.forEach((u) => {
15
+ const d = n.getRowsByGrouping([...f, m, u]);
16
+ if (!d.length)
16
17
  return;
17
- const l = (t) => Number(t[G.value]);
18
- let r = m.map((t, g) => ({
19
- y: l(t),
20
- jitter: x(),
21
- id: String(f ? t[f.value] : g),
22
- data: t
18
+ const Y = (t) => Number(n.getColumnValue(G.value, t)), S = Array.from(d).map(Y);
19
+ let r = S.map((t, e) => ({
20
+ y: t,
21
+ id: String(p ? n.getColumnValue(p.value, e) : e),
22
+ jitter: V()
23
23
  }));
24
- if (!p.aes.showOutliers) {
25
- const [t, g] = O(m, v.scale, l);
26
- r = r.filter(({ y: S }) => S >= t && S <= g);
24
+ if (!l.aes.showOutliers) {
25
+ const [t, e] = b(S, x.scale);
26
+ r = r.filter(({ y: h }) => h >= t && h <= e);
27
27
  }
28
- const [u = 1 / 0, c = -1 / 0] = w(r, (t) => t.y);
29
- u < n && (n = u), c > o && (o = c), a[d].push({
30
- key: `dots_${String(s)}_${String(i)}`,
28
+ const [g = 1 / 0, c = -1 / 0] = B(r, (t) => t.y);
29
+ g < s && (s = g), c > a && (a = c), i[y].push({
30
+ key: `dots_${String(m)}_${String(u)}`,
31
31
  values: r,
32
- primaryGrouping: String(s),
33
- secondaryGrouping: String(i),
34
- boundsY: { min: u, max: c }
32
+ primaryGrouping: String(m),
33
+ secondaryGrouping: String(u),
34
+ boundsY: { min: g, max: c }
35
35
  });
36
36
  });
37
- }), a;
37
+ }), i;
38
38
  }, {}),
39
- meta: { minY: n, maxY: o },
40
- aes: p.aes
39
+ meta: { minY: s, maxY: a },
40
+ aes: l.aes
41
41
  };
42
42
  }
43
43
  export {
44
- $ as getDotsData
44
+ j as getDotsData
45
45
  };
46
46
  //# sourceMappingURL=dots.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"dots.js","sources":["../../../../../../../node_modules/@milaboratories/miplots4/src/discrete/layers/dots.ts"],"sourcesContent":["import type {GroupKey} from '../../DataFrame';\nimport type {DataFrame} from '../../DataFrame';\nimport type {DiscreteSettingsImpl} from '../DiscreteSettingsImpl';\nimport type {DotLayer} from '../DiscreteSettingsImpl';\nimport type {DotsData} from './types';\nimport {getOutliersBounds} from '../utils';\nimport {getFacetStringKey} from '../utils/getFacetStringKey';\nimport type {ColumnName, DataValue, Row} from '../../types';\nimport {extent} from 'd3-array';\nimport {randomLcg} from 'd3-random';\n\nexport type DotsGroup = {\n key: string;\n values: {y: number; jitter: number; id: string; data: Record<string, DataValue>}[];\n primaryGrouping: string;\n secondaryGrouping: string;\n boundsY: {\n min: number;\n max: number;\n };\n};\n\nexport function getDotsData(\n layer: DotLayer,\n groupingKeys: {\n facet: GroupKey[][],\n primary: GroupKey[],\n secondary: GroupKey[]\n },\n data: DataFrame,\n y: ColumnName,\n yAxis: DiscreteSettingsImpl['chartSettings']['yAxis'],\n keyColumn: ColumnName | null\n): DotsData {\n let minY = Infinity;\n let maxY = -Infinity;\n const getJitter = randomLcg(1);\n\n return {\n type: 'dot',\n geoms: groupingKeys.facet.reduce((res: Record<string, DotsGroup[]>, facetKey) => {\n const strFacetKey = getFacetStringKey(facetKey);\n res[strFacetKey] = [];\n groupingKeys.primary.forEach(primaryKey => {\n groupingKeys.secondary.forEach(secondaryKey => {\n const values = data.getRowsByGrouping([...facetKey, primaryKey, secondaryKey]);\n if (!values.length) {\n return;\n }\n const yGetter = (row: Row) => Number(row[y.value]);\n let valuesFiltered = values.map((row, idx) => ({\n y: yGetter(row),\n jitter: getJitter(),\n id: keyColumn ? String(row[keyColumn.value]) : String(idx),\n data: row,\n }));\n if (!layer.aes.showOutliers) {\n const [boundsMin, boundMax] = getOutliersBounds(values, yAxis.scale, yGetter);\n valuesFiltered = valuesFiltered.filter(({ y }) => {\n return y >= boundsMin && y <= boundMax;\n });\n }\n const [min = Infinity, max = -Infinity] = extent(valuesFiltered, (v) => v.y);\n if (min < minY) {\n minY = min;\n }\n if (max > maxY) {\n maxY = max;\n }\n res[strFacetKey].push({\n key: `dots_${String(primaryKey)}_${String(secondaryKey)}`,\n values: valuesFiltered,\n primaryGrouping: String(primaryKey),\n secondaryGrouping: String(secondaryKey),\n boundsY: {min, max},\n });\n });\n });\n return res;\n }, {}),\n meta: {minY, maxY},\n aes: layer.aes,\n };\n}\n"],"names":["getDotsData","layer","groupingKeys","data","y","yAxis","keyColumn","minY","maxY","getJitter","randomLcg","res","facetKey","strFacetKey","getFacetStringKey","primaryKey","secondaryKey","values","yGetter","row","valuesFiltered","idx","boundsMin","boundMax","getOutliersBounds","min","max","extent","v"],"mappings":";;;;AAsBO,SAASA,EACZC,GACAC,GAKAC,GACAC,GACAC,GACAC,GACQ;AACR,MAAIC,IAAO,OACPC,IAAO;AACX,QAAMC,IAAYC,EAAU,CAAC;AAE7B,SAAO;AAAA,IACH,MAAM;AAAA,IACN,OAAOR,EAAa,MAAM,OAAO,CAACS,GAAkCC,MAAa;AAC7E,YAAMC,IAAcC,EAAkBF,CAAQ;AAC9C,aAAAD,EAAIE,CAAW,IAAI,CAAA,GACnBX,EAAa,QAAQ,QAAQ,CAAAa,MAAc;AACvCb,QAAAA,EAAa,UAAU,QAAQ,CAAAc,MAAgB;AAC3C,gBAAMC,IAASd,EAAK,kBAAkB,CAAC,GAAGS,GAAUG,GAAYC,CAAY,CAAC;AAC7E,cAAI,CAACC,EAAO;AACR;AAEJ,gBAAMC,IAAU,CAACC,MAAa,OAAOA,EAAIf,EAAE,KAAK,CAAC;AACjD,cAAIgB,IAAiBH,EAAO,IAAI,CAACE,GAAKE,OAAS;AAAA,YAC3C,GAAGH,EAAQC,CAAG;AAAA,YACd,QAAQV,EAAAA;AAAAA,YACR,IAAgB,OAAZH,IAAmBa,EAAIb,EAAU,KAAK,IAAYe,CAAX;AAAA,YAC3C,MAAMF;AAAAA,UAAA,EACR;AACF,cAAI,CAAClB,EAAM,IAAI,cAAc;AACzB,kBAAM,CAACqB,GAAWC,CAAQ,IAAIC,EAAkBP,GAAQZ,EAAM,OAAOa,CAAO;AAC5EE,YAAAA,IAAiBA,EAAe,OAAO,CAAC,EAAE,GAAAhB,EAAAA,MAC/BA,KAAKkB,KAAalB,KAAKmB,CACjC;AAAA,UACL;AACA,gBAAM,CAACE,IAAM,OAAUC,IAAM,MAAS,IAAIC,EAAOP,GAAgB,CAACQ,MAAMA,EAAE,CAAC;AACvEH,UAAAA,IAAMlB,MACNA,IAAOkB,IAEPC,IAAMlB,MACNA,IAAOkB,IAEXf,EAAIE,CAAW,EAAE,KAAK;AAAA,YAClB,KAAK,QAAQ,OAAOE,CAAU,CAAC,IAAI,OAAOC,CAAY,CAAC;AAAA,YACvD,QAAQI;AAAAA,YACR,iBAAiB,OAAOL,CAAU;AAAA,YAClC,mBAAmB,OAAOC,CAAY;AAAA,YACtC,SAAS,EAAC,KAAAS,GAAK,KAAAC,EAAAA;AAAAA,UAAA,CAClB;AAAA,QACL,CAAC;AAAA,MACL,CAAC,GACMf;AAAAA,IACX,GAAG,CAAA,CAAE;AAAA,IACL,MAAM,EAAC,MAAAJ,GAAM,MAAAC,EAAAA;AAAAA,IACb,KAAKP,EAAM;AAAA,EAAA;AAEnB;","x_google_ignoreList":[0]}
1
+ {"version":3,"file":"dots.js","sources":["../../../../../../../node_modules/@milaboratories/miplots4/src/discrete/layers/dots.ts"],"sourcesContent":["import { extent } from 'd3-array';\nimport { randomLcg } from 'd3-random';\nimport type { DataFrame, GroupKey } from '../../DataFrame';\nimport type { ColumnName } from '../../types';\nimport type { DiscreteSettingsImpl, DotLayer } from '../DiscreteSettingsImpl';\nimport { getOutliersBounds } from '../utils';\nimport { getFacetStringKey } from '../utils/getFacetStringKey';\nimport type { DotsData } from './types';\n\nexport type DotsGroup = {\n key: string;\n values: {y: number; jitter: number; id: string;}[];\n primaryGrouping: string;\n secondaryGrouping: string;\n boundsY: {\n min: number;\n max: number;\n };\n};\n\nexport function getDotsData(\n layer: DotLayer,\n groupingKeys: {\n facet: GroupKey[][],\n primary: GroupKey[],\n secondary: GroupKey[]\n },\n data: DataFrame,\n y: ColumnName,\n yAxis: DiscreteSettingsImpl['chartSettings']['yAxis'],\n keyColumn: ColumnName | null\n): DotsData {\n let minY = Infinity;\n let maxY = -Infinity;\n const getJitter = randomLcg(1);\n\n return {\n type: 'dot',\n geoms: groupingKeys.facet.reduce((res: Record<string, DotsGroup[]>, facetKey) => {\n const strFacetKey = getFacetStringKey(facetKey);\n res[strFacetKey] = [];\n groupingKeys.primary.forEach(primaryKey => {\n groupingKeys.secondary.forEach(secondaryKey => {\n const indexes = data.getRowsByGrouping([...facetKey, primaryKey, secondaryKey]);\n if (!indexes.length) {\n return;\n }\n const yGetter = (idx: number) => Number(data.getColumnValue(y.value, idx));\n const values = Array.from(indexes).map(yGetter);\n let valuesFiltered = values.map((y, idx) => ({\n y,\n id: keyColumn ? String(data.getColumnValue(keyColumn.value, idx)) : String(idx),\n jitter: getJitter(),\n }));\n if (!layer.aes.showOutliers) {\n const [boundsMin, boundMax] = getOutliersBounds(values, yAxis.scale);\n valuesFiltered = valuesFiltered.filter(({ y }) => {\n return y >= boundsMin && y <= boundMax;\n });\n }\n const [min = Infinity, max = -Infinity] = extent(valuesFiltered, (v) => v.y);\n if (min < minY) {\n minY = min;\n }\n if (max > maxY) {\n maxY = max;\n }\n res[strFacetKey].push({\n key: `dots_${String(primaryKey)}_${String(secondaryKey)}`,\n values: valuesFiltered,\n primaryGrouping: String(primaryKey),\n secondaryGrouping: String(secondaryKey),\n boundsY: {min, max},\n });\n });\n });\n return res;\n }, {}),\n meta: {minY, maxY},\n aes: layer.aes,\n };\n}\n"],"names":["getDotsData","layer","groupingKeys","data","y","yAxis","keyColumn","minY","maxY","getJitter","randomLcg","res","facetKey","strFacetKey","getFacetStringKey","primaryKey","secondaryKey","indexes","yGetter","idx","values","valuesFiltered","boundsMin","boundMax","getOutliersBounds","min","max","extent","v"],"mappings":";;;;;AAoBO,SAASA,EACZC,GACAC,GAKAC,GACAC,GACAC,GACAC,GACQ;AACR,MAAIC,IAAO,OACPC,IAAO;AACX,QAAMC,IAAYC,EAAU,CAAC;AAE7B,SAAO;AAAA,IACH,MAAM;AAAA,IACN,OAAOR,EAAa,MAAM,OAAO,CAACS,GAAkCC,MAAa;AAC7E,YAAMC,IAAcC,EAAkBF,CAAQ;AAC9C,aAAAD,EAAIE,CAAW,IAAI,CAAA,GACnBX,EAAa,QAAQ,QAAQ,CAAAa,MAAc;AACvCb,QAAAA,EAAa,UAAU,QAAQ,CAAAc,MAAgB;AAC3C,gBAAMC,IAAUd,EAAK,kBAAkB,CAAC,GAAGS,GAAUG,GAAYC,CAAY,CAAC;AAC9E,cAAI,CAACC,EAAQ;AACT;AAEJ,gBAAMC,IAAU,CAACC,MAAgB,OAAOhB,EAAK,eAAeC,EAAE,OAAOe,CAAG,CAAC,GACnEC,IAAS,MAAM,KAAKH,CAAO,EAAE,IAAIC,CAAO;AAC9C,cAAIG,IAAiBD,EAAO,IAAI,CAAChB,GAAGe,OAAS;AAAA,YACzC,GAAAf;AAAAA,YACA,IAAgB,OAAZE,IAAmBH,EAAK,eAAeG,EAAU,OAAOa,CAAG,IAAYA,CAAX;AAAA,YAChE,QAAQV,EAAAA;AAAAA,UAAA,EACV;AACF,cAAI,CAACR,EAAM,IAAI,cAAc;AACzB,kBAAM,CAACqB,GAAWC,CAAQ,IAAIC,EAAkBJ,GAAQf,EAAM,KAAK;AACnEgB,YAAAA,IAAiBA,EAAe,OAAO,CAAC,EAAE,GAAAjB,EAAAA,MAC/BA,KAAKkB,KAAalB,KAAKmB,CACjC;AAAA,UACL;AACA,gBAAM,CAACE,IAAM,OAAUC,IAAM,MAAS,IAAIC,EAAON,GAAgB,CAACO,MAAMA,EAAE,CAAC;AACvEH,UAAAA,IAAMlB,MACNA,IAAOkB,IAEPC,IAAMlB,MACNA,IAAOkB,IAEXf,EAAIE,CAAW,EAAE,KAAK;AAAA,YAClB,KAAK,QAAQ,OAAOE,CAAU,CAAC,IAAI,OAAOC,CAAY,CAAC;AAAA,YACvD,QAAQK;AAAAA,YACR,iBAAiB,OAAON,CAAU;AAAA,YAClC,mBAAmB,OAAOC,CAAY;AAAA,YACtC,SAAS,EAAC,KAAAS,GAAK,KAAAC,EAAAA;AAAAA,UAAA,CAClB;AAAA,QACL,CAAC;AAAA,MACL,CAAC,GACMf;AAAAA,IACX,GAAG,CAAA,CAAE;AAAA,IACL,MAAM,EAAC,MAAAJ,GAAM,MAAAC,EAAAA;AAAAA,IACb,KAAKP,EAAM;AAAA,EAAA;AAEnB;","x_google_ignoreList":[0]}
@@ -1,4 +1,5 @@
1
1
  import { getOutliersBounds as O } from "../utils/getOutliersBounds.js";
2
+ import "../../utils/TextMeasurer/TextMeasurer.js";
2
3
  import { getFacetStringKey as S } from "../utils/getFacetStringKey.js";
3
4
  import { exhaustive as v } from "../../utils/index.js";
4
5
  import B from "../../node_modules/d3-array/src/quantile.js";
@@ -10,7 +11,7 @@ function C(n, e) {
10
11
  return k(n);
11
12
  v(e, `Unknown line points calculation for dot layer: ${e}`);
12
13
  }
13
- function K(n, e, p, f, s) {
14
+ function K(n, e, p, g, s) {
14
15
  let a = 1 / 0, i = -1 / 0;
15
16
  return {
16
17
  type: "line",
@@ -18,7 +19,7 @@ function K(n, e, p, f, s) {
18
19
  const d = S(l);
19
20
  u[d] = [];
20
21
  let h = -1 / 0, y = 1 / 0;
21
- return n.aes.showOutliers || ([h, y] = O(p.getColumnByGrouping([...l], f.value), s.scale)), e.secondary.forEach((x) => {
22
+ return n.aes.showOutliers || ([h, y] = O(p.getColumnByGrouping([...l], g.value), s.scale)), e.secondary.forEach((x) => {
22
23
  const r = {
23
24
  key: `${String(x)}`,
24
25
  boundsY: {
@@ -30,17 +31,17 @@ function K(n, e, p, f, s) {
30
31
  let m = !1;
31
32
  const Y = (o) => s.scale === "log" ? Math.log10(o) : o, w = (o) => s.scale === "log" ? Math.pow(10, o) : o;
32
33
  e.primary.forEach((o) => {
33
- const c = p.getColumnByGrouping([...l, o, x], f.value);
34
+ const c = p.getColumnByGrouping([...l, o, x], g.value);
34
35
  if (!c.length) {
35
36
  m = !0;
36
37
  return;
37
38
  }
38
- let g = c;
39
- if (n.aes.showOutliers || (g = c.filter((b) => b >= h && b <= y)), !g.length) {
39
+ let f = c;
40
+ if (n.aes.showOutliers || (f = c.filter((b) => b >= h && b <= y)), !f.length) {
40
41
  m = !0;
41
42
  return;
42
43
  }
43
- const t = w(C(g.map(Y), n.pointsValues));
44
+ const t = w(C(f.map(Y), n.pointsValues));
44
45
  r.dots[String(o)] = t, t < a && (a = t), t > i && (i = t), t < r.boundsY.min && (r.boundsY.min = t), t > r.boundsY.max && (r.boundsY.max = t);
45
46
  }), m || u[d].push(r);
46
47
  }), u;
@@ -1 +1 @@
1
- {"version":3,"file":"lines.js","sources":["../../../../../../../node_modules/@milaboratories/miplots4/src/discrete/layers/lines.ts"],"sourcesContent":["import type {GroupKey} from '../../DataFrame';\nimport type {DataFrame} from '../../DataFrame';\nimport type {DiscreteSettingsImpl, LineLayer} from '../DiscreteSettingsImpl';\nimport type {LinesData} from './types';\nimport {getOutliersBounds} from '../utils';\nimport {getFacetStringKey} from '../utils/getFacetStringKey';\nimport {exhaustive} from '../../utils';\nimport {mean, quantile} from 'd3-array';\n\nexport interface Line {\n dots: Record<string, number>;\n boundsY: {\n min: number;\n max: number;\n };\n key: string;\n}\n\nfunction calculateDot(values: number[], pointsValues: LineLayer['pointsValues']): number {\n if (pointsValues === 'median') {\n return quantile(values, 0.5) as number;\n }\n if (pointsValues === 'mean') {\n return mean(values) as number;\n }\n exhaustive(pointsValues, `Unknown line points calculation for dot layer: ${pointsValues}`);\n}\n\nexport function getLinesData(\n layer: LineLayer,\n groupingKeys: {\n facet: GroupKey[][],\n primary: GroupKey[],\n secondary: GroupKey[]\n },\n data: DataFrame,\n y: DiscreteSettingsImpl['y'],\n yAxis: DiscreteSettingsImpl['chartSettings']['yAxis']\n): LinesData {\n let minY = Infinity;\n let maxY = -Infinity;\n\n return {\n type: 'line',\n geoms: groupingKeys.facet.reduce((res: Record<string, Line[]>, facetKey) => {\n const strFacetKey = getFacetStringKey(facetKey);\n res[strFacetKey] = [];\n let boundMin = -Infinity;\n let boundMax = Infinity;\n if (!layer.aes.showOutliers) {\n [boundMin, boundMax] = getOutliersBounds(data.getColumnByGrouping([...facetKey], y.value), yAxis.scale);\n }\n\n groupingKeys.secondary.forEach(secondaryKey => {\n const line: Line = {\n key: `${String(secondaryKey)}`,\n boundsY: {\n min: Infinity,\n max: -Infinity,\n },\n dots: {},\n };\n // if point data by primary/secondary key missed in source data or filtered as outliers, remove whole line\n let missedPoint = false;\n const convertToScale = (v: number) => (yAxis.scale === 'log' ? Math.log10(v) : v);\n const convertFromScale = (v: number) => (yAxis.scale === 'log' ? Math.pow(10, v) : v);\n\n groupingKeys.primary.forEach(primaryKey => {\n const values = data.getColumnByGrouping([...facetKey, primaryKey, secondaryKey], y.value);\n if (!values.length) {\n missedPoint = true;\n return;\n }\n let valuesFiltered = values;\n if (!layer.aes.showOutliers) {\n valuesFiltered = values.filter((v) => v >= boundMin && v <= boundMax);\n }\n if (!valuesFiltered.length) {\n missedPoint = true;\n return;\n }\n\n const dot = convertFromScale(calculateDot(valuesFiltered.map(convertToScale), layer.pointsValues));\n line.dots[String(primaryKey)] = dot;\n if (dot < minY) {\n minY = dot;\n }\n if (dot > maxY) {\n maxY = dot;\n }\n if (dot < line.boundsY.min) {\n line.boundsY.min = dot;\n }\n if (dot > line.boundsY.max) {\n line.boundsY.max = dot;\n }\n });\n if (!missedPoint) {\n res[strFacetKey].push(line);\n }\n });\n return res;\n }, {}),\n meta: {minY, maxY},\n aes: layer.aes\n };\n}\n"],"names":["calculateDot","values","pointsValues","quantile","mean","exhaustive","getLinesData","layer","groupingKeys","data","y","yAxis","minY","maxY","res","facetKey","strFacetKey","getFacetStringKey","boundMin","boundMax","getOutliersBounds","secondaryKey","line","missedPoint","convertToScale","v","convertFromScale","primaryKey","valuesFiltered","dot"],"mappings":";;;;;AAkBA,SAASA,EAAaC,GAAkBC,GAAiD;AACrF,MAAIA,MAAiB;AACjB,WAAOC,EAASF,GAAQ,GAAG;AAE/B,MAAIC,MAAiB;AACjB,WAAOE,EAAKH,CAAM;AAEtBI,EAAAA,EAAWH,GAAc,kDAAkDA,CAAY,EAAE;AAC7F;AAEO,SAASI,EACZC,GACAC,GAKAC,GACAC,GACAC,GACS;AACT,MAAIC,IAAO,OACPC,IAAO;AAEX,SAAO;AAAA,IACH,MAAM;AAAA,IACN,OAAOL,EAAa,MAAM,OAAO,CAACM,GAA6BC,MAAa;AACxE,YAAMC,IAAcC,EAAkBF,CAAQ;AAC9CD,QAAIE,CAAW,IAAI,CAAA;AACnB,UAAIE,IAAW,QACXC,IAAW;AACf,aAAKZ,EAAM,IAAI,iBACX,CAACW,GAAUC,CAAQ,IAAIC,EAAkBX,EAAK,oBAAoB,CAAC,GAAGM,CAAQ,GAAGL,EAAE,KAAK,GAAGC,EAAM,KAAK,IAG1GH,EAAa,UAAU,QAAQ,CAAAa,MAAgB;AAC3C,cAAMC,IAAa;AAAA,UACf,KAAK,GAAG,OAAOD,CAAY,CAAC;AAAA,UAC5B,SAAS;AAAA,YACL,KAAK;AAAA,YACL,KAAK;AAAA,UAAA;AAAA,UAET,MAAM,CAAA;AAAA,QAAA;AAGV,YAAIE,IAAc;AAClB,cAAMC,IAAiB,CAACC,MAAed,EAAM,UAAU,QAAQ,KAAK,MAAMc,CAAC,IAAIA,GACzEC,IAAmB,CAACD,MAAed,EAAM,UAAU,QAAQ,KAAK,IAAI,IAAIc,CAAC,IAAIA;AAEnFjB,QAAAA,EAAa,QAAQ,QAAQ,CAAAmB,MAAc;AACvC,gBAAM1B,IAASQ,EAAK,oBAAoB,CAAC,GAAGM,GAAUY,GAAYN,CAAY,GAAGX,EAAE,KAAK;AACxF,cAAI,CAACT,EAAO,QAAQ;AAChBsB,gBAAc;AACd;AAAA,UACJ;AACA,cAAIK,IAAiB3B;AAIrB,cAHKM,EAAM,IAAI,iBACXqB,IAAiB3B,EAAO,OAAO,CAACwB,MAAMA,KAAKP,KAAYO,KAAKN,CAAQ,IAEpE,CAACS,EAAe,QAAQ;AACxBL,gBAAc;AACd;AAAA,UACJ;AAEA,gBAAMM,IAAMH,EAAiB1B,EAAa4B,EAAe,IAAIJ,CAAc,GAAGjB,EAAM,YAAY,CAAC;AACjGe,UAAAA,EAAK,KAAK,OAAOK,CAAU,CAAC,IAAIE,GAC5BA,IAAMjB,MACNA,IAAOiB,IAEPA,IAAMhB,MACNA,IAAOgB,IAEPA,IAAMP,EAAK,QAAQ,QACnBA,EAAK,QAAQ,MAAMO,IAEnBA,IAAMP,EAAK,QAAQ,QACnBA,EAAK,QAAQ,MAAMO;AAAAA,QAE3B,CAAC,GACIN,KACDT,EAAIE,CAAW,EAAE,KAAKM,CAAI;AAAA,MAElC,CAAC,GACMR;AAAAA,IACX,GAAG,CAAA,CAAE;AAAA,IACL,MAAM,EAAC,MAAAF,GAAM,MAAAC,EAAAA;AAAAA,IACb,KAAKN,EAAM;AAAA,EAAA;AAEnB;","x_google_ignoreList":[0]}
1
+ {"version":3,"file":"lines.js","sources":["../../../../../../../node_modules/@milaboratories/miplots4/src/discrete/layers/lines.ts"],"sourcesContent":["import type {GroupKey} from '../../DataFrame';\nimport type {DataFrame} from '../../DataFrame';\nimport type {DiscreteSettingsImpl, LineLayer} from '../DiscreteSettingsImpl';\nimport type {LinesData} from './types';\nimport {getOutliersBounds} from '../utils';\nimport {getFacetStringKey} from '../utils/getFacetStringKey';\nimport {exhaustive} from '../../utils';\nimport {mean, quantile} from 'd3-array';\n\nexport interface Line {\n dots: Record<string, number>;\n boundsY: {\n min: number;\n max: number;\n };\n key: string;\n}\n\nfunction calculateDot(values: number[], pointsValues: LineLayer['pointsValues']): number {\n if (pointsValues === 'median') {\n return quantile(values, 0.5) as number;\n }\n if (pointsValues === 'mean') {\n return mean(values) as number;\n }\n exhaustive(pointsValues, `Unknown line points calculation for dot layer: ${pointsValues}`);\n}\n\nexport function getLinesData(\n layer: LineLayer,\n groupingKeys: {\n facet: GroupKey[][],\n primary: GroupKey[],\n secondary: GroupKey[]\n },\n data: DataFrame,\n y: DiscreteSettingsImpl['y'],\n yAxis: DiscreteSettingsImpl['chartSettings']['yAxis']\n): LinesData {\n let minY = Infinity;\n let maxY = -Infinity;\n\n return {\n type: 'line',\n geoms: groupingKeys.facet.reduce((res: Record<string, Line[]>, facetKey) => {\n const strFacetKey = getFacetStringKey(facetKey);\n res[strFacetKey] = [];\n let boundMin = -Infinity;\n let boundMax = Infinity;\n if (!layer.aes.showOutliers) {\n [boundMin, boundMax] = getOutliersBounds(data.getColumnByGrouping([...facetKey], y.value), yAxis.scale);\n }\n\n groupingKeys.secondary.forEach(secondaryKey => {\n const line: Line = {\n key: `${String(secondaryKey)}`,\n boundsY: {\n min: Infinity,\n max: -Infinity,\n },\n dots: {},\n };\n // if point data by primary/secondary key missed in source data or filtered as outliers, remove whole line\n let missedPoint = false;\n const convertToScale = (v: number) => (yAxis.scale === 'log' ? Math.log10(v) : v);\n const convertFromScale = (v: number) => (yAxis.scale === 'log' ? Math.pow(10, v) : v);\n\n groupingKeys.primary.forEach(primaryKey => {\n const values = data.getColumnByGrouping([...facetKey, primaryKey, secondaryKey], y.value);\n if (!values.length) {\n missedPoint = true;\n return;\n }\n let valuesFiltered = values;\n if (!layer.aes.showOutliers) {\n valuesFiltered = values.filter((v) => v >= boundMin && v <= boundMax);\n }\n if (!valuesFiltered.length) {\n missedPoint = true;\n return;\n }\n\n const dot = convertFromScale(calculateDot(valuesFiltered.map(convertToScale), layer.pointsValues));\n line.dots[String(primaryKey)] = dot;\n if (dot < minY) {\n minY = dot;\n }\n if (dot > maxY) {\n maxY = dot;\n }\n if (dot < line.boundsY.min) {\n line.boundsY.min = dot;\n }\n if (dot > line.boundsY.max) {\n line.boundsY.max = dot;\n }\n });\n if (!missedPoint) {\n res[strFacetKey].push(line);\n }\n });\n return res;\n }, {}),\n meta: {minY, maxY},\n aes: layer.aes\n };\n}\n"],"names":["calculateDot","values","pointsValues","quantile","mean","exhaustive","getLinesData","layer","groupingKeys","data","y","yAxis","minY","maxY","res","facetKey","strFacetKey","getFacetStringKey","boundMin","boundMax","getOutliersBounds","secondaryKey","line","missedPoint","convertToScale","v","convertFromScale","primaryKey","valuesFiltered","dot"],"mappings":";;;;;;AAkBA,SAASA,EAAaC,GAAkBC,GAAiD;AACrF,MAAIA,MAAiB;AACjB,WAAOC,EAASF,GAAQ,GAAG;AAE/B,MAAIC,MAAiB;AACjB,WAAOE,EAAKH,CAAM;AAEtBI,EAAAA,EAAWH,GAAc,kDAAkDA,CAAY,EAAE;AAC7F;AAEO,SAASI,EACZC,GACAC,GAKAC,GACAC,GACAC,GACS;AACT,MAAIC,IAAO,OACPC,IAAO;AAEX,SAAO;AAAA,IACH,MAAM;AAAA,IACN,OAAOL,EAAa,MAAM,OAAO,CAACM,GAA6BC,MAAa;AACxE,YAAMC,IAAcC,EAAkBF,CAAQ;AAC9CD,QAAIE,CAAW,IAAI,CAAA;AACnB,UAAIE,IAAW,QACXC,IAAW;AACf,aAAKZ,EAAM,IAAI,iBACX,CAACW,GAAUC,CAAQ,IAAIC,EAAkBX,EAAK,oBAAoB,CAAC,GAAGM,CAAQ,GAAGL,EAAE,KAAK,GAAGC,EAAM,KAAK,IAG1GH,EAAa,UAAU,QAAQ,CAAAa,MAAgB;AAC3C,cAAMC,IAAa;AAAA,UACf,KAAK,GAAG,OAAOD,CAAY,CAAC;AAAA,UAC5B,SAAS;AAAA,YACL,KAAK;AAAA,YACL,KAAK;AAAA,UAAA;AAAA,UAET,MAAM,CAAA;AAAA,QAAA;AAGV,YAAIE,IAAc;AAClB,cAAMC,IAAiB,CAACC,MAAed,EAAM,UAAU,QAAQ,KAAK,MAAMc,CAAC,IAAIA,GACzEC,IAAmB,CAACD,MAAed,EAAM,UAAU,QAAQ,KAAK,IAAI,IAAIc,CAAC,IAAIA;AAEnFjB,QAAAA,EAAa,QAAQ,QAAQ,CAAAmB,MAAc;AACvC,gBAAM1B,IAASQ,EAAK,oBAAoB,CAAC,GAAGM,GAAUY,GAAYN,CAAY,GAAGX,EAAE,KAAK;AACxF,cAAI,CAACT,EAAO,QAAQ;AAChBsB,YAAAA,IAAc;AACd;AAAA,UACJ;AACA,cAAIK,IAAiB3B;AAIrB,cAHKM,EAAM,IAAI,iBACXqB,IAAiB3B,EAAO,OAAO,CAACwB,MAAMA,KAAKP,KAAYO,KAAKN,CAAQ,IAEpE,CAACS,EAAe,QAAQ;AACxBL,YAAAA,IAAc;AACd;AAAA,UACJ;AAEA,gBAAMM,IAAMH,EAAiB1B,EAAa4B,EAAe,IAAIJ,CAAc,GAAGjB,EAAM,YAAY,CAAC;AACjGe,UAAAA,EAAK,KAAK,OAAOK,CAAU,CAAC,IAAIE,GAC5BA,IAAMjB,MACNA,IAAOiB,IAEPA,IAAMhB,MACNA,IAAOgB,IAEPA,IAAMP,EAAK,QAAQ,QACnBA,EAAK,QAAQ,MAAMO,IAEnBA,IAAMP,EAAK,QAAQ,QACnBA,EAAK,QAAQ,MAAMO;AAAAA,QAE3B,CAAC,GACIN,KACDT,EAAIE,CAAW,EAAE,KAAKM,CAAI;AAAA,MAElC,CAAC,GACMR;AAAAA,IACX,GAAG,CAAA,CAAE;AAAA,IACL,MAAM,EAAC,MAAAF,GAAM,MAAAC,EAAAA;AAAAA,IACb,KAAKN,EAAM;AAAA,EAAA;AAEnB;","x_google_ignoreList":[0]}