@milaboratories/miplots4 1.0.161 → 1.0.163

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 (76) hide show
  1. package/dist/_virtual/index10.js +2 -5
  2. package/dist/_virtual/index10.js.map +1 -1
  3. package/dist/_virtual/index5.js +5 -2
  4. package/dist/_virtual/index5.js.map +1 -1
  5. package/dist/_virtual/index6.js +4 -4
  6. package/dist/_virtual/index7.js +1 -1
  7. package/dist/_virtual/index8.js +4 -4
  8. package/dist/_virtual/index9.js +3 -3
  9. package/dist/common/BandAxis.d.ts +2 -1
  10. package/dist/common/BandAxis.js +19 -18
  11. package/dist/common/BandAxis.js.map +1 -1
  12. package/dist/common/ContinuousAxis.js +20 -20
  13. package/dist/common/ContinuousAxis.js.map +1 -1
  14. package/dist/common/Legend.js +3 -3
  15. package/dist/common/Legend.js.map +1 -1
  16. package/dist/discrete/DiscreteSettingsImpl.d.ts +6 -4
  17. package/dist/discrete/DiscreteSettingsImpl.js +9 -9
  18. package/dist/discrete/DiscreteSettingsImpl.js.map +1 -1
  19. package/dist/discrete/constants.d.ts +1 -1
  20. package/dist/discrete/constants.js +1 -1
  21. package/dist/discrete/constants.js.map +1 -1
  22. package/dist/discrete/index.js +107 -106
  23. package/dist/discrete/index.js.map +1 -1
  24. package/dist/discrete/layers/bar.js +25 -22
  25. package/dist/discrete/layers/bar.js.map +1 -1
  26. package/dist/discrete/layers/errorbars.js +57 -48
  27. package/dist/discrete/layers/errorbars.js.map +1 -1
  28. package/dist/discrete/layers/lines.js +40 -31
  29. package/dist/discrete/layers/lines.js.map +1 -1
  30. package/dist/discrete/layers/stackedBar.js.map +1 -1
  31. package/dist/discrete/layers/stats/pValueCalculation.js +5 -5
  32. package/dist/heatmap/components/Captions/AxisCaptions.js +34 -34
  33. package/dist/heatmap/components/Captions/AxisCaptions.js.map +1 -1
  34. package/dist/heatmap/fillCellsData.js +49 -46
  35. package/dist/heatmap/fillCellsData.js.map +1 -1
  36. package/dist/heatmap/utils/calculateChartSideElementSizes.js +23 -23
  37. package/dist/heatmap/utils/calculateChartSideElementSizes.js.map +1 -1
  38. package/dist/histogram/ChartRenderer.js +57 -54
  39. package/dist/histogram/ChartRenderer.js.map +1 -1
  40. package/dist/histogram/constants.d.ts +1 -1
  41. package/dist/histogram/constants.js.map +1 -1
  42. package/dist/histogram/index.js +58 -51
  43. package/dist/histogram/index.js.map +1 -1
  44. package/dist/node_modules/.pnpm/scheduler@0.23.2/node_modules/scheduler/index.js +1 -1
  45. package/dist/scatterplot/ChartRenderer.js +89 -89
  46. package/dist/scatterplot/ChartRenderer.js.map +1 -1
  47. package/dist/scatterplot/components/ChartAxis.js +30 -30
  48. package/dist/scatterplot/components/ChartAxis.js.map +1 -1
  49. package/dist/scatterplot/components/ChartAxisTitles.js +22 -22
  50. package/dist/scatterplot/components/ChartAxisTitles.js.map +1 -1
  51. package/dist/scatterplot/constants.d.ts +1 -1
  52. package/dist/scatterplot/constants.js +1 -1
  53. package/dist/scatterplot/constants.js.map +1 -1
  54. package/dist/scatterplot/dots.d.ts +1 -1
  55. package/dist/scatterplot/dots.js +14 -14
  56. package/dist/scatterplot/dots.js.map +1 -1
  57. package/dist/scatterplot/index.js +94 -79
  58. package/dist/scatterplot/index.js.map +1 -1
  59. package/dist/scatterplot-umap/ChartRenderer.d.ts +1 -1
  60. package/dist/scatterplot-umap/ChartRenderer.js +14 -14
  61. package/dist/scatterplot-umap/ChartRenderer.js.map +1 -1
  62. package/dist/scatterplot-umap/components/LowerSVG.js +38 -38
  63. package/dist/scatterplot-umap/components/LowerSVG.js.map +1 -1
  64. package/dist/types/bubble.d.ts +5 -5
  65. package/dist/types/bubble.js +40 -40
  66. package/dist/types/bubble.js.map +1 -1
  67. package/dist/types/common.d.ts +25 -2
  68. package/dist/types/common.js +16 -15
  69. package/dist/types/common.js.map +1 -1
  70. package/dist/types/discrete.d.ts +66 -56
  71. package/dist/types/discrete.js +40 -38
  72. package/dist/types/discrete.js.map +1 -1
  73. package/dist/types/heatmap.d.ts +5 -6
  74. package/dist/types/heatmap.js +29 -29
  75. package/dist/types/heatmap.js.map +1 -1
  76. package/package.json +1 -1
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sources":["../../src/discrete/index.ts"],"sourcesContent":["import { intersection } from 'lodash';\nimport { renderToString } from 'react-dom/server';\nimport { AbstractChart } from '../AbstractChart';\nimport type { DataFrame, GroupKey } from '../DataFrame';\nimport { NO_GROUPED } from '../DataFrame';\nimport {\n type Category, type ColumnName, type DataValue, type DiscreteEventHandlers,\n type DiscreteSettings, type ErrorInfoFacets, type ErrorInfoPrimaryGroups,\n type ErrorInfoSecondaryGroups, getUnknownErrorInfo, type GroupingData, isErrorInfo\n} from '../types';\nimport ChartRenderer from './ChartRenderer';\nimport { MAX_FACETS_COUNT, MAX_GROUPS_COUNT } from '../constants';\nimport {\n BarLayer,\n BinnedDotsLayer,\n BoxLayer,\n DiscreteSettingsImpl,\n DotLayer,\n ErrorBarLayer,\n LineLayer,\n LogoPlotLayer,\n PairedPointsLayer,\n SinaLayer, StackedAreaLayer,\n StackedBarLayer,\n StatLayer,\n ViolinLayer,\n} from './DiscreteSettingsImpl';\nimport {\n getBarsData,\n getBinnedDotsData,\n getBoxesData,\n getDotsData,\n getErrorBarsData,\n getLinesData,\n getPairedPointsData,\n getSinaData,\n getStackedBarsData,\n getStatsData,\n getViolinsData,\n} from './layers';\nimport { getLogoData } from './layers/logo';\nimport { getStackedAreaData } from './layers/stackedArea';\nimport type { LayerData, StatsData } from './layers/types';\nimport { getFacetStringKey } from './utils/getFacetStringKey';\nimport { arraysAreDifferent } from '../utils/arraysAreDifferent';\n\nfunction getGroupingKeys(data: DataFrame, column: ColumnName, order: DataValue[] | null = null) {\n const groupingColumn = column.value;\n const availableKeys = data.getColumnCategories(groupingColumn);\n return intersection(order ?? availableKeys, availableKeys).map(String);\n}\n\n// all combinations with 1 key from each list\nfunction getKeysCombinations(keysLists: string[][]) {\n if (!keysLists.length) {\n return [];\n }\n let result: string[][] = [[]];\n keysLists.forEach(keys => {\n const nextResult: string[][] = [];\n keys.forEach(key => {\n nextResult.push(...result.map(resultItem => [...resultItem, key]));\n });\n result = nextResult;\n });\n return result;\n}\n\nfunction getGroupingData(\n data: DataFrame,\n grouping: DiscreteSettingsImpl['primaryGrouping' | 'secondaryGrouping']\n): GroupingData {\n if (!grouping) {\n return {\n keys: ['null'],\n value: null,\n label: '',\n valueLabels: { null: '' },\n inheritedAes: null,\n };\n }\n\n const groupingColumnId = grouping.columnName.value;\n const groupingColumnLabelId = grouping.columnName.valueLabels;\n const categories = data.getColumnCategories(groupingColumnId, false);\n const getValueLabel = (category: Category) => {\n return groupingColumnLabelId\n ? String(\n data.getColumnValue(\n groupingColumnLabelId,\n data.getColumnCategoryRowIndex(groupingColumnId, category)\n )\n )\n : category;\n };\n\n const keys = data.getColumnCategories(groupingColumnId, !grouping.allowNullGroup);\n const orderedKeys = grouping.order === undefined ? keys : intersection(grouping.order.map(String), keys);\n\n return {\n keys: orderedKeys,\n value: groupingColumnId,\n label: grouping.columnName.label ?? groupingColumnId,\n valueLabels: categories.reduce((res: Record<string, string>, category: Category) => {\n res[category] = getValueLabel(category);\n return res;\n }, {}),\n inheritedAes: grouping.inheritedAes ?? null,\n };\n}\n\nexport class ChartDiscrete extends AbstractChart {\n settings: DiscreteSettingsImpl;\n chartRenderer = new ChartRenderer();\n\n onTooltipHintSwitch: (v: boolean) => void = () => undefined;\n calculatedData: {\n layersData: LayerData[];\n statsLayersData: StatsData[];\n primaryGrouping: GroupingData;\n secondaryGrouping: GroupingData;\n facetKeyLists: GroupKey[][];\n nonEmptyGroupsByFacets: Record<string, string[]>;\n onlyPositive: boolean;\n } | null = null;\n\n constructor(data: DataFrame, settings: DiscreteSettings, eventHandlers?: DiscreteEventHandlers) {\n super(data, settings);\n\n this.settings = new DiscreteSettingsImpl(settings);\n if (eventHandlers) {\n this.onTooltipHintSwitch = eventHandlers[0];\n }\n }\n\n mount(node: HTMLElement) {\n try {\n this.chartRenderer.init(node);\n this._updateData();\n this._updateChart();\n this.hasError = false;\n this.errorInfo = null;\n } catch (err) {\n this.hasError = true;\n if (err instanceof Error) {\n this.errorInfo = isErrorInfo(err.cause) ? err.cause : getUnknownErrorInfo(err);\n this.chartRenderer.renderError(err.message as string);\n console.error(err);\n }\n }\n }\n\n unmount() {\n this.chartRenderer.clear();\n }\n\n updateSettingsAndData(data: DataFrame, settings: DiscreteSettings) {\n try {\n const previousSettings = this.settings;\n const previousData = this.data;\n this.settings = new DiscreteSettingsImpl(settings);\n this.data = data;\n if (\n this._needUpdateCalculatedDataBySettings(previousSettings, this.settings) ||\n this._needUpdateCalculatedDataByData(previousData, this.data)\n ) {\n this._updateData();\n } else {\n this._updateAesInData();\n }\n this._updateChart();\n this.hasError = false;\n this.errorInfo = null;\n } catch (err) {\n this.hasError = true;\n if (err instanceof Error) {\n this.errorInfo = isErrorInfo(err.cause) ? err.cause : getUnknownErrorInfo(err);\n this.chartRenderer.renderError(err.message as string);\n console.error(err);\n }\n }\n }\n\n updateChartState(_field: string, _value: unknown) {\n console.warn('no chart state for discrete');\n }\n\n export(): string {\n this._updateChart();\n return renderToString(this.chartRenderer.component);\n }\n\n _needUpdateCalculatedDataBySettings(prevSettings: DiscreteSettingsImpl, settings: DiscreteSettingsImpl) {\n return (\n prevSettings.chartSettings.yAxis.scale !== settings.chartSettings.yAxis.scale ||\n (prevSettings.primaryGrouping?.columnName.value ?? '') !==\n (settings.primaryGrouping?.columnName.value ?? '') ||\n (prevSettings.secondaryGrouping?.columnName.value ?? '') !==\n (settings.secondaryGrouping?.columnName.value ?? '') ||\n (prevSettings.primaryGrouping?.allowNullGroup ?? '') !==\n (settings.primaryGrouping?.allowNullGroup ?? '') ||\n (prevSettings.secondaryGrouping?.allowNullGroup ?? '') !==\n (settings.secondaryGrouping?.allowNullGroup ?? '') ||\n arraysAreDifferent(prevSettings.primaryGrouping?.order, settings.primaryGrouping?.order, { ignoreOrder: true }) ||\n arraysAreDifferent(prevSettings.secondaryGrouping?.order, settings.secondaryGrouping?.order, { ignoreOrder: true }) ||\n prevSettings.facetBy.some((el, idx) => el.value !== settings.facetBy[idx]?.value) ||\n prevSettings.layers.length !== settings.layers.length ||\n prevSettings.layers.some((l, idx) => !l.isEqualForCalculation(settings.layers[idx] as typeof l))\n );\n }\n\n _needUpdateCalculatedDataByData(prevData: DataFrame, data: DataFrame) {\n const prevKeys = Object.keys(prevData.data);\n const keys = Object.keys(data.data);\n return (\n prevData.id !== data.id ||\n prevKeys.length !== keys.length ||\n prevKeys.some(key => prevData.data[key].length !== data.data[key]?.length)\n );\n }\n\n _updateData() {\n const { chartSettings, y, keyColumn, facetBy, layers, facetSettings } = this.settings;\n const { yAxis } = chartSettings;\n\n const onlyPositive = this.data.getColumn(y.value).every(v => {\n return v === null || !(Number(v) < 0);\n });\n // console.info('only positive Y:', onlyPositive);\n\n const primaryGrouping = getGroupingData(this.data, this.settings.primaryGrouping);\n const secondaryGrouping = getGroupingData(this.data, this.settings.secondaryGrouping);\n const facetGroupingValues = facetBy.map(column => column.value);\n const hasLogoOrBarLayer = layers.some(l => l.type === 'logo' || l.type === 'bar');\n\n if (!hasLogoOrBarLayer && primaryGrouping.keys.length > MAX_GROUPS_COUNT) {\n const errorInfo: ErrorInfoPrimaryGroups = {\n type: 'tooManyPrimaryGroups',\n info: { count: primaryGrouping.keys.length, maxCount: MAX_GROUPS_COUNT }\n };\n throw Error(errorInfo.type, { cause: errorInfo });\n }\n if (!hasLogoOrBarLayer && secondaryGrouping.keys.length > MAX_GROUPS_COUNT) {\n const errorInfo: ErrorInfoSecondaryGroups = {\n type: 'tooManySecondaryGroups',\n info: { count: secondaryGrouping.keys.length, maxCount: MAX_GROUPS_COUNT }\n };\n throw Error(errorInfo.type, { cause: errorInfo });\n }\n\n // if facet created by more than 1 data column facet key contains all of them, and all keys are used in data grouping;\n // after data preparing we need only complex keys from concatenated strings\n const facetKeyLists: (GroupKey)[][] = facetBy.length\n ? getKeysCombinations(\n facetBy.map(column => getGroupingKeys(this.data, column, facetSettings?.order?.[column.value]))\n )\n : [[NO_GROUPED]];\n\n if (facetKeyLists.length > MAX_FACETS_COUNT) {\n const errorInfo: ErrorInfoFacets = {\n type: 'tooManyFacets',\n info: { count: facetKeyLists.length, maxCount: MAX_FACETS_COUNT }\n };\n throw Error(errorInfo.type, { cause: errorInfo });\n }\n this.data.setGrouping([...facetGroupingValues, primaryGrouping.value, secondaryGrouping.value]);\n const groupingKeys = {\n facet: facetKeyLists,\n primary: (primaryGrouping.value !== null ? primaryGrouping.keys : [NO_GROUPED]) as GroupKey[],\n secondary: (secondaryGrouping.value !== null ? secondaryGrouping.keys : [NO_GROUPED]) as GroupKey[],\n };\n\n const nonEmptyGroupsByFacets = groupingKeys.facet.reduce((res: Record<string, string[]>, facetKey) => {\n res[getFacetStringKey(facetKey)] = groupingKeys.primary.filter(\n primaryKey => this.data.getRowsByGrouping([...facetKey, primaryKey]).length > 0\n ).map(String);\n return res;\n }, {});\n\n const layersData = layers\n .filter(layer => !(layer instanceof StatLayer))\n .map(layer => {\n if (layer instanceof BoxLayer) {\n return getBoxesData(layer, groupingKeys, this.data, y, keyColumn, yAxis);\n }\n if (layer instanceof ViolinLayer) {\n return getViolinsData(layer, groupingKeys, this.data, y, yAxis);\n }\n if (layer instanceof DotLayer) {\n return getDotsData(layer, groupingKeys, this.data, y, yAxis, keyColumn);\n }\n if (layer instanceof LineLayer) {\n return getLinesData(layer, groupingKeys, this.data, y, yAxis);\n }\n if (layer instanceof ErrorBarLayer) {\n return getErrorBarsData(layer, groupingKeys, this.data, y, yAxis);\n }\n if (layer instanceof BarLayer) {\n return getBarsData(layer, groupingKeys, this.data, y, yAxis);\n }\n if (layer instanceof StackedBarLayer) {\n return getStackedBarsData(layer, groupingKeys, this.data, y);\n }\n if (layer instanceof StackedAreaLayer) {\n return getStackedAreaData(layer, groupingKeys, this.data, y);\n }\n if (layer instanceof BinnedDotsLayer) {\n return getBinnedDotsData(layer, groupingKeys, this.data, y, yAxis);\n }\n if (layer instanceof PairedPointsLayer) {\n return getPairedPointsData(layer, groupingKeys, this.data, y, yAxis);\n }\n if (layer instanceof SinaLayer) {\n return getSinaData(layer, groupingKeys, this.data, y, yAxis);\n }\n if (layer instanceof LogoPlotLayer) {\n return getLogoData(layer, groupingKeys, this.data, y);\n }\n throw new Error('Unknown layer type');\n });\n const statsLayersData = layers\n .filter(layer => layer instanceof StatLayer)\n .map(layer => {\n if (primaryGrouping.value === null) {\n throw new Error('Cannot calculate p-value without data grouping');\n }\n return getStatsData(layer as StatLayer, groupingKeys.facet, groupingKeys.primary, y, this.data);\n });\n this.calculatedData = {\n layersData,\n statsLayersData,\n primaryGrouping,\n secondaryGrouping,\n facetKeyLists,\n nonEmptyGroupsByFacets,\n onlyPositive,\n };\n }\n\n _updateAesInData() {\n if (this.calculatedData === null) {\n return;\n }\n const { layers, facetBy, primaryGrouping, secondaryGrouping, facetSettings } = this.settings;\n\n // updating aes in layers (except for stat layers with p-value), layers data is not recalculating\n const noStatLayers = layers.filter(layer => !(layer instanceof StatLayer));\n for (let i = 0; i < noStatLayers.length; i++) {\n const layer = noStatLayers[i];\n if ('aes' in layer) {\n this.calculatedData.layersData[i].aes = layer.aes;\n }\n }\n\n // updating grouping to update linked aes\n this.calculatedData.primaryGrouping = getGroupingData(this.data, primaryGrouping);\n this.calculatedData.secondaryGrouping = getGroupingData(this.data, secondaryGrouping);\n\n // updating for possibly changed facetSettings.order\n this.calculatedData.facetKeyLists = facetBy.length\n ? getKeysCombinations(\n facetBy.map(column => getGroupingKeys(this.data, column, facetSettings?.order?.[column.value]))\n )\n : [[NO_GROUPED]];\n }\n\n _updateChart() {\n if (!this.calculatedData) {\n return;\n }\n const { id, chartSettings, keyColumn, facetSettings } = this.settings;\n\n const facetKeys = this.calculatedData.facetKeyLists.map(getFacetStringKey);\n const facetLabels = this.calculatedData.facetKeyLists.map(v => v.map(v => v === NO_GROUPED ? 'null' : v)) as string[][];\n this.chartRenderer.render(\n this.data,\n id,\n chartSettings,\n this.calculatedData.primaryGrouping,\n this.calculatedData.secondaryGrouping,\n facetSettings,\n facetKeys,\n facetLabels,\n this.calculatedData.layersData,\n this.calculatedData.statsLayersData,\n keyColumn,\n this.calculatedData.nonEmptyGroupsByFacets,\n this.calculatedData.onlyPositive,\n this.onTooltipHintSwitch\n );\n }\n}\n"],"names":["getGroupingKeys","data","column","order","groupingColumn","availableKeys","intersection","getKeysCombinations","keysLists","result","keys","nextResult","key","resultItem","getGroupingData","grouping","groupingColumnId","groupingColumnLabelId","categories","getValueLabel","category","res","ChartDiscrete","AbstractChart","settings","eventHandlers","__publicField","ChartRenderer","DiscreteSettingsImpl","node","err","isErrorInfo","getUnknownErrorInfo","previousSettings","previousData","_field","_value","renderToString","prevSettings","_a","_b","_c","_d","_e","_f","_g","_h","arraysAreDifferent","_i","_j","_k","_l","el","idx","l","prevData","prevKeys","chartSettings","y","keyColumn","facetBy","layers","facetSettings","yAxis","onlyPositive","v","primaryGrouping","secondaryGrouping","facetGroupingValues","hasLogoOrBarLayer","MAX_GROUPS_COUNT","errorInfo","facetKeyLists","NO_GROUPED","MAX_FACETS_COUNT","groupingKeys","nonEmptyGroupsByFacets","facetKey","getFacetStringKey","primaryKey","layersData","layer","StatLayer","BoxLayer","getBoxesData","ViolinLayer","getViolinsData","DotLayer","getDotsData","LineLayer","getLinesData","ErrorBarLayer","getErrorBarsData","BarLayer","getBarsData","StackedBarLayer","getStackedBarsData","StackedAreaLayer","getStackedAreaData","BinnedDotsLayer","getBinnedDotsData","PairedPointsLayer","getPairedPointsData","SinaLayer","getSinaData","LogoPlotLayer","getLogoData","statsLayersData","getStatsData","noStatLayers","i","id","facetKeys","facetLabels"],"mappings":"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"}
1
+ {"version":3,"file":"index.js","sources":["../../src/discrete/index.ts"],"sourcesContent":["import { intersection } from 'lodash';\nimport { renderToString } from 'react-dom/server';\nimport { AbstractChart } from '../AbstractChart';\nimport type { DataFrame, GroupKey } from '../DataFrame';\nimport { NO_GROUPED } from '../DataFrame';\nimport {\n type Category, type ColumnName, type DataValue, type DiscreteEventHandlers,\n type DiscreteSettings, type ErrorInfoFacets, type ErrorInfoPrimaryGroups,\n type ErrorInfoSecondaryGroups, getUnknownErrorInfo, type GroupingData, isErrorInfo\n} from '../types';\nimport ChartRenderer from './ChartRenderer';\nimport { MAX_FACETS_COUNT, MAX_GROUPS_COUNT } from '../constants';\nimport {\n BarLayer,\n BinnedDotsLayer,\n BoxLayer,\n DiscreteSettingsImpl,\n DotLayer,\n ErrorBarLayer,\n LineLayer,\n LogoPlotLayer,\n PairedPointsLayer,\n SinaLayer, StackedAreaLayer,\n StackedBarLayer,\n StatLayer,\n ViolinLayer,\n} from './DiscreteSettingsImpl';\nimport {\n getBarsData,\n getBinnedDotsData,\n getBoxesData,\n getDotsData,\n getErrorBarsData,\n getLinesData,\n getPairedPointsData,\n getSinaData,\n getStackedBarsData,\n getStatsData,\n getViolinsData,\n} from './layers';\nimport { getLogoData } from './layers/logo';\nimport { getStackedAreaData } from './layers/stackedArea';\nimport type { LayerData, StatsData } from './layers/types';\nimport { getFacetStringKey } from './utils/getFacetStringKey';\nimport { arraysAreDifferent } from '../utils/arraysAreDifferent';\n\nfunction getGroupingKeys(data: DataFrame, column: ColumnName, order: DataValue[] | null = null) {\n const groupingColumn = column.value;\n const availableKeys = data.getColumnCategories(groupingColumn);\n return intersection(order ?? availableKeys, availableKeys).map(String);\n}\n\n// all combinations with 1 key from each list\nfunction getKeysCombinations(keysLists: string[][]) {\n if (!keysLists.length) {\n return [];\n }\n let result: string[][] = [[]];\n keysLists.forEach(keys => {\n const nextResult: string[][] = [];\n keys.forEach(key => {\n nextResult.push(...result.map(resultItem => [...resultItem, key]));\n });\n result = nextResult;\n });\n return result;\n}\n\nfunction getGroupingData(\n data: DataFrame,\n grouping: DiscreteSettingsImpl['primaryGrouping' | 'secondaryGrouping']\n): GroupingData {\n if (!grouping) {\n return {\n keys: ['null'],\n value: null,\n label: '',\n valueLabels: { null: '' },\n inheritedAes: null,\n };\n }\n\n const groupingColumnId = grouping.columnName.value;\n const groupingColumnLabelId = grouping.columnName.valueLabels;\n const categories = data.getColumnCategories(groupingColumnId, false);\n const getValueLabel = (category: Category) => {\n return groupingColumnLabelId\n ? String(\n data.getColumnValue(\n groupingColumnLabelId,\n data.getColumnCategoryRowIndex(groupingColumnId, category)\n )\n )\n : category;\n };\n\n const keys = data.getColumnCategories(groupingColumnId, !grouping.allowNullGroup);\n const orderedKeys = grouping.order === undefined ? keys : intersection(grouping.order.map(String), keys);\n\n return {\n keys: orderedKeys,\n value: groupingColumnId,\n label: grouping.columnName.label ?? groupingColumnId,\n valueLabels: categories.reduce((res: Record<string, string>, category: Category) => {\n res[category] = getValueLabel(category);\n return res;\n }, {}),\n inheritedAes: grouping.inheritedAes ?? null,\n };\n}\n\nexport class ChartDiscrete extends AbstractChart {\n settings: DiscreteSettingsImpl;\n chartRenderer = new ChartRenderer();\n\n onTooltipHintSwitch: (v: boolean) => void = () => undefined;\n calculatedData: {\n layersData: LayerData[];\n statsLayersData: StatsData[];\n primaryGrouping: GroupingData;\n secondaryGrouping: GroupingData;\n facetKeyLists: GroupKey[][];\n nonEmptyGroupsByFacets: Record<string, string[]>;\n onlyPositive: boolean;\n } | null = null;\n\n constructor(data: DataFrame, settings: DiscreteSettings, eventHandlers?: DiscreteEventHandlers) {\n super(data, settings);\n\n this.settings = new DiscreteSettingsImpl(settings);\n if (eventHandlers) {\n this.onTooltipHintSwitch = eventHandlers[0];\n }\n }\n\n mount(node: HTMLElement) {\n try {\n this.chartRenderer.init(node);\n this._updateData();\n this._updateChart();\n this.hasError = false;\n this.errorInfo = null;\n } catch (err) {\n this.hasError = true;\n if (err instanceof Error) {\n this.errorInfo = isErrorInfo(err.cause) ? err.cause : getUnknownErrorInfo(err);\n this.chartRenderer.renderError(err.message as string);\n console.error(err);\n }\n }\n }\n\n unmount() {\n this.chartRenderer.clear();\n }\n\n updateSettingsAndData(data: DataFrame, settings: DiscreteSettings) {\n try {\n const previousSettings = this.settings;\n const previousData = this.data;\n this.settings = new DiscreteSettingsImpl(settings);\n this.data = data;\n if (\n this._needUpdateCalculatedDataBySettings(previousSettings, this.settings) ||\n this._needUpdateCalculatedDataByData(previousData, this.data)\n ) {\n this._updateData();\n } else {\n this._updateAesInData();\n }\n this._updateChart();\n this.hasError = false;\n this.errorInfo = null;\n } catch (err) {\n this.hasError = true;\n if (err instanceof Error) {\n this.errorInfo = isErrorInfo(err.cause) ? err.cause : getUnknownErrorInfo(err);\n this.chartRenderer.renderError(err.message as string);\n console.error(err);\n }\n }\n }\n\n updateChartState(_field: string, _value: unknown) {\n console.warn('no chart state for discrete');\n }\n\n export(): string {\n this._updateChart();\n return renderToString(this.chartRenderer.component);\n }\n\n _needUpdateCalculatedDataBySettings(prevSettings: DiscreteSettingsImpl, settings: DiscreteSettingsImpl) {\n return (\n prevSettings.chartSettings.yAxis.scale !== settings.chartSettings.yAxis.scale ||\n (prevSettings.primaryGrouping?.columnName.value ?? '') !==\n (settings.primaryGrouping?.columnName.value ?? '') ||\n (prevSettings.secondaryGrouping?.columnName.value ?? '') !==\n (settings.secondaryGrouping?.columnName.value ?? '') ||\n (prevSettings.primaryGrouping?.allowNullGroup ?? '') !==\n (settings.primaryGrouping?.allowNullGroup ?? '') ||\n (prevSettings.secondaryGrouping?.allowNullGroup ?? '') !==\n (settings.secondaryGrouping?.allowNullGroup ?? '') ||\n arraysAreDifferent(prevSettings.primaryGrouping?.order, settings.primaryGrouping?.order, { ignoreOrder: true }) ||\n arraysAreDifferent(prevSettings.secondaryGrouping?.order, settings.secondaryGrouping?.order, { ignoreOrder: true }) ||\n prevSettings.facetBy.some((el, idx) => el.value !== settings.facetBy[idx]?.value) ||\n prevSettings.layers.length !== settings.layers.length ||\n prevSettings.layers.some((l, idx) => !l.isEqualForCalculation(settings.layers[idx] as typeof l))\n );\n }\n\n _needUpdateCalculatedDataByData(prevData: DataFrame, data: DataFrame) {\n const prevKeys = Object.keys(prevData.data);\n const keys = Object.keys(data.data);\n return (\n prevData.id !== data.id ||\n prevKeys.length !== keys.length ||\n prevKeys.some(key => prevData.data[key].length !== data.data[key]?.length)\n );\n }\n\n _updateData() {\n const { chartSettings, y, keyColumn, facetBy, layers, facetSettings } = this.settings;\n const { yAxis } = chartSettings;\n\n const onlyPositive = this.data.getColumn(y.value).every(v => {\n return v === null || !(Number(v) < 0);\n });\n // console.info('only positive Y:', onlyPositive);\n\n const primaryGrouping = getGroupingData(this.data, this.settings.primaryGrouping);\n const secondaryGrouping = getGroupingData(this.data, this.settings.secondaryGrouping);\n const facetGroupingValues = facetBy.map(column => column.value);\n\n if (!this.settings.primaryGrouping?.unlimitedGroupsCount && primaryGrouping.keys.length > MAX_GROUPS_COUNT) {\n const errorInfo: ErrorInfoPrimaryGroups = {\n type: 'tooManyPrimaryGroups',\n info: { count: primaryGrouping.keys.length, maxCount: MAX_GROUPS_COUNT }\n };\n throw Error(errorInfo.type, { cause: errorInfo });\n }\n if (!this.settings.secondaryGrouping?.unlimitedGroupsCount && secondaryGrouping.keys.length > MAX_GROUPS_COUNT) {\n const errorInfo: ErrorInfoSecondaryGroups = {\n type: 'tooManySecondaryGroups',\n info: { count: secondaryGrouping.keys.length, maxCount: MAX_GROUPS_COUNT }\n };\n throw Error(errorInfo.type, { cause: errorInfo });\n }\n\n // if facet created by more than 1 data column facet key contains all of them, and all keys are used in data grouping;\n // after data preparing we need only complex keys from concatenated strings\n const facetKeyLists: (GroupKey)[][] = facetBy.length\n ? getKeysCombinations(\n facetBy.map(column => getGroupingKeys(this.data, column, facetSettings?.order?.[column.value]))\n )\n : [[NO_GROUPED]];\n\n if (facetKeyLists.length > MAX_FACETS_COUNT) {\n const errorInfo: ErrorInfoFacets = {\n type: 'tooManyFacets',\n info: { count: facetKeyLists.length, maxCount: MAX_FACETS_COUNT }\n };\n throw Error(errorInfo.type, { cause: errorInfo });\n }\n this.data.setGrouping([...facetGroupingValues, primaryGrouping.value, secondaryGrouping.value]);\n const groupingKeys = {\n facet: facetKeyLists,\n primary: (primaryGrouping.value !== null ? primaryGrouping.keys : [NO_GROUPED]) as GroupKey[],\n secondary: (secondaryGrouping.value !== null ? secondaryGrouping.keys : [NO_GROUPED]) as GroupKey[],\n };\n\n const nonEmptyGroupsByFacets = groupingKeys.facet.reduce((res: Record<string, string[]>, facetKey) => {\n res[getFacetStringKey(facetKey)] = groupingKeys.primary.filter(\n primaryKey => this.data.getRowsByGrouping([...facetKey, primaryKey]).length > 0\n ).map(String);\n return res;\n }, {});\n\n const layersData = layers\n .filter(layer => !(layer instanceof StatLayer))\n .map(layer => {\n if (layer instanceof BoxLayer) {\n return getBoxesData(layer, groupingKeys, this.data, y, keyColumn, yAxis);\n }\n if (layer instanceof ViolinLayer) {\n return getViolinsData(layer, groupingKeys, this.data, y, yAxis);\n }\n if (layer instanceof DotLayer) {\n return getDotsData(layer, groupingKeys, this.data, y, yAxis, keyColumn);\n }\n if (layer instanceof LineLayer) {\n return getLinesData(layer, groupingKeys, this.data, y, yAxis);\n }\n if (layer instanceof ErrorBarLayer) {\n return getErrorBarsData(layer, groupingKeys, this.data, y, yAxis);\n }\n if (layer instanceof BarLayer) {\n return getBarsData(layer, groupingKeys, this.data, y, yAxis);\n }\n if (layer instanceof StackedBarLayer) {\n return getStackedBarsData(layer, groupingKeys, this.data, y);\n }\n if (layer instanceof StackedAreaLayer) {\n return getStackedAreaData(layer, groupingKeys, this.data, y);\n }\n if (layer instanceof BinnedDotsLayer) {\n return getBinnedDotsData(layer, groupingKeys, this.data, y, yAxis);\n }\n if (layer instanceof PairedPointsLayer) {\n return getPairedPointsData(layer, groupingKeys, this.data, y, yAxis);\n }\n if (layer instanceof SinaLayer) {\n return getSinaData(layer, groupingKeys, this.data, y, yAxis);\n }\n if (layer instanceof LogoPlotLayer) {\n return getLogoData(layer, groupingKeys, this.data, y);\n }\n throw new Error('Unknown layer type');\n });\n const statsLayersData = layers\n .filter(layer => layer instanceof StatLayer)\n .map(layer => {\n if (primaryGrouping.value === null) {\n throw new Error('Cannot calculate p-value without data grouping');\n }\n return getStatsData(layer as StatLayer, groupingKeys.facet, groupingKeys.primary, y, this.data);\n });\n this.calculatedData = {\n layersData,\n statsLayersData,\n primaryGrouping,\n secondaryGrouping,\n facetKeyLists,\n nonEmptyGroupsByFacets,\n onlyPositive,\n };\n }\n\n _updateAesInData() {\n if (this.calculatedData === null) {\n return;\n }\n const { layers, facetBy, primaryGrouping, secondaryGrouping, facetSettings } = this.settings;\n\n // updating aes in layers (except for stat layers with p-value), layers data is not recalculating\n const noStatLayers = layers.filter(layer => !(layer instanceof StatLayer));\n for (let i = 0; i < noStatLayers.length; i++) {\n const layer = noStatLayers[i];\n if ('aes' in layer) {\n this.calculatedData.layersData[i].aes = layer.aes;\n }\n }\n\n // updating grouping to update linked aes\n this.calculatedData.primaryGrouping = getGroupingData(this.data, primaryGrouping);\n this.calculatedData.secondaryGrouping = getGroupingData(this.data, secondaryGrouping);\n\n // updating for possibly changed facetSettings.order\n this.calculatedData.facetKeyLists = facetBy.length\n ? getKeysCombinations(\n facetBy.map(column => getGroupingKeys(this.data, column, facetSettings?.order?.[column.value]))\n )\n : [[NO_GROUPED]];\n }\n\n _updateChart() {\n if (!this.calculatedData) {\n return;\n }\n const { id, chartSettings, keyColumn, facetSettings } = this.settings;\n\n const facetKeys = this.calculatedData.facetKeyLists.map(getFacetStringKey);\n const facetLabels = this.calculatedData.facetKeyLists.map(v => v.map(v => v === NO_GROUPED ? 'null' : v)) as string[][];\n this.chartRenderer.render(\n this.data,\n id,\n chartSettings,\n this.calculatedData.primaryGrouping,\n this.calculatedData.secondaryGrouping,\n facetSettings,\n facetKeys,\n facetLabels,\n this.calculatedData.layersData,\n this.calculatedData.statsLayersData,\n keyColumn,\n this.calculatedData.nonEmptyGroupsByFacets,\n this.calculatedData.onlyPositive,\n this.onTooltipHintSwitch\n );\n }\n}\n"],"names":["getGroupingKeys","data","column","order","groupingColumn","availableKeys","intersection","getKeysCombinations","keysLists","result","keys","nextResult","key","resultItem","getGroupingData","grouping","groupingColumnId","groupingColumnLabelId","categories","getValueLabel","category","res","ChartDiscrete","AbstractChart","settings","eventHandlers","__publicField","ChartRenderer","DiscreteSettingsImpl","node","err","isErrorInfo","getUnknownErrorInfo","previousSettings","previousData","_field","_value","renderToString","prevSettings","_a","_b","_c","_d","_e","_f","_g","_h","arraysAreDifferent","_i","_j","_k","_l","el","idx","l","prevData","prevKeys","chartSettings","y","keyColumn","facetBy","layers","facetSettings","yAxis","onlyPositive","v","primaryGrouping","secondaryGrouping","facetGroupingValues","MAX_GROUPS_COUNT","errorInfo","facetKeyLists","NO_GROUPED","MAX_FACETS_COUNT","groupingKeys","nonEmptyGroupsByFacets","facetKey","getFacetStringKey","primaryKey","layersData","layer","StatLayer","BoxLayer","getBoxesData","ViolinLayer","getViolinsData","DotLayer","getDotsData","LineLayer","getLinesData","ErrorBarLayer","getErrorBarsData","BarLayer","getBarsData","StackedBarLayer","getStackedBarsData","StackedAreaLayer","getStackedAreaData","BinnedDotsLayer","getBinnedDotsData","PairedPointsLayer","getPairedPointsData","SinaLayer","getSinaData","LogoPlotLayer","getLogoData","statsLayersData","getStatsData","noStatLayers","i","id","facetKeys","facetLabels"],"mappings":"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"}
@@ -1,41 +1,44 @@
1
1
  import { exhaustive as d } from "../../utils/index.js";
2
2
  import { getFacetStringKey as x } from "../utils/getFacetStringKey.js";
3
- import S from "../../node_modules/.pnpm/d3-array@3.2.4/node_modules/d3-array/src/mean.js";
4
- import { quantileSorted as b } from "../../node_modules/.pnpm/d3-array@3.2.4/node_modules/d3-array/src/quantile.js";
5
- import M from "../../node_modules/.pnpm/d3-array@3.2.4/node_modules/d3-array/src/min.js";
6
- import w from "../../node_modules/.pnpm/d3-array@3.2.4/node_modules/d3-array/src/max.js";
7
- function B(t, n, o) {
3
+ import S from "../../node_modules/.pnpm/d3-array@3.2.4/node_modules/d3-array/src/sum.js";
4
+ import b from "../../node_modules/.pnpm/d3-array@3.2.4/node_modules/d3-array/src/mean.js";
5
+ import { quantileSorted as M } from "../../node_modules/.pnpm/d3-array@3.2.4/node_modules/d3-array/src/quantile.js";
6
+ import w from "../../node_modules/.pnpm/d3-array@3.2.4/node_modules/d3-array/src/min.js";
7
+ import B from "../../node_modules/.pnpm/d3-array@3.2.4/node_modules/d3-array/src/max.js";
8
+ function E(t, o, n) {
8
9
  if (t.length === 0)
9
10
  throw Error("Unable to create bar on empty data");
10
- const i = (r) => n === "log" ? Math.log10(r) : r, c = (r) => n === "log" ? Math.pow(10, r) : r;
11
- switch (o) {
11
+ const i = (r) => o === "log" ? Math.log10(r) : r, c = (r) => o === "log" ? Math.pow(10, r) : r;
12
+ switch (n) {
12
13
  case "max":
13
- return w(t) ?? t[0];
14
+ return B(t) ?? t[0];
14
15
  case "min":
15
- return M(t) ?? t[0];
16
+ return w(t) ?? t[0];
16
17
  case "median": {
17
18
  const r = t.map(i).sort((a, e) => a - e);
18
- return c(b(r, 0.5));
19
+ return c(M(r, 0.5));
19
20
  }
20
21
  case "mean":
21
- return S(t) ?? t[0];
22
+ return b(t) ?? t[0];
23
+ case "sum":
24
+ return S(t);
22
25
  default:
23
- d(o, `Unknown bar height function ${o}`);
26
+ d(n, `Unknown bar height function ${n}`);
24
27
  }
25
28
  }
26
- function C(t, n, o, i, c) {
29
+ function V(t, o, n, i, c) {
27
30
  let r = -1 / 0, a = 1 / 0;
28
31
  return {
29
32
  type: "bar",
30
- geoms: n.facet.reduce((e, f) => {
31
- const h = x(f);
32
- return e[h] = [], n.primary.forEach((u) => {
33
- n.secondary.forEach((p) => {
34
- const l = o.getRowsByGrouping([...f, u, p]);
35
- if (!l.length)
33
+ geoms: o.facet.reduce((e, f) => {
34
+ const s = x(f);
35
+ return e[s] = [], o.primary.forEach((u) => {
36
+ o.secondary.forEach((p) => {
37
+ const h = n.getRowsByGrouping([...f, u, p]);
38
+ if (!h.length)
36
39
  return;
37
- const s = Array.from(l).map((g) => o.getColumnValue(i.value, g)), m = B(s, c.scale, t.height);
38
- r = Math.max(r, m, 0), a = Math.min(a, m, 0), e[h].push({
40
+ const g = Array.from(h).map((l) => n.getColumnValue(i.value, l)), m = E(g, c.scale, t.height);
41
+ r = Math.max(r, m, 0), a = Math.min(a, m, 0), e[s].push({
39
42
  key: `bar_${String(u)}_${String(p)}`,
40
43
  value: m,
41
44
  primaryGrouping: u,
@@ -50,6 +53,6 @@ function C(t, n, o, i, c) {
50
53
  };
51
54
  }
52
55
  export {
53
- C as getBarsData
56
+ V as getBarsData
54
57
  };
55
58
  //# sourceMappingURL=bar.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"bar.js","sources":["../../../src/discrete/layers/bar.ts"],"sourcesContent":["import { max as d3Max, min as d3Min, mean, quantileSorted } from 'd3-array';\nimport type { DataFrame, GroupKey } from '../../DataFrame';\nimport type { ColumnName } from '../../types';\nimport { exhaustive } from '../../utils';\nimport type { BarLayer, DiscreteSettingsImpl } from '../DiscreteSettingsImpl';\nimport { getFacetStringKey } from '../utils/getFacetStringKey';\nimport type { BarsData } from './types';\n\nfunction calculateBarUpperBound(\n values: number[],\n scale: 'linear' | 'log',\n heightFunc: 'min' | 'max' | 'median' | 'mean'\n):number {\n if (values.length === 0) {\n throw Error('Unable to create bar on empty data');\n }\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 switch (heightFunc) {\n case 'max':\n return d3Max(values) ?? values[0];\n case 'min':\n return d3Min(values) ?? values[0];\n case 'median': {\n const valuesSortedConverted = values\n .map(convertToScale)\n .sort((a, b) => a - b);\n return convertFromScale(quantileSorted(valuesSortedConverted, 0.5) as number);\n }\n case 'mean': {\n return mean(values) ?? values[0];\n }\n default: exhaustive(heightFunc, `Unknown bar height function ${heightFunc}`);\n }\n}\n\nexport type Bar = {\n key: string;\n value: number;\n primaryGrouping: string;\n secondaryGrouping: string;\n boundsY: {\n min: number;\n max: number;\n };\n};\n\nexport function getBarsData(\n layer: BarLayer,\n groupingKeys: {\n facet: GroupKey[][],\n primary: GroupKey[],\n secondary: GroupKey[]\n },\n data: DataFrame,\n y: ColumnName,\n yAxis: DiscreteSettingsImpl['chartSettings']['yAxis']\n): BarsData {\n let maxY = -Infinity;\n let minY = Infinity;\n\n return {\n type: 'bar',\n geoms: groupingKeys.facet.reduce((res: Record<string, Bar[]>, facetKey) => {\n const strFacetKey = getFacetStringKey(facetKey);\n res[strFacetKey] = [];\n groupingKeys.primary.forEach(primaryKey => {\n groupingKeys.secondary.forEach(secondaryKey => {\n const idx = data.getRowsByGrouping([...facetKey, primaryKey, secondaryKey]);\n if (!idx.length) {\n return;\n }\n const values = Array.from(idx).map(i => data.getColumnValue(y.value, i) as number);\n const upperBoundValue = calculateBarUpperBound(values, yAxis.scale, layer.height);\n maxY = Math.max(maxY, upperBoundValue, 0);\n minY = Math.min(minY, upperBoundValue, 0);\n res[strFacetKey].push({\n key: `bar_${String(primaryKey)}_${String(secondaryKey)}`,\n value: upperBoundValue,\n primaryGrouping: primaryKey,\n secondaryGrouping: secondaryKey,\n boundsY: {min: Math.min(0, upperBoundValue), max: Math.max(0, upperBoundValue)},\n } as Bar);\n });\n });\n return res;\n }, {}),\n meta: {minY, maxY},\n aes: layer.aes,\n };\n}\n"],"names":["calculateBarUpperBound","values","scale","heightFunc","convertToScale","v","convertFromScale","d3Max","d3Min","valuesSortedConverted","b","quantileSorted","mean","exhaustive","getBarsData","layer","groupingKeys","data","y","yAxis","maxY","minY","res","facetKey","strFacetKey","getFacetStringKey","primaryKey","secondaryKey","idx","i","upperBoundValue"],"mappings":";;;;;;AAQA,SAASA,EACLC,GACAC,GACAC,GACK;AACL,MAAIF,EAAO,WAAW;AAClB,UAAM,MAAM,oCAAoC;AAEpD,QAAMG,IAAiB,CAACC,MAAeH,MAAU,QAAQ,KAAK,MAAMG,CAAC,IAAIA,GACnEC,IAAmB,CAACD,MAAeH,MAAU,QAAQ,KAAK,IAAI,IAAIG,CAAC,IAAIA;AAE7E,UAAQF,GAAA;AAAA,IACJ,KAAK;AACD,aAAOI,EAAMN,CAAM,KAAKA,EAAO,CAAC;AAAA,IACpC,KAAK;AACD,aAAOO,EAAMP,CAAM,KAAKA,EAAO,CAAC;AAAA,IACpC,KAAK,UAAU;AACX,YAAMQ,IAAwBR,EACzB,IAAIG,CAAc,EAClB,KAAK,CAAC,GAAGM,MAAM,IAAIA,CAAC;AACzB,aAAOJ,EAAiBK,EAAeF,GAAuB,GAAG,CAAW;AAAA,IAChF;AAAA,IACA,KAAK;AACD,aAAOG,EAAKX,CAAM,KAAKA,EAAO,CAAC;AAAA,IAEnC;AAAS,MAAAY,EAAWV,GAAY,+BAA+BA,CAAU,EAAE;AAAA,EAAA;AAEnF;AAaO,SAASW,EACZC,GACAC,GAKAC,GACAC,GACAC,GACQ;AACR,MAAIC,IAAO,QACPC,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,IAAMX,EAAK,kBAAkB,CAAC,GAAGM,GAAUG,GAAYC,CAAY,CAAC;AAC1E,cAAI,CAACC,EAAI;AACL;AAEJ,gBAAM3B,IAAS,MAAM,KAAK2B,CAAG,EAAE,IAAI,CAAAC,MAAKZ,EAAK,eAAeC,EAAE,OAAOW,CAAC,CAAW,GAC3EC,IAAkB9B,EAAuBC,GAAQkB,EAAM,OAAOJ,EAAM,MAAM;AAChF,UAAAK,IAAO,KAAK,IAAIA,GAAMU,GAAiB,CAAC,GACxCT,IAAO,KAAK,IAAIA,GAAMS,GAAiB,CAAC,GACxCR,EAAIE,CAAW,EAAE,KAAK;AAAA,YAClB,KAAK,OAAO,OAAOE,CAAU,CAAC,IAAI,OAAOC,CAAY,CAAC;AAAA,YACtD,OAAOG;AAAA,YACP,iBAAiBJ;AAAA,YACjB,mBAAmBC;AAAA,YACnB,SAAS,EAAC,KAAK,KAAK,IAAI,GAAGG,CAAe,GAAG,KAAK,KAAK,IAAI,GAAGA,CAAe,EAAA;AAAA,UAAC,CAC1E;AAAA,QACZ,CAAC;AAAA,MACL,CAAC,GACMR;AAAA,IACX,GAAG,CAAA,CAAE;AAAA,IACL,MAAM,EAAC,MAAAD,GAAM,MAAAD,EAAA;AAAA,IACb,KAAKL,EAAM;AAAA,EAAA;AAEnB;"}
1
+ {"version":3,"file":"bar.js","sources":["../../../src/discrete/layers/bar.ts"],"sourcesContent":["import { max as d3Max, min as d3Min, mean, quantileSorted, sum } from 'd3-array';\nimport type { DataFrame, GroupKey } from '../../DataFrame';\nimport type { AggregationMethod, ColumnName } from '../../types';\nimport { exhaustive } from '../../utils';\nimport type { BarLayer, DiscreteSettingsImpl } from '../DiscreteSettingsImpl';\nimport { getFacetStringKey } from '../utils/getFacetStringKey';\nimport type { BarsData } from './types';\n\nfunction calculateBarUpperBound(\n values: number[],\n scale: 'linear' | 'log',\n heightFunc: AggregationMethod\n):number {\n if (values.length === 0) {\n throw Error('Unable to create bar on empty data');\n }\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 switch (heightFunc) {\n case 'max':\n return d3Max(values) ?? values[0];\n case 'min':\n return d3Min(values) ?? values[0];\n case 'median': {\n const valuesSortedConverted = values\n .map(convertToScale)\n .sort((a, b) => a - b);\n return convertFromScale(quantileSorted(valuesSortedConverted, 0.5) as number);\n }\n case 'mean': {\n return mean(values) ?? values[0];\n }\n case 'sum': {\n return sum(values) as number;\n }\n default: exhaustive(heightFunc, `Unknown bar height function ${heightFunc}`);\n }\n}\n\nexport type Bar = {\n key: string;\n value: number;\n primaryGrouping: string;\n secondaryGrouping: string;\n boundsY: {\n min: number;\n max: number;\n };\n};\n\nexport function getBarsData(\n layer: BarLayer,\n groupingKeys: {\n facet: GroupKey[][],\n primary: GroupKey[],\n secondary: GroupKey[]\n },\n data: DataFrame,\n y: ColumnName,\n yAxis: DiscreteSettingsImpl['chartSettings']['yAxis']\n): BarsData {\n let maxY = -Infinity;\n let minY = Infinity;\n\n return {\n type: 'bar',\n geoms: groupingKeys.facet.reduce((res: Record<string, Bar[]>, facetKey) => {\n const strFacetKey = getFacetStringKey(facetKey);\n res[strFacetKey] = [];\n groupingKeys.primary.forEach(primaryKey => {\n groupingKeys.secondary.forEach(secondaryKey => {\n const idx = data.getRowsByGrouping([...facetKey, primaryKey, secondaryKey]);\n if (!idx.length) {\n return;\n }\n const values = Array.from(idx).map(i => data.getColumnValue(y.value, i) as number);\n const upperBoundValue = calculateBarUpperBound(values, yAxis.scale, layer.height);\n maxY = Math.max(maxY, upperBoundValue, 0);\n minY = Math.min(minY, upperBoundValue, 0);\n res[strFacetKey].push({\n key: `bar_${String(primaryKey)}_${String(secondaryKey)}`,\n value: upperBoundValue,\n primaryGrouping: primaryKey,\n secondaryGrouping: secondaryKey,\n boundsY: {min: Math.min(0, upperBoundValue), max: Math.max(0, upperBoundValue)},\n } as Bar);\n });\n });\n return res;\n }, {}),\n meta: {minY, maxY},\n aes: layer.aes,\n };\n}\n"],"names":["calculateBarUpperBound","values","scale","heightFunc","convertToScale","v","convertFromScale","d3Max","d3Min","valuesSortedConverted","b","quantileSorted","mean","sum","exhaustive","getBarsData","layer","groupingKeys","data","y","yAxis","maxY","minY","res","facetKey","strFacetKey","getFacetStringKey","primaryKey","secondaryKey","idx","i","upperBoundValue"],"mappings":";;;;;;;AAQA,SAASA,EACLC,GACAC,GACAC,GACK;AACL,MAAIF,EAAO,WAAW;AAClB,UAAM,MAAM,oCAAoC;AAEpD,QAAMG,IAAiB,CAACC,MAAeH,MAAU,QAAQ,KAAK,MAAMG,CAAC,IAAIA,GACnEC,IAAmB,CAACD,MAAeH,MAAU,QAAQ,KAAK,IAAI,IAAIG,CAAC,IAAIA;AAE7E,UAAQF,GAAA;AAAA,IACJ,KAAK;AACD,aAAOI,EAAMN,CAAM,KAAKA,EAAO,CAAC;AAAA,IACpC,KAAK;AACD,aAAOO,EAAMP,CAAM,KAAKA,EAAO,CAAC;AAAA,IACpC,KAAK,UAAU;AACX,YAAMQ,IAAwBR,EACzB,IAAIG,CAAc,EAClB,KAAK,CAAC,GAAGM,MAAM,IAAIA,CAAC;AACzB,aAAOJ,EAAiBK,EAAeF,GAAuB,GAAG,CAAW;AAAA,IAChF;AAAA,IACA,KAAK;AACD,aAAOG,EAAKX,CAAM,KAAKA,EAAO,CAAC;AAAA,IAEnC,KAAK;AACD,aAAOY,EAAIZ,CAAM;AAAA,IAErB;AAAS,MAAAa,EAAWX,GAAY,+BAA+BA,CAAU,EAAE;AAAA,EAAA;AAEnF;AAaO,SAASY,EACZC,GACAC,GAKAC,GACAC,GACAC,GACQ;AACR,MAAIC,IAAO,QACPC,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,IAAMX,EAAK,kBAAkB,CAAC,GAAGM,GAAUG,GAAYC,CAAY,CAAC;AAC1E,cAAI,CAACC,EAAI;AACL;AAEJ,gBAAM5B,IAAS,MAAM,KAAK4B,CAAG,EAAE,IAAI,CAAAC,MAAKZ,EAAK,eAAeC,EAAE,OAAOW,CAAC,CAAW,GAC3EC,IAAkB/B,EAAuBC,GAAQmB,EAAM,OAAOJ,EAAM,MAAM;AAChF,UAAAK,IAAO,KAAK,IAAIA,GAAMU,GAAiB,CAAC,GACxCT,IAAO,KAAK,IAAIA,GAAMS,GAAiB,CAAC,GACxCR,EAAIE,CAAW,EAAE,KAAK;AAAA,YAClB,KAAK,OAAO,OAAOE,CAAU,CAAC,IAAI,OAAOC,CAAY,CAAC;AAAA,YACtD,OAAOG;AAAA,YACP,iBAAiBJ;AAAA,YACjB,mBAAmBC;AAAA,YACnB,SAAS,EAAC,KAAK,KAAK,IAAI,GAAGG,CAAe,GAAG,KAAK,KAAK,IAAI,GAAGA,CAAe,EAAA;AAAA,UAAC,CAC1E;AAAA,QACZ,CAAC;AAAA,MACL,CAAC,GACMR;AAAA,IACX,GAAG,CAAA,CAAE;AAAA,IACL,MAAM,EAAC,MAAAD,GAAM,MAAAD,EAAA;AAAA,IACb,KAAKL,EAAM;AAAA,EAAA;AAEnB;"}
@@ -1,67 +1,76 @@
1
- import { getFacetStringKey as b } from "../utils/getFacetStringKey.js";
2
- import { exhaustive as w } from "../../utils/index.js";
3
- import k from "../../node_modules/.pnpm/d3-array@3.2.4/node_modules/d3-array/src/quantile.js";
4
- import m from "../../node_modules/.pnpm/d3-array@3.2.4/node_modules/d3-array/src/mean.js";
5
- function q(t) {
6
- const n = m(t);
7
- return m(t.map((a) => Math.pow(a - n, 2)));
1
+ import { getFacetStringKey as q } from "../utils/getFacetStringKey.js";
2
+ import { exhaustive as I } from "../../utils/index.js";
3
+ import v from "../../node_modules/.pnpm/d3-array@3.2.4/node_modules/d3-array/src/quantile.js";
4
+ import l from "../../node_modules/.pnpm/d3-array@3.2.4/node_modules/d3-array/src/mean.js";
5
+ import D from "../../node_modules/.pnpm/d3-array@3.2.4/node_modules/d3-array/src/min.js";
6
+ import F from "../../node_modules/.pnpm/d3-array@3.2.4/node_modules/d3-array/src/max.js";
7
+ import G from "../../node_modules/.pnpm/d3-array@3.2.4/node_modules/d3-array/src/sum.js";
8
+ function V(n) {
9
+ const t = l(n);
10
+ return l(n.map((e) => Math.pow(e - t, 2)));
8
11
  }
9
- function s(t) {
10
- return Math.sqrt(q(t));
12
+ function s(n) {
13
+ return Math.sqrt(V(n));
11
14
  }
12
- function x(t) {
13
- return s(t) / Math.sqrt(t.length);
15
+ function Y(n) {
16
+ return s(n) / Math.sqrt(n.length);
14
17
  }
15
- function D(t) {
16
- return 1.96 * s(t);
18
+ function g(n) {
19
+ return 1.96 * s(n);
17
20
  }
18
- function F(t, n) {
19
- if (n === "median")
20
- return k(t, 0.5);
21
- if (n === "mean")
22
- return m(t);
23
- w(n, "Unknown points calculation");
21
+ function B(n, t) {
22
+ if (t === "median")
23
+ return v(n, 0.5);
24
+ if (t === "mean")
25
+ return l(n);
26
+ if (t === "min")
27
+ return D(n);
28
+ if (t === "max")
29
+ return F(n);
30
+ if (t === "sum")
31
+ return G(n);
32
+ I(t, "Unknown points calculation");
24
33
  }
25
- function G(t, n) {
26
- if (n === "sd")
27
- return s(t);
28
- if (n === "se")
29
- return x(t);
30
- if (n === "ci")
31
- return D(t);
32
- w(n, "Unknown error interval calculation");
34
+ function C(n, t) {
35
+ if (t === "sd")
36
+ return s(n);
37
+ if (t === "se")
38
+ return Y(n);
39
+ if (t === "ci")
40
+ return g(n);
41
+ I(t, "Unknown error interval calculation");
33
42
  }
34
- function U(t, n, a, E, g) {
35
- let i = 1 / 0, c = -1 / 0;
43
+ function H(n, t, e, b, p) {
44
+ let c = 1 / 0, a = -1 / 0;
36
45
  return {
37
46
  type: "errorbar",
38
- geoms: n.facet.reduce((u, p) => {
39
- const h = b(p);
40
- u[h] = [];
41
- const I = (r) => g.scale === "log" ? Math.log10(r) : r, d = (r) => g.scale === "log" ? Math.pow(10, r) : r;
42
- return n.primary.forEach((r) => {
43
- n.secondary.forEach((f) => {
44
- const S = a.getColumnByGrouping([...p, r, f], E.value);
45
- if (!S.length)
47
+ geoms: t.facet.reduce((m, S) => {
48
+ const x = q(S);
49
+ m[x] = [];
50
+ const k = (r) => p.scale === "log" ? Math.log10(r) : r, h = (r) => p.scale === "log" ? Math.pow(10, r) : r;
51
+ return t.primary.forEach((r) => {
52
+ t.secondary.forEach((u) => {
53
+ const d = e.getColumnByGrouping([...S, r, u], b.value);
54
+ if (!d.length)
46
55
  return;
47
- const M = S.map(I), l = d(F(M, t.pointsValues)), v = d(G(M, t.interval)), o = l - v, e = l + v;
48
- o < i && (i = o), e > c && (c = e), u[h].push({
49
- key: `errorbar_${String(r)}_${String(f)}`,
56
+ const w = d.map(k), f = h(B(w, n.pointsValues)), E = h(C(w, n.interval)), o = f - E, i = f + E;
57
+ o < c && (c = o), i > a && (a = i), m[x].push({
58
+ key: `errorbar_${String(r)}_${String(u)}`,
50
59
  primaryGrouping: String(r),
51
- secondaryGrouping: String(f),
52
- value: l,
60
+ secondaryGrouping: String(u),
61
+ value: f,
53
62
  min: o,
54
- max: e,
55
- boundsY: { min: o, max: e }
63
+ max: i,
64
+ boundsY: { min: o, max: i }
56
65
  });
57
66
  });
58
- }), u;
67
+ }), m;
59
68
  }, {}),
60
- meta: { minY: i, maxY: c },
61
- aes: t.aes
69
+ meta: { minY: c, maxY: a },
70
+ aes: n.aes
62
71
  };
63
72
  }
64
73
  export {
65
- U as getErrorBarsData
74
+ H as getErrorBarsData
66
75
  };
67
76
  //# sourceMappingURL=errorbars.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"errorbars.js","sources":["../../../src/discrete/layers/errorbars.ts"],"sourcesContent":["import type {GroupKey} from '../../DataFrame';\nimport type {DataFrame} from '../../DataFrame';\nimport type {ErrorBarLayer} from '../DiscreteSettingsImpl';\nimport type {DiscreteSettingsImpl} from '../DiscreteSettingsImpl';\nimport type {ErrorBarsData} from './types';\nimport {getFacetStringKey} from '../utils/getFacetStringKey';\nimport type {SummaryErrorValue, SummaryGroupValue} from '../../types';\nimport {exhaustive} from '../../utils';\nimport {mean, quantile} from 'd3-array';\n\nexport interface ErrorBar {\n min: number;\n max: number;\n value: number;\n key: string;\n primaryGrouping: string;\n secondaryGrouping: string;\n boundsY: {\n min: number;\n max: number;\n };\n}\n\nfunction getVariance(arr: number[]) {\n const vMean = mean(arr) as number;\n return mean(arr.map(v => Math.pow(v - vMean, 2))) as number;\n}\nfunction getStandardDeviation(arr: number[]) {\n return Math.sqrt(getVariance(arr));\n}\nfunction getStandardError(arr: number[]) {\n return getStandardDeviation(arr) / Math.sqrt(arr.length);\n}\nfunction getConfidentInterval95(arr: number[]) {\n return 1.96 * getStandardDeviation(arr);\n}\n\nfunction calculateDot(values: number[], value: SummaryGroupValue): number {\n if (value === 'median') {\n return quantile(values, 0.5) as number;\n }\n if (value === 'mean') {\n return mean(values) as number;\n }\n exhaustive(value, 'Unknown points calculation');\n}\nfunction calculateInterval(values: number[], interval: SummaryErrorValue): number {\n if (interval === 'sd') {\n return getStandardDeviation(values);\n }\n if (interval === 'se') {\n return getStandardError(values);\n }\n if (interval === 'ci') {\n return getConfidentInterval95(values);\n }\n exhaustive(interval, 'Unknown error interval calculation');\n}\n\nexport function getErrorBarsData(\n layer: ErrorBarLayer,\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): ErrorBarsData {\n let minY = Infinity;\n let maxY = -Infinity;\n\n return {\n type: 'errorbar',\n geoms: groupingKeys.facet.reduce((res: Record<string, ErrorBar[]>, facetKey) => {\n const strFacetKey = getFacetStringKey(facetKey);\n res[strFacetKey] = [];\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 groupingKeys.secondary.forEach(secondaryKey => {\n const values = data.getColumnByGrouping([...facetKey, primaryKey, secondaryKey], y.value);\n if (!values.length) {\n return;\n }\n const convertedValues = values.map(convertToScale);\n const value = convertFromScale(calculateDot(convertedValues, layer.pointsValues));\n const interval = convertFromScale(calculateInterval(convertedValues, layer.interval));\n const min = value - interval;\n const max = value + interval;\n\n if (min < minY) {\n minY = min;\n }\n if (max > maxY) {\n maxY = max;\n }\n res[strFacetKey].push({\n key: `errorbar_${String(primaryKey)}_${String(secondaryKey)}`,\n primaryGrouping: String(primaryKey),\n secondaryGrouping: String(secondaryKey),\n value,\n min,\n max,\n boundsY: {min, max},\n });\n });\n });\n return res;\n }, {}),\n meta: {minY, maxY},\n aes: layer.aes\n };\n}\n"],"names":["getVariance","arr","vMean","mean","v","getStandardDeviation","getStandardError","getConfidentInterval95","calculateDot","values","value","quantile","exhaustive","calculateInterval","interval","getErrorBarsData","layer","groupingKeys","data","y","yAxis","minY","maxY","res","facetKey","strFacetKey","getFacetStringKey","convertToScale","convertFromScale","primaryKey","secondaryKey","convertedValues","min","max"],"mappings":";;;;AAuBA,SAASA,EAAYC,GAAe;AAChC,QAAMC,IAAQC,EAAKF,CAAG;AACtB,SAAOE,EAAKF,EAAI,IAAI,CAAAG,MAAK,KAAK,IAAIA,IAAIF,GAAO,CAAC,CAAC,CAAC;AACpD;AACA,SAASG,EAAqBJ,GAAe;AACzC,SAAO,KAAK,KAAKD,EAAYC,CAAG,CAAC;AACrC;AACA,SAASK,EAAiBL,GAAe;AACrC,SAAOI,EAAqBJ,CAAG,IAAI,KAAK,KAAKA,EAAI,MAAM;AAC3D;AACA,SAASM,EAAuBN,GAAe;AAC3C,SAAO,OAAOI,EAAqBJ,CAAG;AAC1C;AAEA,SAASO,EAAaC,GAAkBC,GAAkC;AACtE,MAAIA,MAAU;AACV,WAAOC,EAASF,GAAQ,GAAG;AAE/B,MAAIC,MAAU;AACV,WAAOP,EAAKM,CAAM;AAEtB,EAAAG,EAAWF,GAAO,4BAA4B;AAClD;AACA,SAASG,EAAkBJ,GAAkBK,GAAqC;AAC9E,MAAIA,MAAa;AACb,WAAOT,EAAqBI,CAAM;AAEtC,MAAIK,MAAa;AACb,WAAOR,EAAiBG,CAAM;AAElC,MAAIK,MAAa;AACb,WAAOP,EAAuBE,CAAM;AAExC,EAAAG,EAAWE,GAAU,oCAAoC;AAC7D;AAEO,SAASC,EACZC,GACAC,GAKAC,GACAC,GACAC,GACa;AACb,MAAIC,IAAO,OACPC,IAAO;AAEX,SAAO;AAAA,IACH,MAAM;AAAA,IACN,OAAOL,EAAa,MAAM,OAAO,CAACM,GAAiCC,MAAa;AAC5E,YAAMC,IAAcC,EAAkBF,CAAQ;AAC9C,MAAAD,EAAIE,CAAW,IAAI,CAAA;AACnB,YAAME,IAAiB,CAACvB,MAAegB,EAAM,UAAU,QAAQ,KAAK,MAAMhB,CAAC,IAAIA,GACzEwB,IAAmB,CAACxB,MAAegB,EAAM,UAAU,QAAQ,KAAK,IAAI,IAAIhB,CAAC,IAAIA;AAEnF,aAAAa,EAAa,QAAQ,QAAQ,CAAAY,MAAc;AACvC,QAAAZ,EAAa,UAAU,QAAQ,CAAAa,MAAgB;AAC3C,gBAAMrB,IAASS,EAAK,oBAAoB,CAAC,GAAGM,GAAUK,GAAYC,CAAY,GAAGX,EAAE,KAAK;AACxF,cAAI,CAACV,EAAO;AACR;AAEJ,gBAAMsB,IAAkBtB,EAAO,IAAIkB,CAAc,GAC3CjB,IAAQkB,EAAiBpB,EAAauB,GAAiBf,EAAM,YAAY,CAAC,GAC1EF,IAAWc,EAAiBf,EAAkBkB,GAAiBf,EAAM,QAAQ,CAAC,GAC9EgB,IAAMtB,IAAQI,GACdmB,IAAMvB,IAAQI;AAEpB,UAAIkB,IAAMX,MACNA,IAAOW,IAEPC,IAAMX,MACNA,IAAOW,IAEXV,EAAIE,CAAW,EAAE,KAAK;AAAA,YAClB,KAAK,YAAY,OAAOI,CAAU,CAAC,IAAI,OAAOC,CAAY,CAAC;AAAA,YAC3D,iBAAiB,OAAOD,CAAU;AAAA,YAClC,mBAAmB,OAAOC,CAAY;AAAA,YACtC,OAAApB;AAAA,YACA,KAAAsB;AAAA,YACA,KAAAC;AAAA,YACA,SAAS,EAAC,KAAAD,GAAK,KAAAC,EAAA;AAAA,UAAG,CACrB;AAAA,QACL,CAAC;AAAA,MACL,CAAC,GACMV;AAAA,IACX,GAAG,CAAA,CAAE;AAAA,IACL,MAAM,EAAC,MAAAF,GAAM,MAAAC,EAAA;AAAA,IACb,KAAKN,EAAM;AAAA,EAAA;AAEnB;"}
1
+ {"version":3,"file":"errorbars.js","sources":["../../../src/discrete/layers/errorbars.ts"],"sourcesContent":["import type {GroupKey} from '../../DataFrame';\nimport type {DataFrame} from '../../DataFrame';\nimport type {ErrorBarLayer} from '../DiscreteSettingsImpl';\nimport type {DiscreteSettingsImpl} from '../DiscreteSettingsImpl';\nimport type {ErrorBarsData} from './types';\nimport {getFacetStringKey} from '../utils/getFacetStringKey';\nimport type {SummaryErrorValue, SummaryGroupValue} from '../../types';\nimport {exhaustive} from '../../utils';\nimport {max, mean, min, quantile, sum} from 'd3-array';\n\nexport interface ErrorBar {\n min: number;\n max: number;\n value: number;\n key: string;\n primaryGrouping: string;\n secondaryGrouping: string;\n boundsY: {\n min: number;\n max: number;\n };\n}\n\nfunction getVariance(arr: number[]) {\n const vMean = mean(arr) as number;\n return mean(arr.map(v => Math.pow(v - vMean, 2))) as number;\n}\nfunction getStandardDeviation(arr: number[]) {\n return Math.sqrt(getVariance(arr));\n}\nfunction getStandardError(arr: number[]) {\n return getStandardDeviation(arr) / Math.sqrt(arr.length);\n}\nfunction getConfidentInterval95(arr: number[]) {\n return 1.96 * getStandardDeviation(arr);\n}\n\nfunction calculateDot(values: number[], aggregationMethod: SummaryGroupValue): number {\n if (aggregationMethod === 'median') {\n return quantile(values, 0.5) as number;\n }\n if (aggregationMethod === 'mean') {\n return mean(values) as number;\n }\n if (aggregationMethod === 'min') {\n return min(values) as number;\n }\n if (aggregationMethod === 'max') {\n return max(values) as number;\n }\n if (aggregationMethod === 'sum') {\n return sum(values) as number;\n }\n exhaustive(aggregationMethod, 'Unknown points calculation');\n}\nfunction calculateInterval(values: number[], interval: SummaryErrorValue): number {\n if (interval === 'sd') {\n return getStandardDeviation(values);\n }\n if (interval === 'se') {\n return getStandardError(values);\n }\n if (interval === 'ci') {\n return getConfidentInterval95(values);\n }\n exhaustive(interval, 'Unknown error interval calculation');\n}\n\nexport function getErrorBarsData(\n layer: ErrorBarLayer,\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): ErrorBarsData {\n let minY = Infinity;\n let maxY = -Infinity;\n\n return {\n type: 'errorbar',\n geoms: groupingKeys.facet.reduce((res: Record<string, ErrorBar[]>, facetKey) => {\n const strFacetKey = getFacetStringKey(facetKey);\n res[strFacetKey] = [];\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 groupingKeys.secondary.forEach(secondaryKey => {\n const values = data.getColumnByGrouping([...facetKey, primaryKey, secondaryKey], y.value);\n if (!values.length) {\n return;\n }\n const convertedValues = values.map(convertToScale);\n const value = convertFromScale(calculateDot(convertedValues, layer.pointsValues));\n const interval = convertFromScale(calculateInterval(convertedValues, layer.interval));\n const min = value - interval;\n const max = value + interval;\n\n if (min < minY) {\n minY = min;\n }\n if (max > maxY) {\n maxY = max;\n }\n res[strFacetKey].push({\n key: `errorbar_${String(primaryKey)}_${String(secondaryKey)}`,\n primaryGrouping: String(primaryKey),\n secondaryGrouping: String(secondaryKey),\n value,\n min,\n max,\n boundsY: {min, max},\n });\n });\n });\n return res;\n }, {}),\n meta: {minY, maxY},\n aes: layer.aes\n };\n}\n"],"names":["getVariance","arr","vMean","mean","v","getStandardDeviation","getStandardError","getConfidentInterval95","calculateDot","values","aggregationMethod","quantile","min","max","sum","exhaustive","calculateInterval","interval","getErrorBarsData","layer","groupingKeys","data","y","yAxis","minY","maxY","res","facetKey","strFacetKey","getFacetStringKey","convertToScale","convertFromScale","primaryKey","secondaryKey","convertedValues","value"],"mappings":";;;;;;;AAuBA,SAASA,EAAYC,GAAe;AAChC,QAAMC,IAAQC,EAAKF,CAAG;AACtB,SAAOE,EAAKF,EAAI,IAAI,CAAAG,MAAK,KAAK,IAAIA,IAAIF,GAAO,CAAC,CAAC,CAAC;AACpD;AACA,SAASG,EAAqBJ,GAAe;AACzC,SAAO,KAAK,KAAKD,EAAYC,CAAG,CAAC;AACrC;AACA,SAASK,EAAiBL,GAAe;AACrC,SAAOI,EAAqBJ,CAAG,IAAI,KAAK,KAAKA,EAAI,MAAM;AAC3D;AACA,SAASM,EAAuBN,GAAe;AAC3C,SAAO,OAAOI,EAAqBJ,CAAG;AAC1C;AAEA,SAASO,EAAaC,GAAkBC,GAA8C;AAClF,MAAIA,MAAsB;AACtB,WAAOC,EAASF,GAAQ,GAAG;AAE/B,MAAIC,MAAsB;AACtB,WAAOP,EAAKM,CAAM;AAEtB,MAAIC,MAAsB;AACtB,WAAOE,EAAIH,CAAM;AAErB,MAAIC,MAAsB;AACtB,WAAOG,EAAIJ,CAAM;AAErB,MAAIC,MAAsB;AACtB,WAAOI,EAAIL,CAAM;AAErB,EAAAM,EAAWL,GAAmB,4BAA4B;AAC9D;AACA,SAASM,EAAkBP,GAAkBQ,GAAqC;AAC9E,MAAIA,MAAa;AACb,WAAOZ,EAAqBI,CAAM;AAEtC,MAAIQ,MAAa;AACb,WAAOX,EAAiBG,CAAM;AAElC,MAAIQ,MAAa;AACb,WAAOV,EAAuBE,CAAM;AAExC,EAAAM,EAAWE,GAAU,oCAAoC;AAC7D;AAEO,SAASC,EACZC,GACAC,GAKAC,GACAC,GACAC,GACa;AACb,MAAIC,IAAO,OACPC,IAAO;AAEX,SAAO;AAAA,IACH,MAAM;AAAA,IACN,OAAOL,EAAa,MAAM,OAAO,CAACM,GAAiCC,MAAa;AAC5E,YAAMC,IAAcC,EAAkBF,CAAQ;AAC9C,MAAAD,EAAIE,CAAW,IAAI,CAAA;AACnB,YAAME,IAAiB,CAAC1B,MAAemB,EAAM,UAAU,QAAQ,KAAK,MAAMnB,CAAC,IAAIA,GACzE2B,IAAmB,CAAC3B,MAAemB,EAAM,UAAU,QAAQ,KAAK,IAAI,IAAInB,CAAC,IAAIA;AAEnF,aAAAgB,EAAa,QAAQ,QAAQ,CAAAY,MAAc;AACvC,QAAAZ,EAAa,UAAU,QAAQ,CAAAa,MAAgB;AAC3C,gBAAMxB,IAASY,EAAK,oBAAoB,CAAC,GAAGM,GAAUK,GAAYC,CAAY,GAAGX,EAAE,KAAK;AACxF,cAAI,CAACb,EAAO;AACR;AAEJ,gBAAMyB,IAAkBzB,EAAO,IAAIqB,CAAc,GAC3CK,IAAQJ,EAAiBvB,EAAa0B,GAAiBf,EAAM,YAAY,CAAC,GAC1EF,IAAWc,EAAiBf,EAAkBkB,GAAiBf,EAAM,QAAQ,CAAC,GAC9EP,IAAMuB,IAAQlB,GACdJ,IAAMsB,IAAQlB;AAEpB,UAAIL,IAAMY,MACNA,IAAOZ,IAEPC,IAAMY,MACNA,IAAOZ,IAEXa,EAAIE,CAAW,EAAE,KAAK;AAAA,YAClB,KAAK,YAAY,OAAOI,CAAU,CAAC,IAAI,OAAOC,CAAY,CAAC;AAAA,YAC3D,iBAAiB,OAAOD,CAAU;AAAA,YAClC,mBAAmB,OAAOC,CAAY;AAAA,YACtC,OAAAE;AAAA,YACA,KAAAvB;AAAAA,YACA,KAAAC;AAAAA,YACA,SAAS,EAAC,KAAAD,GAAK,KAAAC,EAAAA;AAAAA,UAAG,CACrB;AAAA,QACL,CAAC;AAAA,MACL,CAAC,GACMa;AAAA,IACX,GAAG,CAAA,CAAE;AAAA,IACL,MAAM,EAAC,MAAAF,GAAM,MAAAC,EAAA;AAAA,IACb,KAAKN,EAAM;AAAA,EAAA;AAEnB;"}
@@ -1,47 +1,56 @@
1
- import { getOutliersBounds as S } from "../utils/getOutliersBounds.js";
1
+ import { getOutliersBounds as F } from "../utils/getOutliersBounds.js";
2
2
  import "../../utils/TextMeasurer/TextMeasurer.js";
3
- import { getFacetStringKey as w } from "../utils/getFacetStringKey.js";
4
- import { exhaustive as F } from "../../utils/index.js";
5
- import M from "../../node_modules/.pnpm/d3-array@3.2.4/node_modules/d3-array/src/quantile.js";
6
- import v from "../../node_modules/.pnpm/d3-array@3.2.4/node_modules/d3-array/src/mean.js";
7
- function B(n, o) {
8
- if (o === "median")
9
- return M(n, 0.5);
10
- if (o === "mean")
11
- return v(n);
12
- F(o, `Unknown line points calculation for dot layer: ${o}`);
3
+ import { getFacetStringKey as h } from "../utils/getFacetStringKey.js";
4
+ import { exhaustive as B } from "../../utils/index.js";
5
+ import G from "../../node_modules/.pnpm/d3-array@3.2.4/node_modules/d3-array/src/quantile.js";
6
+ import O from "../../node_modules/.pnpm/d3-array@3.2.4/node_modules/d3-array/src/mean.js";
7
+ import k from "../../node_modules/.pnpm/d3-array@3.2.4/node_modules/d3-array/src/min.js";
8
+ import C from "../../node_modules/.pnpm/d3-array@3.2.4/node_modules/d3-array/src/max.js";
9
+ import D from "../../node_modules/.pnpm/d3-array@3.2.4/node_modules/d3-array/src/sum.js";
10
+ function E(n, t) {
11
+ if (t === "median")
12
+ return G(n, 0.5);
13
+ if (t === "mean")
14
+ return O(n);
15
+ if (t === "min")
16
+ return k(n);
17
+ if (t === "max")
18
+ return C(n);
19
+ if (t === "sum")
20
+ return D(n);
21
+ B(t, `Unknown line points calculation for dot layer: ${t}`);
13
22
  }
14
- function $(n, o, c, s, r) {
15
- let a = 1 / 0, m = -1 / 0;
23
+ function z(n, t, c, a, r) {
24
+ let e = 1 / 0, u = -1 / 0;
16
25
  return {
17
26
  type: "line",
18
- geoms: o.facet.reduce((l, u) => {
19
- const d = w(u);
20
- l[d] = [];
21
- let p = -1 / 0, g = 1 / 0;
22
- return n.aes.showOutliers || ([p, g] = S(c.getColumnByGrouping([...u], s.value), r.scale)), o.secondary.forEach((h) => {
23
- const e = {
24
- key: `${String(h)}`,
27
+ geoms: t.facet.reduce((f, l) => {
28
+ const p = h(l);
29
+ f[p] = [];
30
+ let d = -1 / 0, b = 1 / 0;
31
+ return n.aes.showOutliers || ([d, b] = F(c.getColumnByGrouping([...l], a.value), r.scale)), t.secondary.forEach((x) => {
32
+ const m = {
33
+ key: `${String(x)}`,
25
34
  boundsY: {
26
35
  min: 1 / 0,
27
36
  max: -1 / 0
28
37
  },
29
38
  dots: {}
30
- }, I = (i) => r.scale === "log" ? Math.log10(i) : i, x = (i) => r.scale === "log" ? Math.pow(10, i) : i;
31
- o.primary.forEach((i) => {
32
- const b = c.getColumnByGrouping([...u, i, h], s.value);
33
- let f = b;
34
- n.aes.showOutliers || (f = b.filter((Y) => Y >= p && Y <= g));
35
- const t = f.length ? x(B(f.map(I), n.pointsValues)) : n.emptyGroupValue;
36
- e.dots[String(i)] = t, t < a && (a = t), t > m && (m = t), t < e.boundsY.min && (e.boundsY.min = t), t > e.boundsY.max && (e.boundsY.max = t);
37
- }), l[d].push(e);
38
- }), l;
39
+ }, S = (o) => r.scale === "log" ? Math.log10(o) : o, w = (o) => r.scale === "log" ? Math.pow(10, o) : o;
40
+ t.primary.forEach((o) => {
41
+ const Y = c.getColumnByGrouping([...l, o, x], a.value);
42
+ let s = Y;
43
+ n.aes.showOutliers || (s = Y.filter((I) => I >= d && I <= b));
44
+ const i = s.length ? w(E(s.map(S), n.pointsValues)) : n.emptyGroupValue;
45
+ m.dots[String(o)] = i, i < e && (e = i), i > u && (u = i), i < m.boundsY.min && (m.boundsY.min = i), i > m.boundsY.max && (m.boundsY.max = i);
46
+ }), f[p].push(m);
47
+ }), f;
39
48
  }, {}),
40
- meta: { minY: a, maxY: m },
49
+ meta: { minY: e, maxY: u },
41
50
  aes: n.aes
42
51
  };
43
52
  }
44
53
  export {
45
- $ as getLinesData
54
+ z as getLinesData
46
55
  };
47
56
  //# sourceMappingURL=lines.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"lines.js","sources":["../../../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 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 let valuesFiltered = values;\n if (!layer.aes.showOutliers) {\n valuesFiltered = values.filter((v) => v >= boundMin && v <= boundMax);\n }\n\n const dot = valuesFiltered.length\n ? convertFromScale(calculateDot(valuesFiltered.map(convertToScale), layer.pointsValues))\n : layer.emptyGroupValue;\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 res[strFacetKey].push(line);\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","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;AAEtB,EAAAI,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;AAC9C,MAAAD,EAAIE,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,QAAC,GAELE,IAAiB,CAACC,MAAeb,EAAM,UAAU,QAAQ,KAAK,MAAMa,CAAC,IAAIA,GACzEC,IAAmB,CAACD,MAAeb,EAAM,UAAU,QAAQ,KAAK,IAAI,IAAIa,CAAC,IAAIA;AAEnF,QAAAhB,EAAa,QAAQ,QAAQ,CAAAkB,MAAc;AACvC,gBAAMzB,IAASQ,EAAK,oBAAoB,CAAC,GAAGM,GAAUW,GAAYL,CAAY,GAAGX,EAAE,KAAK;AACxF,cAAIiB,IAAiB1B;AACrB,UAAKM,EAAM,IAAI,iBACXoB,IAAiB1B,EAAO,OAAO,CAACuB,MAAMA,KAAKN,KAAYM,KAAKL,CAAQ;AAGxE,gBAAMS,IAAMD,EAAe,SACrBF,EAAiBzB,EAAa2B,EAAe,IAAIJ,CAAc,GAAGhB,EAAM,YAAY,CAAC,IACrFA,EAAM;AACZ,UAAAe,EAAK,KAAK,OAAOI,CAAU,CAAC,IAAIE,GAC5BA,IAAMhB,MACNA,IAAOgB,IAEPA,IAAMf,MACNA,IAAOe,IAEPA,IAAMN,EAAK,QAAQ,QACnBA,EAAK,QAAQ,MAAMM,IAEnBA,IAAMN,EAAK,QAAQ,QACnBA,EAAK,QAAQ,MAAMM;AAAA,QAE3B,CAAC,GACDd,EAAIE,CAAW,EAAE,KAAKM,CAAI;AAAA,MAC9B,CAAC,GACMR;AAAA,IACX,GAAG,CAAA,CAAE;AAAA,IACL,MAAM,EAAC,MAAAF,GAAM,MAAAC,EAAA;AAAA,IACb,KAAKN,EAAM;AAAA,EAAA;AAEnB;"}
1
+ {"version":3,"file":"lines.js","sources":["../../../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 {max, mean, min, quantile, sum} 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[], aggregationMethod: LineLayer['pointsValues']): number {\n if (aggregationMethod === 'median') {\n return quantile(values, 0.5) as number;\n }\n if (aggregationMethod === 'mean') {\n return mean(values) as number;\n }\n if (aggregationMethod === 'min') {\n return min(values) as number;\n }\n if (aggregationMethod === 'max') {\n return max(values) as number;\n }\n if (aggregationMethod === 'sum') {\n return sum(values) as number;\n }\n exhaustive(aggregationMethod, `Unknown line points calculation for dot layer: ${aggregationMethod}`);\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 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 let valuesFiltered = values;\n if (!layer.aes.showOutliers) {\n valuesFiltered = values.filter((v) => v >= boundMin && v <= boundMax);\n }\n\n const dot = valuesFiltered.length\n ? convertFromScale(calculateDot(valuesFiltered.map(convertToScale), layer.pointsValues))\n : layer.emptyGroupValue;\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 res[strFacetKey].push(line);\n });\n return res;\n }, {}),\n meta: {minY, maxY},\n aes: layer.aes\n };\n}\n"],"names":["calculateDot","values","aggregationMethod","quantile","mean","min","max","sum","exhaustive","getLinesData","layer","groupingKeys","data","y","yAxis","minY","maxY","res","facetKey","strFacetKey","getFacetStringKey","boundMin","boundMax","getOutliersBounds","secondaryKey","line","convertToScale","v","convertFromScale","primaryKey","valuesFiltered","dot"],"mappings":";;;;;;;;;AAkBA,SAASA,EAAaC,GAAkBC,GAAsD;AAC1F,MAAIA,MAAsB;AACtB,WAAOC,EAASF,GAAQ,GAAG;AAE/B,MAAIC,MAAsB;AACtB,WAAOE,EAAKH,CAAM;AAEtB,MAAIC,MAAsB;AACtB,WAAOG,EAAIJ,CAAM;AAErB,MAAIC,MAAsB;AACtB,WAAOI,EAAIL,CAAM;AAErB,MAAIC,MAAsB;AACtB,WAAOK,EAAIN,CAAM;AAErB,EAAAO,EAAWN,GAAmB,kDAAkDA,CAAiB,EAAE;AACvG;AAEO,SAASO,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;AAC9C,MAAAD,EAAIE,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,QAAC,GAELE,IAAiB,CAACC,MAAeb,EAAM,UAAU,QAAQ,KAAK,MAAMa,CAAC,IAAIA,GACzEC,IAAmB,CAACD,MAAeb,EAAM,UAAU,QAAQ,KAAK,IAAI,IAAIa,CAAC,IAAIA;AAEnF,QAAAhB,EAAa,QAAQ,QAAQ,CAAAkB,MAAc;AACvC,gBAAM5B,IAASW,EAAK,oBAAoB,CAAC,GAAGM,GAAUW,GAAYL,CAAY,GAAGX,EAAE,KAAK;AACxF,cAAIiB,IAAiB7B;AACrB,UAAKS,EAAM,IAAI,iBACXoB,IAAiB7B,EAAO,OAAO,CAAC0B,MAAMA,KAAKN,KAAYM,KAAKL,CAAQ;AAGxE,gBAAMS,IAAMD,EAAe,SACrBF,EAAiB5B,EAAa8B,EAAe,IAAIJ,CAAc,GAAGhB,EAAM,YAAY,CAAC,IACrFA,EAAM;AACZ,UAAAe,EAAK,KAAK,OAAOI,CAAU,CAAC,IAAIE,GAC5BA,IAAMhB,MACNA,IAAOgB,IAEPA,IAAMf,MACNA,IAAOe,IAEPA,IAAMN,EAAK,QAAQ,QACnBA,EAAK,QAAQ,MAAMM,IAEnBA,IAAMN,EAAK,QAAQ,QACnBA,EAAK,QAAQ,MAAMM;AAAA,QAE3B,CAAC,GACDd,EAAIE,CAAW,EAAE,KAAKM,CAAI;AAAA,MAC9B,CAAC,GACMR;AAAA,IACX,GAAG,CAAA,CAAE;AAAA,IACL,MAAM,EAAC,MAAAF,GAAM,MAAAC,EAAA;AAAA,IACb,KAAKN,EAAM;AAAA,EAAA;AAEnB;"}
@@ -1 +1 @@
1
- {"version":3,"file":"stackedBar.js","sources":["../../../src/discrete/layers/stackedBar.ts"],"sourcesContent":["import { max as d3Max, min as d3Min, mean, quantileSorted, sum } from 'd3-array';\nimport type { DataFrame, GroupKey } from '../../DataFrame';\nimport { NO_GROUPED } from '../../DataFrame';\nimport type { ColumnName } from '../../types';\nimport type { StackedBarLayer } from '../DiscreteSettingsImpl';\nimport { getFacetStringKey } from '../utils/getFacetStringKey';\nimport type { StackedBarsData } from './types';\nimport { exhaustive } from '../../utils';\n\ntype BarPart = {\n height: number;\n key: string;\n};\n\nexport type StackedBar = {\n key: string;\n valuesMap: Record<string, BarPart>;\n primaryGrouping: string;\n boundsY: {\n min: number;\n max: number;\n };\n};\n\nfunction calculateHeight(\n indexes: Uint32Array,\n getter: (idx: number) => number,\n heightFunc: 'sum' | 'min' | 'max' | 'median' | 'mean',\n):number {\n if (indexes.length === 0) {\n throw Error('Unable to create bar on empty data');\n }\n\n switch (heightFunc) {\n case 'sum':\n return sum(indexes, getter);\n case 'max':\n return d3Max(indexes, getter) ?? getter(0);\n case 'min':\n return d3Min(indexes, getter) ?? getter(0);\n case 'median': {\n const valuesSorted = [...indexes].map(getter).sort((a, b) => a - b);\n return quantileSorted(valuesSorted, 0.5) ?? getter(0);\n }\n case 'mean': {\n return mean(indexes, getter) ?? getter(0);\n }\n default: exhaustive(heightFunc, `Unknown bar height function ${heightFunc}`);\n }\n}\n\nexport function getStackedBarsData(\n layer: StackedBarLayer,\n groupingKeys: {\n facet: GroupKey[][],\n primary: GroupKey[],\n secondary: GroupKey[]\n },\n data: DataFrame,\n y: ColumnName,\n): StackedBarsData {\n let maxY = -Infinity;\n let minY = Infinity;\n\n return {\n type: 'stackedBar',\n geoms: groupingKeys.facet.reduce((res: Record<string, StackedBar[]>, facetKey) => {\n const strFacetKey = getFacetStringKey(facetKey);\n res[strFacetKey] = [];\n groupingKeys.primary.forEach(primaryKey => {\n let currentHeight = 0;\n const barParts:Record<string, BarPart> = {};\n groupingKeys.secondary.forEach(secondaryKey => {\n const secondaryKeyStr = secondaryKey === NO_GROUPED ? 'null' : secondaryKey;\n const indexes = data.getRowsByGrouping([...facetKey, primaryKey, secondaryKey]);\n if (!indexes.length) {\n return;\n }\n const height = calculateHeight(indexes, (i) => Number(data.getColumnValue(y.value, i)), layer.height);\n barParts[secondaryKeyStr] = {\n height,\n key: String(secondaryKeyStr),\n };\n currentHeight += height;\n });\n const maxStackHeight = currentHeight;\n if (layer.normalize) { // show in percents of every stack\n groupingKeys.secondary.forEach(secondaryKey => {\n const secondaryKeyStr = secondaryKey === NO_GROUPED ? 'null' : secondaryKey;\n if (!barParts[secondaryKeyStr]) {\n return;\n }\n barParts[secondaryKeyStr].height = barParts[secondaryKeyStr].height / maxStackHeight * 100;\n });\n }\n maxY = Math.max(maxY, 0, currentHeight);\n minY = Math.min(minY, 0, currentHeight);\n const bound = layer.normalize ? 100 : maxStackHeight;\n res[strFacetKey].push({\n key: `stackedBar_${String(primaryKey)}`,\n valuesMap: barParts,\n primaryGrouping: primaryKey,\n boundsY: {min: Math.min(bound, 0), max: Math.max(bound, 0)},\n } as StackedBar);\n });\n return res;\n }, {}),\n meta: {minY: layer.normalize ? 0 : minY, maxY: layer.normalize ? 100 : maxY, normalize: layer.normalize},\n aes: layer.aes,\n };\n}\n"],"names":["calculateHeight","indexes","getter","heightFunc","sum","d3Max","d3Min","valuesSorted","a","b","quantileSorted","mean","exhaustive","getStackedBarsData","layer","groupingKeys","data","y","maxY","minY","res","facetKey","strFacetKey","getFacetStringKey","primaryKey","currentHeight","barParts","secondaryKey","secondaryKeyStr","NO_GROUPED","height","i","maxStackHeight","bound"],"mappings":";;;;;;;;AAwBA,SAASA,EACLC,GACAC,GACAC,GACK;AACL,MAAIF,EAAQ,WAAW;AACnB,UAAM,MAAM,oCAAoC;AAGpD,UAAQE,GAAA;AAAA,IACJ,KAAK;AACD,aAAOC,EAAIH,GAASC,CAAM;AAAA,IAC9B,KAAK;AACD,aAAOG,EAAMJ,GAASC,CAAM,KAAKA,EAAO,CAAC;AAAA,IAC7C,KAAK;AACD,aAAOI,EAAML,GAASC,CAAM,KAAKA,EAAO,CAAC;AAAA,IAC7C,KAAK,UAAU;AACX,YAAMK,IAAe,CAAC,GAAGN,CAAO,EAAE,IAAIC,CAAM,EAAE,KAAK,CAACM,GAAGC,MAAMD,IAAIC,CAAC;AAClE,aAAOC,EAAeH,GAAc,GAAG,KAAKL,EAAO,CAAC;AAAA,IACxD;AAAA,IACA,KAAK;AACD,aAAOS,EAAKV,GAASC,CAAM,KAAKA,EAAO,CAAC;AAAA,IAE5C;AAAS,MAAAU,EAAWT,GAAY,+BAA+BA,CAAU,EAAE;AAAA,EAAA;AAEnF;AAEO,SAASU,EACZC,GACAC,GAKAC,GACAC,GACe;AACf,MAAIC,IAAO,QACPC,IAAO;AAEX,SAAO;AAAA,IACH,MAAM;AAAA,IACN,OAAOJ,EAAa,MAAM,OAAO,CAACK,GAAmCC,MAAa;AAC9E,YAAMC,IAAcC,EAAkBF,CAAQ;AAC9C,aAAAD,EAAIE,CAAW,IAAI,CAAA,GACnBP,EAAa,QAAQ,QAAQ,CAAAS,MAAc;AACvC,YAAIC,IAAgB;AACpB,cAAMC,IAAmC,CAAA;AACzC,QAAAX,EAAa,UAAU,QAAQ,CAAAY,MAAgB;AAC3C,gBAAMC,IAAkBD,MAAiBE,IAAa,SAASF,GACzD1B,IAAUe,EAAK,kBAAkB,CAAC,GAAGK,GAAUG,GAAYG,CAAY,CAAC;AAC9E,cAAI,CAAC1B,EAAQ;AACT;AAEJ,gBAAM6B,IAAS9B,EAAgBC,GAAS,CAAC8B,MAAM,OAAOf,EAAK,eAAeC,EAAE,OAAOc,CAAC,CAAC,GAAGjB,EAAM,MAAM;AACpG,UAAAY,EAASE,CAAe,IAAI;AAAA,YACxB,QAAAE;AAAA,YACA,KAAK,OAAOF,CAAe;AAAA,UAAA,GAE/BH,KAAiBK;AAAA,QACrB,CAAC;AACD,cAAME,IAAiBP;AACvB,QAAIX,EAAM,aACNC,EAAa,UAAU,QAAQ,CAAAY,MAAgB;AAC3C,gBAAMC,IAAkBD,MAAiBE,IAAa,SAASF;AAC/D,UAAKD,EAASE,CAAe,MAG7BF,EAASE,CAAe,EAAE,SAASF,EAASE,CAAe,EAAE,SAAUI,IAAiB;AAAA,QAC5F,CAAC,GAELd,IAAO,KAAK,IAAIA,GAAM,GAAGO,CAAa,GACtCN,IAAO,KAAK,IAAIA,GAAM,GAAGM,CAAa;AACtC,cAAMQ,IAAQnB,EAAM,YAAY,MAAMkB;AACtC,QAAAZ,EAAIE,CAAW,EAAE,KAAK;AAAA,UAClB,KAAK,cAAc,OAAOE,CAAU,CAAC;AAAA,UACrC,WAAWE;AAAA,UACX,iBAAiBF;AAAA,UACjB,SAAS,EAAC,KAAK,KAAK,IAAIS,GAAO,CAAC,GAAG,KAAK,KAAK,IAAIA,GAAO,CAAC,EAAA;AAAA,QAAC,CAC/C;AAAA,MACnB,CAAC,GACMb;AAAA,IACX,GAAG,CAAA,CAAE;AAAA,IACL,MAAM,EAAC,MAAMN,EAAM,YAAY,IAAIK,GAAM,MAAML,EAAM,YAAY,MAAMI,GAAM,WAAWJ,EAAM,UAAA;AAAA,IAC9F,KAAKA,EAAM;AAAA,EAAA;AAEnB;"}
1
+ {"version":3,"file":"stackedBar.js","sources":["../../../src/discrete/layers/stackedBar.ts"],"sourcesContent":["import { max as d3Max, min as d3Min, mean, quantileSorted, sum } from 'd3-array';\nimport type { DataFrame, GroupKey } from '../../DataFrame';\nimport { NO_GROUPED } from '../../DataFrame';\nimport type { AggregationMethod, ColumnName } from '../../types';\nimport type { StackedBarLayer } from '../DiscreteSettingsImpl';\nimport { getFacetStringKey } from '../utils/getFacetStringKey';\nimport type { StackedBarsData } from './types';\nimport { exhaustive } from '../../utils';\n\ntype BarPart = {\n height: number;\n key: string;\n};\n\nexport type StackedBar = {\n key: string;\n valuesMap: Record<string, BarPart>;\n primaryGrouping: string;\n boundsY: {\n min: number;\n max: number;\n };\n};\n\nfunction calculateHeight(\n indexes: Uint32Array,\n getter: (idx: number) => number,\n heightFunc: AggregationMethod,\n):number {\n if (indexes.length === 0) {\n throw Error('Unable to create bar on empty data');\n }\n\n switch (heightFunc) {\n case 'sum':\n return sum(indexes, getter);\n case 'max':\n return d3Max(indexes, getter) ?? getter(0);\n case 'min':\n return d3Min(indexes, getter) ?? getter(0);\n case 'median': {\n const valuesSorted = [...indexes].map(getter).sort((a, b) => a - b);\n return quantileSorted(valuesSorted, 0.5) ?? getter(0);\n }\n case 'mean': {\n return mean(indexes, getter) ?? getter(0);\n }\n default: exhaustive(heightFunc, `Unknown bar height function ${heightFunc}`);\n }\n}\n\nexport function getStackedBarsData(\n layer: StackedBarLayer,\n groupingKeys: {\n facet: GroupKey[][],\n primary: GroupKey[],\n secondary: GroupKey[]\n },\n data: DataFrame,\n y: ColumnName,\n): StackedBarsData {\n let maxY = -Infinity;\n let minY = Infinity;\n\n return {\n type: 'stackedBar',\n geoms: groupingKeys.facet.reduce((res: Record<string, StackedBar[]>, facetKey) => {\n const strFacetKey = getFacetStringKey(facetKey);\n res[strFacetKey] = [];\n groupingKeys.primary.forEach(primaryKey => {\n let currentHeight = 0;\n const barParts:Record<string, BarPart> = {};\n groupingKeys.secondary.forEach(secondaryKey => {\n const secondaryKeyStr = secondaryKey === NO_GROUPED ? 'null' : secondaryKey;\n const indexes = data.getRowsByGrouping([...facetKey, primaryKey, secondaryKey]);\n if (!indexes.length) {\n return;\n }\n const height = calculateHeight(indexes, (i) => Number(data.getColumnValue(y.value, i)), layer.height);\n barParts[secondaryKeyStr] = {\n height,\n key: String(secondaryKeyStr),\n };\n currentHeight += height;\n });\n const maxStackHeight = currentHeight;\n if (layer.normalize) { // show in percents of every stack\n groupingKeys.secondary.forEach(secondaryKey => {\n const secondaryKeyStr = secondaryKey === NO_GROUPED ? 'null' : secondaryKey;\n if (!barParts[secondaryKeyStr]) {\n return;\n }\n barParts[secondaryKeyStr].height = barParts[secondaryKeyStr].height / maxStackHeight * 100;\n });\n }\n maxY = Math.max(maxY, 0, currentHeight);\n minY = Math.min(minY, 0, currentHeight);\n const bound = layer.normalize ? 100 : maxStackHeight;\n res[strFacetKey].push({\n key: `stackedBar_${String(primaryKey)}`,\n valuesMap: barParts,\n primaryGrouping: primaryKey,\n boundsY: {min: Math.min(bound, 0), max: Math.max(bound, 0)},\n } as StackedBar);\n });\n return res;\n }, {}),\n meta: {minY: layer.normalize ? 0 : minY, maxY: layer.normalize ? 100 : maxY, normalize: layer.normalize},\n aes: layer.aes,\n };\n}\n"],"names":["calculateHeight","indexes","getter","heightFunc","sum","d3Max","d3Min","valuesSorted","a","b","quantileSorted","mean","exhaustive","getStackedBarsData","layer","groupingKeys","data","y","maxY","minY","res","facetKey","strFacetKey","getFacetStringKey","primaryKey","currentHeight","barParts","secondaryKey","secondaryKeyStr","NO_GROUPED","height","i","maxStackHeight","bound"],"mappings":";;;;;;;;AAwBA,SAASA,EACLC,GACAC,GACAC,GACK;AACL,MAAIF,EAAQ,WAAW;AACnB,UAAM,MAAM,oCAAoC;AAGpD,UAAQE,GAAA;AAAA,IACJ,KAAK;AACD,aAAOC,EAAIH,GAASC,CAAM;AAAA,IAC9B,KAAK;AACD,aAAOG,EAAMJ,GAASC,CAAM,KAAKA,EAAO,CAAC;AAAA,IAC7C,KAAK;AACD,aAAOI,EAAML,GAASC,CAAM,KAAKA,EAAO,CAAC;AAAA,IAC7C,KAAK,UAAU;AACX,YAAMK,IAAe,CAAC,GAAGN,CAAO,EAAE,IAAIC,CAAM,EAAE,KAAK,CAACM,GAAGC,MAAMD,IAAIC,CAAC;AAClE,aAAOC,EAAeH,GAAc,GAAG,KAAKL,EAAO,CAAC;AAAA,IACxD;AAAA,IACA,KAAK;AACD,aAAOS,EAAKV,GAASC,CAAM,KAAKA,EAAO,CAAC;AAAA,IAE5C;AAAS,MAAAU,EAAWT,GAAY,+BAA+BA,CAAU,EAAE;AAAA,EAAA;AAEnF;AAEO,SAASU,EACZC,GACAC,GAKAC,GACAC,GACe;AACf,MAAIC,IAAO,QACPC,IAAO;AAEX,SAAO;AAAA,IACH,MAAM;AAAA,IACN,OAAOJ,EAAa,MAAM,OAAO,CAACK,GAAmCC,MAAa;AAC9E,YAAMC,IAAcC,EAAkBF,CAAQ;AAC9C,aAAAD,EAAIE,CAAW,IAAI,CAAA,GACnBP,EAAa,QAAQ,QAAQ,CAAAS,MAAc;AACvC,YAAIC,IAAgB;AACpB,cAAMC,IAAmC,CAAA;AACzC,QAAAX,EAAa,UAAU,QAAQ,CAAAY,MAAgB;AAC3C,gBAAMC,IAAkBD,MAAiBE,IAAa,SAASF,GACzD1B,IAAUe,EAAK,kBAAkB,CAAC,GAAGK,GAAUG,GAAYG,CAAY,CAAC;AAC9E,cAAI,CAAC1B,EAAQ;AACT;AAEJ,gBAAM6B,IAAS9B,EAAgBC,GAAS,CAAC8B,MAAM,OAAOf,EAAK,eAAeC,EAAE,OAAOc,CAAC,CAAC,GAAGjB,EAAM,MAAM;AACpG,UAAAY,EAASE,CAAe,IAAI;AAAA,YACxB,QAAAE;AAAA,YACA,KAAK,OAAOF,CAAe;AAAA,UAAA,GAE/BH,KAAiBK;AAAA,QACrB,CAAC;AACD,cAAME,IAAiBP;AACvB,QAAIX,EAAM,aACNC,EAAa,UAAU,QAAQ,CAAAY,MAAgB;AAC3C,gBAAMC,IAAkBD,MAAiBE,IAAa,SAASF;AAC/D,UAAKD,EAASE,CAAe,MAG7BF,EAASE,CAAe,EAAE,SAASF,EAASE,CAAe,EAAE,SAAUI,IAAiB;AAAA,QAC5F,CAAC,GAELd,IAAO,KAAK,IAAIA,GAAM,GAAGO,CAAa,GACtCN,IAAO,KAAK,IAAIA,GAAM,GAAGM,CAAa;AACtC,cAAMQ,IAAQnB,EAAM,YAAY,MAAMkB;AACtC,QAAAZ,EAAIE,CAAW,EAAE,KAAK;AAAA,UAClB,KAAK,cAAc,OAAOE,CAAU,CAAC;AAAA,UACrC,WAAWE;AAAA,UACX,iBAAiBF;AAAA,UACjB,SAAS,EAAC,KAAK,KAAK,IAAIS,GAAO,CAAC,GAAG,KAAK,KAAK,IAAIA,GAAO,CAAC,EAAA;AAAA,QAAC,CAC/C;AAAA,MACnB,CAAC,GACMb;AAAA,IACX,GAAG,CAAA,CAAE;AAAA,IACL,MAAM,EAAC,MAAMN,EAAM,YAAY,IAAIK,GAAM,MAAML,EAAM,YAAY,MAAMI,GAAM,WAAWJ,EAAM,UAAA;AAAA,IAC9F,KAAKA,EAAM;AAAA,EAAA;AAEnB;"}
@@ -1,8 +1,8 @@
1
- import l from "../../../_virtual/index6.js";
2
- import s from "../../../_virtual/index7.js";
3
- import f from "../../../_virtual/index8.js";
4
- import m from "../../../_virtual/index9.js";
5
- import h from "../../../_virtual/index10.js";
1
+ import l from "../../../_virtual/index5.js";
2
+ import s from "../../../_virtual/index6.js";
3
+ import f from "../../../_virtual/index7.js";
4
+ import m from "../../../_virtual/index8.js";
5
+ import h from "../../../_virtual/index9.js";
6
6
  import { MannWhitneyU as c } from "./MannWhitneyU.js";
7
7
  import n from "../../../_virtual/lodash.js";
8
8
  function u(t, a, r) {