@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.
- package/dist/DataFrame.d.ts +15 -9
- package/dist/DataFrame.d.ts.map +1 -1
- package/dist/DataFrame.js +105 -81
- package/dist/DataFrame.js.map +1 -1
- package/dist/bubble/ChartRenderer.d.ts +6 -5
- package/dist/bubble/ChartRenderer.d.ts.map +1 -1
- package/dist/bubble/ChartRenderer.js +123 -121
- package/dist/bubble/ChartRenderer.js.map +1 -1
- package/dist/bubble/components/Chart.d.ts +3 -2
- package/dist/bubble/components/Chart.d.ts.map +1 -1
- package/dist/bubble/components/Chart.js +78 -97
- package/dist/bubble/components/Chart.js.map +1 -1
- package/dist/bubble/components/ChartsGroup.d.ts +6 -5
- package/dist/bubble/components/ChartsGroup.d.ts.map +1 -1
- package/dist/bubble/components/ChartsGroup.js +39 -37
- package/dist/bubble/components/ChartsGroup.js.map +1 -1
- package/dist/bubble/getCellTooltip.d.ts +5 -0
- package/dist/bubble/getCellTooltip.d.ts.map +1 -0
- package/dist/bubble/getCellTooltip.js +28 -0
- package/dist/bubble/getCellTooltip.js.map +1 -0
- package/dist/bubble/{getCells.d.ts → getGroupedCellsData.d.ts} +4 -4
- package/dist/bubble/getGroupedCellsData.d.ts.map +1 -0
- package/dist/bubble/getGroupedCellsData.js +94 -0
- package/dist/bubble/getGroupedCellsData.js.map +1 -0
- package/dist/bubble/index.d.ts +4 -4
- package/dist/bubble/index.d.ts.map +1 -1
- package/dist/bubble/index.js +47 -42
- package/dist/bubble/index.js.map +1 -1
- package/dist/bubble/utils/calculateCaptionTails.d.ts +2 -2
- package/dist/bubble/utils/calculateCaptionTails.d.ts.map +1 -1
- package/dist/bubble/utils/calculateCaptionTails.js.map +1 -1
- package/dist/common/Legend.d.ts.map +1 -1
- package/dist/common/Legend.js.map +1 -1
- package/dist/common/Tooltip.js +1 -1
- package/dist/common/Tooltip.js.map +1 -1
- package/dist/common/types.d.ts +1 -1
- package/dist/common/types.d.ts.map +1 -1
- package/dist/common/useDataFrame.d.ts +11 -0
- package/dist/common/useDataFrame.d.ts.map +1 -0
- package/dist/common/useDataFrame.js +20 -0
- package/dist/common/useDataFrame.js.map +1 -0
- package/dist/dendro/ChartRenderer.d.ts +9 -8
- package/dist/dendro/ChartRenderer.d.ts.map +1 -1
- package/dist/dendro/ChartRenderer.js +187 -187
- package/dist/dendro/ChartRenderer.js.map +1 -1
- package/dist/dendro/components/Chart.d.ts +8 -8
- package/dist/dendro/components/Chart.d.ts.map +1 -1
- package/dist/dendro/components/Chart.js +35 -35
- package/dist/dendro/components/Chart.js.map +1 -1
- package/dist/dendro/components/Heatmap.d.ts +3 -3
- package/dist/dendro/components/Heatmap.d.ts.map +1 -1
- package/dist/dendro/components/Heatmap.js +23 -23
- package/dist/dendro/components/Heatmap.js.map +1 -1
- package/dist/dendro/components/Legend.d.ts.map +1 -1
- package/dist/dendro/components/Legend.js.map +1 -1
- package/dist/dendro/components/LinksGroup.d.ts +6 -6
- package/dist/dendro/components/LinksGroup.d.ts.map +1 -1
- package/dist/dendro/components/LinksGroup.js +17 -17
- package/dist/dendro/components/LinksGroup.js.map +1 -1
- package/dist/dendro/components/NodesGroup.d.ts +7 -7
- package/dist/dendro/components/NodesGroup.d.ts.map +1 -1
- package/dist/dendro/components/NodesGroup.js +29 -29
- package/dist/dendro/components/NodesGroup.js.map +1 -1
- package/dist/dendro/components/types.d.ts +2 -2
- package/dist/dendro/components/types.d.ts.map +1 -1
- package/dist/dendro/getHeatmapData.d.ts +2 -2
- package/dist/dendro/getHeatmapData.d.ts.map +1 -1
- package/dist/dendro/getHeatmapData.js +48 -44
- package/dist/dendro/getHeatmapData.js.map +1 -1
- package/dist/dendro/getHierarchyData.d.ts +3 -3
- package/dist/dendro/getHierarchyData.d.ts.map +1 -1
- package/dist/dendro/getHierarchyData.js +31 -31
- package/dist/dendro/getHierarchyData.js.map +1 -1
- package/dist/dendro/index.d.ts +5 -5
- package/dist/dendro/index.d.ts.map +1 -1
- package/dist/dendro/index.js +86 -89
- package/dist/dendro/index.js.map +1 -1
- package/dist/discrete/ChartRenderer.d.ts +6 -6
- package/dist/discrete/ChartRenderer.d.ts.map +1 -1
- package/dist/discrete/ChartRenderer.js +197 -196
- package/dist/discrete/ChartRenderer.js.map +1 -1
- package/dist/discrete/DiscreteSettingsImpl.d.ts +3 -3
- package/dist/discrete/DiscreteSettingsImpl.d.ts.map +1 -1
- package/dist/discrete/DiscreteSettingsImpl.js +8 -8
- package/dist/discrete/DiscreteSettingsImpl.js.map +1 -1
- package/dist/discrete/components/layers/BoxElement.js.map +1 -1
- package/dist/discrete/index.d.ts +1 -1
- package/dist/discrete/index.d.ts.map +1 -1
- package/dist/discrete/index.js +109 -106
- package/dist/discrete/index.js.map +1 -1
- package/dist/discrete/layers/bar.d.ts +2 -2
- package/dist/discrete/layers/bar.d.ts.map +1 -1
- package/dist/discrete/layers/bar.js +32 -37
- package/dist/discrete/layers/bar.js.map +1 -1
- package/dist/discrete/layers/binnedDots.d.ts +3 -3
- package/dist/discrete/layers/binnedDots.d.ts.map +1 -1
- package/dist/discrete/layers/binnedDots.js +66 -78
- package/dist/discrete/layers/binnedDots.js.map +1 -1
- package/dist/discrete/layers/boxes.d.ts +3 -4
- package/dist/discrete/layers/boxes.d.ts.map +1 -1
- package/dist/discrete/layers/boxes.js +59 -60
- package/dist/discrete/layers/boxes.js.map +1 -1
- package/dist/discrete/layers/dots.d.ts +2 -3
- package/dist/discrete/layers/dots.d.ts.map +1 -1
- package/dist/discrete/layers/dots.js +30 -30
- package/dist/discrete/layers/dots.js.map +1 -1
- package/dist/discrete/layers/lines.js +11 -10
- package/dist/discrete/layers/lines.js.map +1 -1
- package/dist/discrete/layers/logo.d.ts +2 -2
- package/dist/discrete/layers/logo.d.ts.map +1 -1
- package/dist/discrete/layers/logo.js +21 -21
- package/dist/discrete/layers/logo.js.map +1 -1
- package/dist/discrete/layers/pairedPoints.d.ts +2 -2
- package/dist/discrete/layers/pairedPoints.d.ts.map +1 -1
- package/dist/discrete/layers/pairedPoints.js +62 -62
- package/dist/discrete/layers/pairedPoints.js.map +1 -1
- package/dist/discrete/layers/sina.d.ts +3 -4
- package/dist/discrete/layers/sina.d.ts.map +1 -1
- package/dist/discrete/layers/sina.js +67 -71
- package/dist/discrete/layers/sina.js.map +1 -1
- package/dist/discrete/layers/stackedBar.d.ts +1 -1
- package/dist/discrete/layers/stackedBar.d.ts.map +1 -1
- package/dist/discrete/layers/stackedBar.js +25 -25
- package/dist/discrete/layers/stackedBar.js.map +1 -1
- package/dist/discrete/layers/violins.js +13 -13
- package/dist/discrete/utils/getOutliersBounds.d.ts +1 -1
- package/dist/discrete/utils/getOutliersBounds.d.ts.map +1 -1
- package/dist/discrete/utils/getOutliersBounds.js +5 -5
- package/dist/discrete/utils/getOutliersBounds.js.map +1 -1
- package/dist/discrete/utils/splitTextByWidth.js +1 -1
- package/dist/discrete/utils/splitTextByWidth.js.map +1 -1
- package/dist/heatmap/ChartRenderer.d.ts +7 -6
- package/dist/heatmap/ChartRenderer.d.ts.map +1 -1
- package/dist/heatmap/ChartRenderer.js +232 -230
- package/dist/heatmap/ChartRenderer.js.map +1 -1
- package/dist/heatmap/HeatmapSettingsImpl.d.ts +2 -2
- package/dist/heatmap/HeatmapSettingsImpl.d.ts.map +1 -1
- package/dist/heatmap/HeatmapSettingsImpl.js +1 -1
- package/dist/heatmap/HeatmapSettingsImpl.js.map +1 -1
- package/dist/heatmap/components/Annotations/Annotation.d.ts.map +1 -1
- package/dist/heatmap/components/Annotations/Annotation.js +40 -39
- package/dist/heatmap/components/Annotations/Annotation.js.map +1 -1
- package/dist/heatmap/components/Chart.d.ts.map +1 -1
- package/dist/heatmap/components/Chart.js +90 -89
- package/dist/heatmap/components/Chart.js.map +1 -1
- package/dist/heatmap/components/ChartsGroup.d.ts +2 -2
- package/dist/heatmap/components/ChartsGroup.d.ts.map +1 -1
- package/dist/heatmap/components/ChartsGroup.js +14 -14
- package/dist/heatmap/components/ChartsGroup.js.map +1 -1
- package/dist/heatmap/components/types.d.ts +3 -2
- package/dist/heatmap/components/types.d.ts.map +1 -1
- package/dist/heatmap/getCells.d.ts +3 -2
- package/dist/heatmap/getCells.d.ts.map +1 -1
- package/dist/heatmap/getCells.js +97 -93
- package/dist/heatmap/getCells.js.map +1 -1
- package/dist/heatmap/index.d.ts +3 -3
- package/dist/heatmap/index.d.ts.map +1 -1
- package/dist/heatmap/index.js +13 -12
- package/dist/heatmap/index.js.map +1 -1
- package/dist/heatmap/utils/calculateAnnotationTitleSizes.d.ts.map +1 -1
- package/dist/heatmap/utils/calculateAnnotationTitleSizes.js +1 -1
- package/dist/heatmap/utils/calculateAnnotationTitleSizes.js.map +1 -1
- package/dist/heatmap/utils/calculateCaptionTails.d.ts +1 -1
- package/dist/heatmap/utils/calculateCaptionTails.d.ts.map +1 -1
- package/dist/heatmap/utils/calculateCaptionTails.js.map +1 -1
- package/dist/histogram/ChartRenderer.d.ts +6 -5
- package/dist/histogram/ChartRenderer.d.ts.map +1 -1
- package/dist/histogram/ChartRenderer.js +154 -153
- package/dist/histogram/ChartRenderer.js.map +1 -1
- package/dist/histogram/HistogramSettingsImpl.d.ts +2 -2
- package/dist/histogram/HistogramSettingsImpl.d.ts.map +1 -1
- package/dist/histogram/HistogramSettingsImpl.js.map +1 -1
- package/dist/histogram/components/Chart.js +48 -48
- package/dist/histogram/components/Chart.js.map +1 -1
- package/dist/histogram/components/types.d.ts +4 -3
- package/dist/histogram/components/types.d.ts.map +1 -1
- package/dist/histogram/getHistogramData.d.ts +7 -7
- package/dist/histogram/getHistogramData.d.ts.map +1 -1
- package/dist/histogram/getHistogramData.js +52 -53
- package/dist/histogram/getHistogramData.js.map +1 -1
- package/dist/histogram/index.d.ts +3 -3
- package/dist/histogram/index.d.ts.map +1 -1
- package/dist/histogram/index.js +49 -45
- package/dist/histogram/index.js.map +1 -1
- package/dist/node_modules/@d3fc/d3fc-axis/src/axisBase.js +10 -10
- package/dist/node_modules/d3-array/src/min.js +5 -11
- package/dist/node_modules/d3-array/src/min.js.map +1 -1
- package/dist/node_modules/d3-shape/src/area.js +30 -30
- package/dist/node_modules/d3-shape/src/line.js +6 -6
- package/dist/node_modules/d3-shape/src/line.js.map +1 -1
- package/dist/node_modules/kdbush/index.js +148 -0
- package/dist/node_modules/kdbush/index.js.map +1 -0
- package/dist/scatterplot/ChartRenderer.d.ts +7 -6
- package/dist/scatterplot/ChartRenderer.d.ts.map +1 -1
- package/dist/scatterplot/ChartRenderer.js +213 -209
- package/dist/scatterplot/ChartRenderer.js.map +1 -1
- package/dist/scatterplot/ScatterplotSettingsImpl.d.ts +2 -2
- package/dist/scatterplot/ScatterplotSettingsImpl.d.ts.map +1 -1
- package/dist/scatterplot/ScatterplotSettingsImpl.js +28 -28
- package/dist/scatterplot/ScatterplotSettingsImpl.js.map +1 -1
- package/dist/scatterplot/components/ChartAxisTitles.d.ts.map +1 -1
- package/dist/scatterplot/components/ChartAxisTitles.js +31 -30
- package/dist/scatterplot/components/ChartAxisTitles.js.map +1 -1
- package/dist/scatterplot/components/ChartLayersData.d.ts.map +1 -1
- package/dist/scatterplot/components/ChartLayersData.js +138 -156
- package/dist/scatterplot/components/ChartLayersData.js.map +1 -1
- package/dist/scatterplot/components/ChartTooltip.d.ts.map +1 -1
- package/dist/scatterplot/components/ChartTooltip.js +41 -38
- package/dist/scatterplot/components/ChartTooltip.js.map +1 -1
- package/dist/scatterplot/components/ChartTrendsData.js +21 -21
- package/dist/scatterplot/components/ChartTrendsData.js.map +1 -1
- package/dist/scatterplot/components/types.d.ts +7 -7
- package/dist/scatterplot/components/types.d.ts.map +1 -1
- package/dist/scatterplot/constants.d.ts +1 -1
- package/dist/scatterplot/constants.d.ts.map +1 -1
- package/dist/scatterplot/constants.js.map +1 -1
- package/dist/scatterplot/dots.d.ts +2 -2
- package/dist/scatterplot/dots.d.ts.map +1 -1
- package/dist/scatterplot/dots.js +27 -25
- package/dist/scatterplot/dots.js.map +1 -1
- package/dist/scatterplot/getLayersData.d.ts +3 -3
- package/dist/scatterplot/getLayersData.d.ts.map +1 -1
- package/dist/scatterplot/getLayersData.js +12 -15
- package/dist/scatterplot/getLayersData.js.map +1 -1
- package/dist/scatterplot/index.d.ts +4 -4
- package/dist/scatterplot/index.d.ts.map +1 -1
- package/dist/scatterplot/index.js +71 -72
- package/dist/scatterplot/index.js.map +1 -1
- package/dist/scatterplot/linearRegression.d.ts +5 -4
- package/dist/scatterplot/linearRegression.d.ts.map +1 -1
- package/dist/scatterplot/linearRegression.js +88 -86
- package/dist/scatterplot/linearRegression.js.map +1 -1
- package/dist/scatterplot/utils/createAesGetter.d.ts +3 -2
- package/dist/scatterplot/utils/createAesGetter.d.ts.map +1 -1
- package/dist/scatterplot/utils/createAesGetter.js +21 -21
- package/dist/scatterplot/utils/createAesGetter.js.map +1 -1
- package/dist/scatterplot/utils/createLegendInfo.d.ts +2 -10
- package/dist/scatterplot/utils/createLegendInfo.d.ts.map +1 -1
- package/dist/scatterplot/utils/createLegendInfo.js +44 -37
- package/dist/scatterplot/utils/createLegendInfo.js.map +1 -1
- package/dist/scatterplot/utils/formatColumnValue.d.ts +5 -0
- package/dist/scatterplot/utils/formatColumnValue.d.ts.map +1 -0
- package/dist/scatterplot/utils/formatColumnValue.js +11 -0
- package/dist/scatterplot/utils/formatColumnValue.js.map +1 -0
- package/dist/scatterplot/utils/getVisibleLabels.d.ts +6 -9
- package/dist/scatterplot/utils/getVisibleLabels.d.ts.map +1 -1
- package/dist/scatterplot/utils/getVisibleLabels.js +46 -56
- package/dist/scatterplot/utils/getVisibleLabels.js.map +1 -1
- package/dist/scatterplot-umap/ChartRenderer.d.ts +18 -15
- package/dist/scatterplot-umap/ChartRenderer.d.ts.map +1 -1
- package/dist/scatterplot-umap/ChartRenderer.js +231 -214
- package/dist/scatterplot-umap/ChartRenderer.js.map +1 -1
- package/dist/scatterplot-umap/SettingsImpl.d.ts +2 -2
- package/dist/scatterplot-umap/SettingsImpl.d.ts.map +1 -1
- package/dist/scatterplot-umap/SettingsImpl.js +25 -25
- package/dist/scatterplot-umap/SettingsImpl.js.map +1 -1
- package/dist/scatterplot-umap/colors.d.ts +6 -0
- package/dist/scatterplot-umap/colors.d.ts.map +1 -0
- package/dist/scatterplot-umap/colors.js +42 -0
- package/dist/scatterplot-umap/colors.js.map +1 -0
- package/dist/scatterplot-umap/components/LowerSVG.d.ts +2 -2
- package/dist/scatterplot-umap/components/LowerSVG.d.ts.map +1 -1
- package/dist/scatterplot-umap/components/LowerSVG.js +97 -94
- package/dist/scatterplot-umap/components/LowerSVG.js.map +1 -1
- package/dist/scatterplot-umap/components/UpperSVG.d.ts.map +1 -1
- package/dist/scatterplot-umap/components/UpperSVG.js +20 -19
- package/dist/scatterplot-umap/components/UpperSVG.js.map +1 -1
- package/dist/scatterplot-umap/index.d.ts +0 -2
- package/dist/scatterplot-umap/index.d.ts.map +1 -1
- package/dist/scatterplot-umap/index.js +77 -102
- package/dist/scatterplot-umap/index.js.map +1 -1
- package/dist/scatterplot-umap/types.d.ts +7 -10
- package/dist/scatterplot-umap/types.d.ts.map +1 -1
- package/dist/types/bubble.d.ts +44 -12
- package/dist/types/bubble.d.ts.map +1 -1
- package/dist/types/common.d.ts +22 -3
- package/dist/types/common.d.ts.map +1 -1
- package/dist/types/common.js +3 -1
- package/dist/types/common.js.map +1 -1
- package/dist/types/dendro.d.ts +113 -10
- package/dist/types/dendro.d.ts.map +1 -1
- package/dist/types/dendro.js +1 -1
- package/dist/types/dendro.js.map +1 -1
- package/dist/types/discrete.d.ts +99 -22
- package/dist/types/discrete.d.ts.map +1 -1
- package/dist/types/discrete.js +3 -3
- package/dist/types/discrete.js.map +1 -1
- package/dist/types/heatmap.d.ts +187 -28
- package/dist/types/heatmap.d.ts.map +1 -1
- package/dist/types/heatmap.js +1 -1
- package/dist/types/heatmap.js.map +1 -1
- package/dist/types/histogram.d.ts +30 -8
- package/dist/types/histogram.d.ts.map +1 -1
- package/dist/types/histogram.js +1 -1
- package/dist/types/histogram.js.map +1 -1
- package/dist/types/scatterplot-umap.d.ts +149 -15
- package/dist/types/scatterplot-umap.d.ts.map +1 -1
- package/dist/types/scatterplot-umap.js +9 -9
- package/dist/types/scatterplot-umap.js.map +1 -1
- package/dist/types/scatterplot.d.ts +164 -12
- package/dist/types/scatterplot.d.ts.map +1 -1
- package/dist/types/scatterplot.js +1 -1
- package/dist/types/scatterplot.js.map +1 -1
- package/dist/utils/TextMeasurer/TextMeasurer.d.ts +7 -0
- package/dist/utils/TextMeasurer/TextMeasurer.d.ts.map +1 -0
- package/dist/utils/TextMeasurer/TextMeasurer.js +42 -0
- package/dist/utils/TextMeasurer/TextMeasurer.js.map +1 -0
- package/dist/utils/TextMeasurer/charToWidth.json.js +155 -0
- package/dist/utils/TextMeasurer/charToWidth.json.js.map +1 -0
- package/dist/utils/arrangeLegendParts.js +1 -1
- package/dist/utils/arrangeLegendParts.js.map +1 -1
- package/dist/utils/getChartEdgeSides.d.ts +1 -1
- package/dist/utils/getLegendWidth.d.ts.map +1 -1
- package/dist/utils/getLegendWidth.js +1 -1
- package/dist/utils/getLegendWidth.js.map +1 -1
- package/package.json +5 -3
- package/dist/bubble/getCells.d.ts.map +0 -1
- package/dist/bubble/getCells.js +0 -91
- package/dist/bubble/getCells.js.map +0 -1
- package/dist/node_modules/d3-quadtree/src/add.js +0 -30
- package/dist/node_modules/d3-quadtree/src/add.js.map +0 -1
- package/dist/node_modules/d3-quadtree/src/cover.js +0 -29
- package/dist/node_modules/d3-quadtree/src/cover.js.map +0 -1
- package/dist/node_modules/d3-quadtree/src/data.js +0 -12
- package/dist/node_modules/d3-quadtree/src/data.js.map +0 -1
- package/dist/node_modules/d3-quadtree/src/extent.js +0 -7
- package/dist/node_modules/d3-quadtree/src/extent.js.map +0 -1
- package/dist/node_modules/d3-quadtree/src/find.js +0 -26
- package/dist/node_modules/d3-quadtree/src/find.js.map +0 -1
- package/dist/node_modules/d3-quadtree/src/quad.js +0 -7
- package/dist/node_modules/d3-quadtree/src/quad.js.map +0 -1
- package/dist/node_modules/d3-quadtree/src/quadtree.js +0 -51
- package/dist/node_modules/d3-quadtree/src/quadtree.js.map +0 -1
- package/dist/node_modules/d3-quadtree/src/remove.js +0 -21
- package/dist/node_modules/d3-quadtree/src/remove.js.map +0 -1
- package/dist/node_modules/d3-quadtree/src/root.js +0 -7
- package/dist/node_modules/d3-quadtree/src/root.js.map +0 -1
- package/dist/node_modules/d3-quadtree/src/size.js +0 -12
- package/dist/node_modules/d3-quadtree/src/size.js.map +0 -1
- package/dist/node_modules/d3-quadtree/src/visit.js +0 -14
- package/dist/node_modules/d3-quadtree/src/visit.js.map +0 -1
- package/dist/node_modules/d3-quadtree/src/visitAfter.js +0 -19
- package/dist/node_modules/d3-quadtree/src/visitAfter.js.map +0 -1
- package/dist/node_modules/d3-quadtree/src/x.js +0 -11
- package/dist/node_modules/d3-quadtree/src/x.js.map +0 -1
- package/dist/node_modules/d3-quadtree/src/y.js +0 -11
- package/dist/node_modules/d3-quadtree/src/y.js.map +0 -1
- package/dist/utils/TextMeasurer.d.ts +0 -8
- package/dist/utils/TextMeasurer.d.ts.map +0 -1
- package/dist/utils/TextMeasurer.js +0 -27
- package/dist/utils/TextMeasurer.js.map +0 -1
|
@@ -1,7 +1,7 @@
|
|
|
1
|
-
import { GroupKey, NO_GROUPED,
|
|
1
|
+
import { DataFrame, GroupKey, NO_GROUPED, RowIndex } from '../../DataFrame';
|
|
2
|
+
import { ColumnName, DataValue } from '../../types';
|
|
2
3
|
import { BinnedDotsLayer, DiscreteSettingsImpl } from '../DiscreteSettingsImpl';
|
|
3
4
|
import { BinnedDotsData } from './types';
|
|
4
|
-
import { ColumnName, DataValue, Row } from '../../types';
|
|
5
5
|
export declare class BinnedDots {
|
|
6
6
|
bins: {
|
|
7
7
|
x: number;
|
|
@@ -18,7 +18,7 @@ export declare class BinnedDots {
|
|
|
18
18
|
min: number;
|
|
19
19
|
max: number;
|
|
20
20
|
};
|
|
21
|
-
constructor(
|
|
21
|
+
constructor(dataFrame: DataFrame, indexes: RowIndex[], column: ColumnName, primaryGrouping: DataValue | typeof NO_GROUPED, secondaryGrouping: DataValue | typeof NO_GROUPED, step: number, convertToScale: (v: number) => number, convertFromScale: (v: number) => number, scale: 'log' | 'linear', keyColumn: ColumnName | null);
|
|
22
22
|
}
|
|
23
23
|
export declare function getBinnedDotsData(layer: BinnedDotsLayer, groupingKeys: {
|
|
24
24
|
facet: GroupKey[][];
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"binnedDots.d.ts","sourceRoot":"","sources":["../../../src/discrete/layers/binnedDots.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"binnedDots.d.ts","sourceRoot":"","sources":["../../../src/discrete/layers/binnedDots.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,SAAS,EAAE,QAAQ,EAAE,UAAU,EAAE,QAAQ,EAAE,MAAM,iBAAiB,CAAC;AACjF,OAAO,KAAK,EAAE,UAAU,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AACzD,OAAO,KAAK,EAAE,eAAe,EAAE,oBAAoB,EAAE,MAAM,yBAAyB,CAAC;AAGrF,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,SAAS,CAAC;AA8C9C,qBAAa,UAAU;IACnB,IAAI,EAAE;QAAC,CAAC,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE;YAAC,GAAG,EAAE,MAAM,CAAC;YAAC,KAAK,EAAE,MAAM,CAAA;SAAC,EAAE,CAAA;KAAC,EAAE,CAAC;IACzE,eAAe,EAAE,MAAM,CAAC;IACxB,iBAAiB,EAAE,MAAM,CAAC;IAC1B,GAAG,EAAE,MAAM,CAAC;IAEZ,OAAO,EAAE;QACL,GAAG,EAAE,MAAM,CAAC;QACZ,GAAG,EAAE,MAAM,CAAC;KACf,CAAC;gBAGE,SAAS,EAAE,SAAS,EACpB,OAAO,EAAE,QAAQ,EAAE,EACnB,MAAM,EAAE,UAAU,EAClB,eAAe,EAAE,SAAS,GAAG,OAAO,UAAU,EAC9C,iBAAiB,EAAE,SAAS,GAAI,OAAO,UAAU,EACjD,IAAI,EAAE,MAAM,EACZ,cAAc,EAAE,CAAC,CAAC,EAAE,MAAM,KAAK,MAAM,EACrC,gBAAgB,EAAE,CAAC,CAAC,EAAE,MAAM,KAAK,MAAM,EACvC,KAAK,EAAE,KAAK,GAAG,QAAQ,EACvB,SAAS,EAAE,UAAU,GAAG,IAAI;CAyBnC;AAED,wBAAgB,iBAAiB,CAC7B,KAAK,EAAE,eAAe,EACtB,YAAY,EAAE;IACV,KAAK,EAAE,QAAQ,EAAE,EAAE,CAAC;IACpB,OAAO,EAAE,QAAQ,EAAE,CAAC;IACpB,SAAS,EAAE,QAAQ,EAAE,CAAA;CACxB,EACD,IAAI,EAAE,SAAS,EACf,CAAC,EAAE,oBAAoB,CAAC,GAAG,CAAC,EAC5B,KAAK,EAAE,oBAAoB,CAAC,eAAe,CAAC,CAAC,OAAO,CAAC,GACtD,cAAc,CAwEhB"}
|
|
@@ -1,106 +1,94 @@
|
|
|
1
|
-
var
|
|
2
|
-
var
|
|
3
|
-
var b = (
|
|
4
|
-
import { getOutliersBounds as
|
|
5
|
-
import
|
|
6
|
-
import
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
dots: l.slice(s, n)
|
|
22
|
-
}), s = n;
|
|
1
|
+
var k = Object.defineProperty;
|
|
2
|
+
var v = (r, o, i) => o in r ? k(r, o, { enumerable: !0, configurable: !0, writable: !0, value: i }) : r[o] = i;
|
|
3
|
+
var b = (r, o, i) => v(r, typeof o != "symbol" ? o + "" : o, i);
|
|
4
|
+
import { getOutliersBounds as F } from "../utils/getOutliersBounds.js";
|
|
5
|
+
import "../../utils/TextMeasurer/TextMeasurer.js";
|
|
6
|
+
import { getFacetStringKey as N } from "../utils/getFacetStringKey.js";
|
|
7
|
+
import S from "../../node_modules/d3-array/src/extent.js";
|
|
8
|
+
const M = 30;
|
|
9
|
+
function _(r, o, i, c, a, g) {
|
|
10
|
+
const u = r.map(a).map(i), s = r.length, h = r.map((t) => ({ key: g(t), value: a(t) })), m = [];
|
|
11
|
+
let e = 0;
|
|
12
|
+
for (let t = 1; t < s; ++t) {
|
|
13
|
+
const f = u[e], d = u[t], l = u[t - 1];
|
|
14
|
+
if (d >= f + o) {
|
|
15
|
+
const n = Math.min((f + l) / 2, d - o);
|
|
16
|
+
u.fill(n, e, t), m.push({
|
|
17
|
+
x: c(n),
|
|
18
|
+
count: t - e,
|
|
19
|
+
dots: h.slice(e, t)
|
|
20
|
+
}), e = t;
|
|
23
21
|
}
|
|
24
22
|
}
|
|
25
|
-
return
|
|
26
|
-
x:
|
|
27
|
-
count:
|
|
28
|
-
dots:
|
|
29
|
-
}),
|
|
23
|
+
return u.fill((u[e] + u[s - 1]) / 2, e, s), m.push({
|
|
24
|
+
x: c((u[e] + u[s - 1]) / 2),
|
|
25
|
+
count: s - e,
|
|
26
|
+
dots: h.slice(e, s)
|
|
27
|
+
}), m;
|
|
30
28
|
}
|
|
31
|
-
class
|
|
32
|
-
constructor(o,
|
|
29
|
+
class $ {
|
|
30
|
+
constructor(o, i, c, a, g, u, s, h, m, e) {
|
|
33
31
|
b(this, "bins");
|
|
34
32
|
b(this, "primaryGrouping");
|
|
35
33
|
b(this, "secondaryGrouping");
|
|
36
34
|
b(this, "key");
|
|
37
35
|
b(this, "boundsY");
|
|
38
|
-
this.primaryGrouping = String(a), this.secondaryGrouping = String(
|
|
39
|
-
const
|
|
40
|
-
this.bins =
|
|
41
|
-
s,
|
|
42
|
-
f,
|
|
43
|
-
i,
|
|
44
|
-
r,
|
|
45
|
-
l,
|
|
46
|
-
(n, m) => String(d ? n[d.value] : m)
|
|
47
|
-
), this.boundsY = {
|
|
36
|
+
this.primaryGrouping = String(a), this.secondaryGrouping = String(g), this.key = `binnedDots_${this.primaryGrouping}_${this.secondaryGrouping}`;
|
|
37
|
+
const t = (l) => Number(o.getColumnValue(c.value, l)), f = (l) => String(e ? o.getColumnValue(e.value, l) : l), d = i.filter((l) => t(l) === 0 && m === "log" ? (console.warn(`Item with ${c.value} = 0 is not shown on chart with log scale`), !1) : !0).sort((l, n) => s(t(l)) - s(t(n)));
|
|
38
|
+
this.bins = _(d, u, s, h, t, f), this.boundsY = {
|
|
48
39
|
min: this.bins[0].x,
|
|
49
40
|
max: this.bins[this.bins.length - 1].x
|
|
50
41
|
};
|
|
51
42
|
}
|
|
52
43
|
}
|
|
53
|
-
function
|
|
54
|
-
const
|
|
55
|
-
let
|
|
56
|
-
const
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
),
|
|
44
|
+
function U(r, o, i, c, a) {
|
|
45
|
+
const g = (n) => a.scale === "log" ? Math.log10(n) : n, u = (n) => a.scale === "log" ? Math.pow(10, n) : n, s = (n) => Number(i.getColumnValue(c.value, n));
|
|
46
|
+
let h = 1 / 0, m = -1 / 0;
|
|
47
|
+
const e = i.getRowsByGrouping([]), [t = s(e[0]), f = s(e[0])] = S(
|
|
48
|
+
e.filter((n) => s(n) === 0 && a.scale === "log" ? (console.warn(`Item with ${c.value} = 0 is not shown on chart with log scale`), !1) : !0),
|
|
49
|
+
s
|
|
50
|
+
), d = Math.abs(g(t) - g(f)) / M;
|
|
60
51
|
return {
|
|
61
52
|
type: "binnedDots",
|
|
62
|
-
geoms: o.facet.reduce((
|
|
63
|
-
const
|
|
64
|
-
return
|
|
65
|
-
o.secondary.forEach((
|
|
66
|
-
const
|
|
67
|
-
if (!
|
|
53
|
+
geoms: o.facet.reduce((n, G) => {
|
|
54
|
+
const D = N(G);
|
|
55
|
+
return n[D] = [], o.primary.forEach((Y) => {
|
|
56
|
+
o.secondary.forEach((x) => {
|
|
57
|
+
const y = i.getRowsByGrouping([...G, Y, x]);
|
|
58
|
+
if (!y.length)
|
|
68
59
|
return;
|
|
69
|
-
let
|
|
70
|
-
if (!
|
|
71
|
-
const [
|
|
72
|
-
|
|
73
|
-
const v = r(I);
|
|
74
|
-
return v >= C && v <= F;
|
|
75
|
-
});
|
|
60
|
+
let w = Array.from(y);
|
|
61
|
+
if (!r.aes.showOutliers) {
|
|
62
|
+
const [I, B] = F(w, a.scale);
|
|
63
|
+
w = w.filter((C) => s(C) >= I && s(C) <= B);
|
|
76
64
|
}
|
|
77
|
-
const p = new
|
|
78
|
-
M,
|
|
79
|
-
a.value,
|
|
80
|
-
Y,
|
|
81
|
-
G,
|
|
82
|
-
m,
|
|
83
|
-
f,
|
|
65
|
+
const p = new $(
|
|
84
66
|
i,
|
|
85
|
-
|
|
86
|
-
c
|
|
87
|
-
|
|
67
|
+
w,
|
|
68
|
+
c,
|
|
69
|
+
Y,
|
|
70
|
+
x,
|
|
71
|
+
d,
|
|
72
|
+
g,
|
|
73
|
+
u,
|
|
74
|
+
a.scale,
|
|
75
|
+
r.keyColumn
|
|
88
76
|
);
|
|
89
|
-
p.boundsY.min <
|
|
77
|
+
p.boundsY.min < h && (h = p.boundsY.min), p.boundsY.max > m && (m = p.boundsY.max), n[D].push(p);
|
|
90
78
|
});
|
|
91
|
-
}),
|
|
79
|
+
}), n;
|
|
92
80
|
}, {}),
|
|
93
81
|
meta: {
|
|
94
|
-
minY: Math.min(
|
|
95
|
-
maxY: Math.max(
|
|
96
|
-
binsCount:
|
|
97
|
-
hasKeyFromColumn:
|
|
82
|
+
minY: Math.min(t, f, h),
|
|
83
|
+
maxY: Math.max(t, f, m),
|
|
84
|
+
binsCount: M,
|
|
85
|
+
hasKeyFromColumn: r.keyColumn !== null
|
|
98
86
|
},
|
|
99
|
-
aes:
|
|
87
|
+
aes: r.aes
|
|
100
88
|
};
|
|
101
89
|
}
|
|
102
90
|
export {
|
|
103
|
-
|
|
104
|
-
|
|
91
|
+
$ as BinnedDots,
|
|
92
|
+
U as getBinnedDotsData
|
|
105
93
|
};
|
|
106
94
|
//# sourceMappingURL=binnedDots.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"binnedDots.js","sources":["../../../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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"}
|
|
1
|
+
{"version":3,"file":"binnedDots.js","sources":["../../../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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"}
|
|
@@ -1,7 +1,7 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { DataFrame, GroupKey, NO_GROUPED } from '../../DataFrame';
|
|
2
|
+
import { ColumnName, DataValue } from '../../types';
|
|
2
3
|
import { BoxLayer, DiscreteSettingsImpl } from '../DiscreteSettingsImpl';
|
|
3
4
|
import { BoxesData } from './types';
|
|
4
|
-
import { ColumnName, DataValue, Row } from '../../types';
|
|
5
5
|
export declare class Box {
|
|
6
6
|
lower: number;
|
|
7
7
|
middle: number;
|
|
@@ -11,7 +11,6 @@ export declare class Box {
|
|
|
11
11
|
outliers: {
|
|
12
12
|
y: number;
|
|
13
13
|
id: string;
|
|
14
|
-
data: Row;
|
|
15
14
|
}[];
|
|
16
15
|
primaryGrouping: GroupKey;
|
|
17
16
|
secondaryGrouping: GroupKey;
|
|
@@ -20,7 +19,7 @@ export declare class Box {
|
|
|
20
19
|
min: number;
|
|
21
20
|
max: number;
|
|
22
21
|
};
|
|
23
|
-
constructor(
|
|
22
|
+
constructor(values: number[], keys: string[], scale: 'linear' | 'log', primaryGrouping: DataValue | typeof NO_GROUPED, secondaryGrouping: DataValue | typeof NO_GROUPED, lower: number, middle: number, upper: number, k: number, showOutliers?: boolean);
|
|
24
23
|
}
|
|
25
24
|
export declare function getBoxesData(layer: BoxLayer, groupingKeys: {
|
|
26
25
|
facet: GroupKey[][];
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"boxes.d.ts","sourceRoot":"","sources":["../../../src/discrete/layers/boxes.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"boxes.d.ts","sourceRoot":"","sources":["../../../src/discrete/layers/boxes.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,SAAS,EAAE,QAAQ,EAAE,UAAU,EAAE,MAAM,iBAAiB,CAAC;AACvE,OAAO,KAAK,EAAE,UAAU,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AACzD,OAAO,KAAK,EAAE,QAAQ,EAAE,oBAAoB,EAAE,MAAM,yBAAyB,CAAC;AAE9E,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,SAAS,CAAC;AAczC,qBAAa,GAAG;IACZ,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,MAAM,CAAC;IACf,KAAK,EAAE,MAAM,CAAC;IACd,GAAG,EAAE,MAAM,CAAC;IACZ,GAAG,EAAE,MAAM,CAAC;IACZ,QAAQ,EAAE;QACN,CAAC,EAAE,MAAM,CAAC;QACV,EAAE,EAAE,MAAM,CAAC;KACd,EAAE,CAAC;IAGJ,eAAe,EAAE,QAAQ,CAAC;IAC1B,iBAAiB,EAAE,QAAQ,CAAC;IAC5B,GAAG,EAAE,MAAM,CAAC;IAGZ,OAAO,EAAE;QACL,GAAG,EAAE,MAAM,CAAC;QACZ,GAAG,EAAE,MAAM,CAAC;KACf,CAAC;gBAGE,MAAM,EAAE,MAAM,EAAE,EAChB,IAAI,EAAE,MAAM,EAAE,EACd,KAAK,EAAE,QAAQ,GAAG,KAAK,EACvB,eAAe,EAAE,SAAS,GAAG,OAAO,UAAU,EAC9C,iBAAiB,EAAE,SAAS,GAAG,OAAO,UAAU,EAChD,KAAK,EAAE,MAAM,EACb,MAAM,EAAE,MAAM,EACd,KAAK,EAAE,MAAM,EACb,CAAC,EAAE,MAAM,EACT,YAAY,UAAO;CA+C1B;AAED,wBAAgB,YAAY,CACxB,KAAK,EAAE,QAAQ,EACf,YAAY,EAAE;IACV,KAAK,EAAE,QAAQ,EAAE,EAAE,CAAC;IACpB,OAAO,EAAE,QAAQ,EAAE,CAAC;IACpB,SAAS,EAAE,QAAQ,EAAE,CAAA;CACxB,EACD,IAAI,EAAE,SAAS,EACf,CAAC,EAAE,UAAU,EACb,SAAS,EAAE,UAAU,GAAG,IAAI,EAC5B,KAAK,EAAE,oBAAoB,CAAC,eAAe,CAAC,CAAC,OAAO,CAAC,GACtD,SAAS,CA6CX"}
|
|
@@ -1,91 +1,90 @@
|
|
|
1
|
-
var
|
|
2
|
-
var
|
|
3
|
-
var
|
|
4
|
-
import
|
|
5
|
-
import
|
|
6
|
-
import { quantileSorted as
|
|
7
|
-
import
|
|
8
|
-
import
|
|
9
|
-
import
|
|
10
|
-
function
|
|
11
|
-
const
|
|
12
|
-
if (
|
|
13
|
-
const
|
|
14
|
-
if (!
|
|
1
|
+
var I = Object.defineProperty;
|
|
2
|
+
var M = (o, t, i) => t in o ? I(o, t, { enumerable: !0, configurable: !0, writable: !0, value: i }) : o[t] = i;
|
|
3
|
+
var n = (o, t, i) => M(o, typeof t != "symbol" ? t + "" : t, i);
|
|
4
|
+
import v from "../../node_modules/lodash/lodash.js";
|
|
5
|
+
import { getFacetStringKey as E } from "../utils/getFacetStringKey.js";
|
|
6
|
+
import { quantileSorted as S } from "../../node_modules/d3-array/src/quantile.js";
|
|
7
|
+
import $ from "../../node_modules/d3-array/src/min.js";
|
|
8
|
+
import q from "../../node_modules/d3-array/src/max.js";
|
|
9
|
+
import B from "../../node_modules/d3-array/src/extent.js";
|
|
10
|
+
function C(o, t, i = !1) {
|
|
11
|
+
const e = o.sort((a, s) => a - s);
|
|
12
|
+
if (i) {
|
|
13
|
+
const a = v.find(e, (s) => s > 0);
|
|
14
|
+
if (!a)
|
|
15
15
|
throw Error("Group with all zeros in log scale");
|
|
16
|
-
return
|
|
16
|
+
return e.map((s) => s === 0 ? a : s).map(t);
|
|
17
17
|
}
|
|
18
|
-
return
|
|
18
|
+
return e.map(t);
|
|
19
19
|
}
|
|
20
|
-
class
|
|
21
|
-
constructor(t,
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
20
|
+
class F {
|
|
21
|
+
constructor(t, i, e, a, s, u, h, c, l, g = !0) {
|
|
22
|
+
n(this, "lower");
|
|
23
|
+
n(this, "middle");
|
|
24
|
+
n(this, "upper");
|
|
25
|
+
n(this, "min");
|
|
26
|
+
n(this, "max");
|
|
27
|
+
n(this, "outliers");
|
|
28
28
|
// Saved data for linking with visual properties (set color by grouping etc.)
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
29
|
+
n(this, "primaryGrouping");
|
|
30
|
+
n(this, "secondaryGrouping");
|
|
31
|
+
n(this, "key");
|
|
32
32
|
// Bounds for correct chart viewport
|
|
33
|
-
|
|
33
|
+
n(this, "boundsY");
|
|
34
34
|
if (t.length === 0)
|
|
35
35
|
throw Error("Unable to create box on empty data");
|
|
36
|
-
if (u >
|
|
37
|
-
throw Error(`Invalid box bounds values: lower=${u}, middle=${
|
|
38
|
-
if (
|
|
39
|
-
throw Error(`Invalid box whiskers coefficient: k=${
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
data: i,
|
|
46
|
-
id: String(d ? i[d] : $)
|
|
36
|
+
if (u > h || u > c || h > c)
|
|
37
|
+
throw Error(`Invalid box bounds values: lower=${u}, middle=${h}, upper=${c}`);
|
|
38
|
+
if (l < 0)
|
|
39
|
+
throw Error(`Invalid box whiskers coefficient: k=${l}. It should be positive`);
|
|
40
|
+
this.primaryGrouping = String(a), this.secondaryGrouping = String(s), this.key = `box_${this.primaryGrouping}_${this.secondaryGrouping}`;
|
|
41
|
+
const b = (r) => e === "log" ? Math.log10(r) : r, f = (r) => e === "log" ? Math.pow(10, r) : r, p = C(t, b, e === "log"), x = S(p, u), w = S(p, h), m = S(p, c), d = m - x;
|
|
42
|
+
this.upper = f(m), this.middle = f(w), this.lower = f(x), this.min = Math.max($(t), f(x - l * d)), this.max = Math.min(q(t), f(m + l * d)), this.outliers = t.filter((r) => r < this.min || r > this.max).map((r, y) => ({
|
|
43
|
+
y: r,
|
|
44
|
+
id: i[y] ?? String(y)
|
|
47
45
|
}));
|
|
48
|
-
const [
|
|
46
|
+
const [G = 1 / 0, Y = -1 / 0] = B(this.outliers, (r) => r.y);
|
|
49
47
|
this.boundsY = {
|
|
50
|
-
min:
|
|
51
|
-
max:
|
|
48
|
+
min: g ? Math.min(this.min, G) : this.min,
|
|
49
|
+
max: g ? Math.max(this.max, Y) : this.max
|
|
52
50
|
};
|
|
53
51
|
}
|
|
54
52
|
}
|
|
55
|
-
function
|
|
56
|
-
let
|
|
53
|
+
function D(o, t, i, e, a, s) {
|
|
54
|
+
let u = 1 / 0, h = -1 / 0;
|
|
57
55
|
return {
|
|
58
56
|
type: "box",
|
|
59
|
-
geoms: t.facet.reduce((c,
|
|
60
|
-
const
|
|
61
|
-
return c[
|
|
62
|
-
t.secondary.forEach((
|
|
63
|
-
const
|
|
64
|
-
if (!
|
|
57
|
+
geoms: t.facet.reduce((c, l) => {
|
|
58
|
+
const g = E(l);
|
|
59
|
+
return c[g] = [], t.primary.forEach((b) => {
|
|
60
|
+
t.secondary.forEach((f) => {
|
|
61
|
+
const p = i.getRowsByGrouping([...l, b, f]);
|
|
62
|
+
if (!p.length)
|
|
65
63
|
return;
|
|
66
|
-
const
|
|
64
|
+
const x = Array.from(p).map((d) => i.getColumnValue(e.value, d)), w = Array.from(p).map(
|
|
65
|
+
(d) => String((a ? i.getColumnValue(a.value, d) : void 0) ?? d)
|
|
66
|
+
), m = new F(
|
|
67
67
|
x,
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
m,
|
|
68
|
+
w,
|
|
69
|
+
s.scale,
|
|
70
|
+
b,
|
|
71
|
+
f,
|
|
73
72
|
o.stat.lower,
|
|
74
73
|
o.stat.medium,
|
|
75
74
|
o.stat.upper,
|
|
76
75
|
o.stat.k,
|
|
77
76
|
o.aes.showOutliers
|
|
78
77
|
);
|
|
79
|
-
|
|
78
|
+
m.boundsY.min < u && (u = m.boundsY.min), m.boundsY.max > h && (h = m.boundsY.max), c[g].push(m);
|
|
80
79
|
});
|
|
81
80
|
}), c;
|
|
82
81
|
}, {}),
|
|
83
|
-
meta: { minY:
|
|
82
|
+
meta: { minY: u, maxY: h },
|
|
84
83
|
aes: o.aes
|
|
85
84
|
};
|
|
86
85
|
}
|
|
87
86
|
export {
|
|
88
|
-
|
|
89
|
-
|
|
87
|
+
F as Box,
|
|
88
|
+
D as getBoxesData
|
|
90
89
|
};
|
|
91
90
|
//# sourceMappingURL=boxes.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"boxes.js","sources":["../../../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","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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"}
|
|
1
|
+
{"version":3,"file":"boxes.js","sources":["../../../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","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":";;;;;;;;;AAQA,SAASA,EAA0BC,GAAsBC,GAAqCC,IAAc,IAAO;AAC/G,QAAMC,IAAeH,EAAW,KAAK,CAAC,GAAGI,MAAM,IAAIA,CAAC;AACpD,MAAIF,GAAa;AACb,UAAMG,IAAoBC,EAAO,KAAKH,GAAc,CAACI,MAAMA,IAAI,CAAC;AAChE,QAAI,CAACF;AACD,YAAM,MAAM,mCAAmC;AAEnD,WAAOF,EAAa,IAAI,CAACI,MAAMA,MAAM,IAAIF,IAAoBE,CAAC,EAAE,IAAIN,CAAc;AAAA,EACtF;AACA,SAAOE,EAAa,IAAIF,CAAc;AAC1C;AAEO,MAAMO,EAAI;AAAA,EAsBb,YACIC,GACAC,GACAC,GACAC,GACAC,GACAC,GACAC,GACAC,GACAC,GACAC,IAAe,IACjB;AAhCF,IAAAC,EAAA;AACA,IAAAA,EAAA;AACA,IAAAA,EAAA;AACA,IAAAA,EAAA;AACA,IAAAA,EAAA;AACA,IAAAA,EAAA;AAMA;AAAA,IAAAA,EAAA;AACA,IAAAA,EAAA;AACA,IAAAA,EAAA;AAGA;AAAA,IAAAA,EAAA;AAiBI,QAAIV,EAAO,WAAW;AAClB,YAAM,MAAM,oCAAoC;AAEpD,QAAIK,IAAQC,KAAUD,IAAQE,KAASD,IAASC;AAC5C,YAAM,MAAM,oCAAoCF,CAAK,YAAYC,CAAM,WAAWC,CAAK,EAAE;AAE7F,QAAIC,IAAI;AACJ,YAAM,MAAM,uCAAuCA,CAAC,yBAAyB;AAGjF,SAAK,kBAAkB,OAAOL,CAAe,GAC7C,KAAK,oBAAoB,OAAOC,CAAiB,GACjD,KAAK,MAAM,OAAO,KAAK,eAAe,IAAI,KAAK,iBAAiB;AAGhE,UAAMZ,IAAiB,CAACM,MAAeI,MAAU,QAAQ,KAAK,MAAMJ,CAAC,IAAIA,GACnEa,IAAmB,CAACb,MAAeI,MAAU,QAAQ,KAAK,IAAI,IAAIJ,CAAC,IAAIA,GAGvEc,IAAwBtB,EAAyBU,GAAQR,GAAgBU,MAAU,KAAK,GAExFW,IAAKC,EAAeF,GAAuBP,CAAK,GAChDU,IAAKD,EAAeF,GAAuBN,CAAM,GACjDU,IAAKF,EAAeF,GAAuBL,CAAK,GAChDU,IAAqBD,IAAKH;AAEhC,SAAK,QAAQF,EAAiBK,CAAE,GAChC,KAAK,SAASL,EAAiBI,CAAE,GACjC,KAAK,QAAQJ,EAAiBE,CAAE,GAEhC,KAAK,MAAM,KAAK,IAAIK,EAAIlB,CAAM,GAAaW,EAAiBE,IAAKL,IAAIS,CAAkB,CAAC,GACxF,KAAK,MAAM,KAAK,IAAIE,EAAInB,CAAM,GAAaW,EAAiBK,IAAKR,IAAIS,CAAkB,CAAC,GACxF,KAAK,WAAWjB,EACX,OAAO,CAACoB,MAAcA,IAAI,KAAK,OAAOA,IAAI,KAAK,GAAG,EAClD,IAAI,CAACA,GAAGC,OAAS;AAAA,MACd,GAAAD;AAAA,MACA,IAAInB,EAAKoB,CAAG,KAAK,OAAOA,CAAG;AAAA,IAAA,EAC7B;AAEN,UAAM,CAACC,IAAa,OAAUC,IAAa,MAAS,IAAIC,EAAO,KAAK,UAAU,CAAAC,MAAQA,EAAK,CAAC;AAC5F,SAAK,UAAU;AAAA,MACX,KAAKhB,IAAe,KAAK,IAAI,KAAK,KAAKa,CAAU,IAAI,KAAK;AAAA,MAC1D,KAAKb,IAAe,KAAK,IAAI,KAAK,KAAKc,CAAU,IAAI,KAAK;AAAA,IAAA;AAAA,EAElE;AACJ;AAEO,SAASG,EACZC,GACAC,GAKAC,GACAT,GACAU,GACAC,GACS;AACT,MAAIC,IAAO,OACPC,IAAO;AAEX,SAAO;AAAA,IACH,MAAM;AAAA,IACN,OAAOL,EAAa,MAAM,OAAO,CAACM,GAA4BC,MAAa;AACvE,YAAMC,IAAcC,EAAkBF,CAAQ;AAC9C,aAAAD,EAAIE,CAAW,IAAI,CAAA,GACnBR,EAAa,QAAQ,QAAQ,CAAAU,MAAc;AACvC,QAAAV,EAAa,UAAU,QAAQ,CAAAW,MAAgB;AAC3C,gBAAMC,IAAUX,EAAK,kBAAkB,CAAC,GAAGM,GAAUG,GAAYC,CAAY,CAAC;AAC9E,cAAI,CAACC,EAAQ;AACT;AAEJ,gBAAMxC,IAAS,MAAM,KAAKwC,CAAO,EAAE,IAAI,CAAAC,MAAKZ,EAAK,eAAeT,EAAE,OAAOqB,CAAC,CAAW,GAC/ExC,IAAO,MAAM,KAAKuC,CAAO,EAAE;AAAA,YAAI,CAAAC,MACjC,QAAQX,IAAYD,EAAK,eAAeC,EAAU,OAAOW,CAAC,IAAI,WAAcA,CAAC;AAAA,UAAA,GAE3EC,IAAM,IAAI3C;AAAA,YACZC;AAAA,YACAC;AAAA,YACA8B,EAAM;AAAA,YACNO;AAAA,YACAC;AAAA,YACAZ,EAAM,KAAK;AAAA,YACXA,EAAM,KAAK;AAAA,YACXA,EAAM,KAAK;AAAA,YACXA,EAAM,KAAK;AAAA,YACXA,EAAM,IAAI;AAAA,UAAA;AAEd,UAAIe,EAAI,QAAQ,MAAMV,MAClBA,IAAOU,EAAI,QAAQ,MAEnBA,EAAI,QAAQ,MAAMT,MAClBA,IAAOS,EAAI,QAAQ,MAEvBR,EAAIE,CAAW,EAAE,KAAKM,CAAG;AAAA,QAC7B,CAAC;AAAA,MACL,CAAC,GACMR;AAAA,IACX,GAAG,CAAA,CAA6B;AAAA,IAChC,MAAM,EAAC,MAAAF,GAAM,MAAAC,EAAA;AAAA,IACb,KAAKN,EAAM;AAAA,EAAA;AAEnB;"}
|
|
@@ -1,14 +1,13 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { DataFrame, GroupKey } from '../../DataFrame';
|
|
2
|
+
import { ColumnName } from '../../types';
|
|
2
3
|
import { DiscreteSettingsImpl, DotLayer } from '../DiscreteSettingsImpl';
|
|
3
4
|
import { DotsData } from './types';
|
|
4
|
-
import { ColumnName, DataValue } from '../../types';
|
|
5
5
|
export type DotsGroup = {
|
|
6
6
|
key: string;
|
|
7
7
|
values: {
|
|
8
8
|
y: number;
|
|
9
9
|
jitter: number;
|
|
10
10
|
id: string;
|
|
11
|
-
data: Record<string, DataValue>;
|
|
12
11
|
}[];
|
|
13
12
|
primaryGrouping: string;
|
|
14
13
|
secondaryGrouping: string;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"dots.d.ts","sourceRoot":"","sources":["../../../src/discrete/layers/dots.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"dots.d.ts","sourceRoot":"","sources":["../../../src/discrete/layers/dots.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,SAAS,EAAE,QAAQ,EAAE,MAAM,iBAAiB,CAAC;AAC3D,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AAC9C,OAAO,KAAK,EAAE,oBAAoB,EAAE,QAAQ,EAAE,MAAM,yBAAyB,CAAC;AAG9E,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,SAAS,CAAC;AAExC,MAAM,MAAM,SAAS,GAAG;IACpB,GAAG,EAAE,MAAM,CAAC;IACZ,MAAM,EAAE;QAAC,CAAC,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,MAAM,CAAC;QAAC,EAAE,EAAE,MAAM,CAAC;KAAC,EAAE,CAAC;IACnD,eAAe,EAAE,MAAM,CAAC;IACxB,iBAAiB,EAAE,MAAM,CAAC;IAC1B,OAAO,EAAE;QACL,GAAG,EAAE,MAAM,CAAC;QACZ,GAAG,EAAE,MAAM,CAAC;KACf,CAAC;CACL,CAAC;AAEF,wBAAgB,WAAW,CACvB,KAAK,EAAE,QAAQ,EACf,YAAY,EAAE;IACV,KAAK,EAAE,QAAQ,EAAE,EAAE,CAAC;IACpB,OAAO,EAAE,QAAQ,EAAE,CAAC;IACpB,SAAS,EAAE,QAAQ,EAAE,CAAA;CACxB,EACD,IAAI,EAAE,SAAS,EACf,CAAC,EAAE,UAAU,EACb,KAAK,EAAE,oBAAoB,CAAC,eAAe,CAAC,CAAC,OAAO,CAAC,EACrD,SAAS,EAAE,UAAU,GAAG,IAAI,GAC7B,QAAQ,CAkDV"}
|
|
@@ -1,46 +1,46 @@
|
|
|
1
1
|
import { getOutliersBounds as I } from "../utils/getOutliersBounds.js";
|
|
2
|
-
import
|
|
3
|
-
import F from "
|
|
4
|
-
import Y from "../../node_modules/d3-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
2
|
+
import "../../utils/TextMeasurer/TextMeasurer.js";
|
|
3
|
+
import { getFacetStringKey as F } from "../utils/getFacetStringKey.js";
|
|
4
|
+
import Y from "../../node_modules/d3-random/src/lcg.js";
|
|
5
|
+
import w from "../../node_modules/d3-array/src/extent.js";
|
|
6
|
+
function V(g, r, i, x, b, c) {
|
|
7
|
+
let o = 1 / 0, s = -1 / 0;
|
|
8
|
+
const y = Y(1);
|
|
8
9
|
return {
|
|
9
10
|
type: "dot",
|
|
10
|
-
geoms:
|
|
11
|
-
const
|
|
12
|
-
return
|
|
13
|
-
|
|
14
|
-
const
|
|
15
|
-
if (!
|
|
11
|
+
geoms: r.facet.reduce((u, p) => {
|
|
12
|
+
const d = F(p);
|
|
13
|
+
return u[d] = [], r.primary.forEach((m) => {
|
|
14
|
+
r.secondary.forEach((a) => {
|
|
15
|
+
const S = i.getRowsByGrouping([...p, m, a]);
|
|
16
|
+
if (!S.length)
|
|
16
17
|
return;
|
|
17
|
-
const
|
|
18
|
-
let
|
|
19
|
-
y:
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
data: t
|
|
18
|
+
const G = (t) => Number(i.getColumnValue(x.value, t)), h = Array.from(S).map(G);
|
|
19
|
+
let e = h.map((t, n) => ({
|
|
20
|
+
y: t,
|
|
21
|
+
id: String(c ? i.getColumnValue(c.value, n) : n),
|
|
22
|
+
jitter: y()
|
|
23
23
|
}));
|
|
24
24
|
if (!g.aes.showOutliers) {
|
|
25
|
-
const [t,
|
|
26
|
-
|
|
25
|
+
const [t, n] = I(h, b.scale);
|
|
26
|
+
e = e.filter(({ y: v }) => v >= t && v <= n);
|
|
27
27
|
}
|
|
28
|
-
const [f = 1 / 0,
|
|
29
|
-
f <
|
|
30
|
-
key: `dots_${String(
|
|
31
|
-
values:
|
|
32
|
-
primaryGrouping: String(
|
|
33
|
-
secondaryGrouping: String(
|
|
34
|
-
boundsY: { min: f, max:
|
|
28
|
+
const [f = 1 / 0, l = -1 / 0] = w(e, (t) => t.y);
|
|
29
|
+
f < o && (o = f), l > s && (s = l), u[d].push({
|
|
30
|
+
key: `dots_${String(m)}_${String(a)}`,
|
|
31
|
+
values: e,
|
|
32
|
+
primaryGrouping: String(m),
|
|
33
|
+
secondaryGrouping: String(a),
|
|
34
|
+
boundsY: { min: f, max: l }
|
|
35
35
|
});
|
|
36
36
|
});
|
|
37
|
-
}),
|
|
37
|
+
}), u;
|
|
38
38
|
}, {}),
|
|
39
|
-
meta: { minY:
|
|
39
|
+
meta: { minY: o, maxY: s },
|
|
40
40
|
aes: g.aes
|
|
41
41
|
};
|
|
42
42
|
}
|
|
43
43
|
export {
|
|
44
|
-
|
|
44
|
+
V as getDotsData
|
|
45
45
|
};
|
|
46
46
|
//# sourceMappingURL=dots.js.map
|