{"version":3,"file":"histogram.js","sourceRoot":"","sources":["../../../src/utils/transform/histogram.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAE,IAAI,EAAE,QAAQ,EAAE,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC;AAWlG,mBAAmB;AACnB,SAAS,SAAS,CAAC,KAAa,EAAE,QAAgB,EAAE,SAAkB;IACpE,UAAU;IACV,IAAI,SAAS,KAAK,CAAC,EAAE;QACnB,OAAO,CAAC,CAAC,EAAE,QAAQ,CAAC,CAAC;KACtB;IACD,IAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,KAAK,GAAG,QAAQ,CAAC,CAAC;IAC3C,OAAO,CAAC,QAAQ,GAAG,KAAK,EAAE,QAAQ,GAAG,CAAC,KAAK,GAAG,CAAC,CAAC,CAAC,CAAC;AACpD,CAAC;AAED,gBAAgB;AAChB,SAAS,OAAO,CAAC,MAAqB;IACpC,OAAO,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,MAAM,CAAC,MAAM,CAAC,GAAG,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;AAC3D,CAAC;AACD;;;;;;;GAOG;AACH,MAAM,UAAU,YAAY,CAAC,IAAU,EAAE,QAAgB,EAAE,QAAgB,EAAE,SAAkB,EAAE,UAAmB;IAClH,IAAM,eAAe,GAAG,KAAK,CAAC,IAAI,CAAC,CAAC;IAEpC,uBAAuB;IACvB,MAAM,CAAC,eAAe,EAAE,QAAQ,CAAC,CAAC;IAElC,yBAAyB;IACzB,IAAM,MAAM,GAAG,WAAW,CAAC,eAAe,EAAE,QAAQ,CAAC,CAAC;IACtD,IAAM,KAAK,GAAG,QAAQ,CAAC,MAAM,CAAC,CAAC;IAC/B,IAAM,UAAU,GAAG,KAAK,CAAC,GAAG,GAAG,KAAK,CAAC,GAAG,CAAC;IAEzC,8DAA8D;IAC9D,IAAI,SAAS,GAAG,QAAQ,CAAC;IACzB,IAAI,CAAC,QAAQ,IAAI,SAAS,EAAE;QAC1B,SAAS,GAAG,SAAS,GAAG,CAAC,CAAC,CAAC,CAAC,UAAU,GAAG,CAAC,SAAS,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,GAAG,CAAC;KACtE;IACD,mEAAmE;IACnE,IAAI,CAAC,QAAQ,IAAI,CAAC,SAAS,EAAE;QAC3B,IAAM,iBAAiB,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC;QAC1C,SAAS,GAAG,UAAU,GAAG,iBAAiB,CAAC;KAC5C;IACD,4BAA4B;IAC5B,IAAM,IAAI,GAAiB,EAAE,CAAC;IAC9B,IAAM,MAAM,GAAG,OAAO,CAAC,eAAe,EAAE,UAAU,CAAC,CAAC;IACpD,mCAAmC;IACnC,IAAI,OAAO,CAAC,MAAM,CAAC,EAAE;QACnB,IAAI,CAAC,eAAe,EAAE,UAAC,IAAS;YAC9B,IAAM,KAAK,GAAG,IAAI,CAAC,QAAQ,CAAC,CAAC;YAC7B,IAAM,GAAG,GAAG,SAAS,CAAC,KAAK,EAAE,SAAS,EAAE,SAAS,CAAC,CAAC;YACnD,IAAM,MAAM,GAAG,UAAG,GAAG,CAAC,CAAC,CAAC,cAAI,GAAG,CAAC,CAAC,CAAC,CAAE,CAAC;YACrC,IAAI,CAAC,MAAM,CAAC,IAAI,EAAE,MAAM,CAAC,EAAE;gBACzB,IAAI,CAAC,MAAM,CAAC,GAAG,EAAE,KAAK,EAAE,GAAG,EAAE,KAAK,EAAE,CAAC,EAAE,CAAC;aACzC;YACD,IAAI,CAAC,MAAM,CAAC,CAAC,KAAK,IAAI,CAAC,CAAC;QAC1B,CAAC,CAAC,CAAC;KACJ;SAAM;QACL,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,OAAO,CAAC,UAAC,QAAgB;YAC3C,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,EAAE,UAAC,IAAS;gBAC/B,IAAM,KAAK,GAAG,IAAI,CAAC,QAAQ,CAAC,CAAC;gBAC7B,IAAM,GAAG,GAAG,SAAS,CAAC,KAAK,EAAE,SAAS,EAAE,SAAS,CAAC,CAAC;gBACnD,IAAM,MAAM,GAAG,UAAG,GAAG,CAAC,CAAC,CAAC,cAAI,GAAG,CAAC,CAAC,CAAC,CAAE,CAAC;gBACrC,IAAM,cAAc,GAAG,UAAG,MAAM,cAAI,QAAQ,CAAE,CAAC;gBAC/C,IAAI,CAAC,MAAM,CAAC,IAAI,EAAE,cAAc,CAAC,EAAE;oBACjC,IAAI,CAAC,cAAc,CAAC,GAAG,EAAE,KAAK,EAAE,GAAG,EAAE,KAAK,EAAE,CAAC,EAAE,CAAC;oBAChD,IAAI,CAAC,cAAc,CAAC,CAAC,UAAU,CAAC,GAAG,QAAQ,CAAC;iBAC7C;gBACD,IAAI,CAAC,cAAc,CAAC,CAAC,KAAK,IAAI,CAAC,CAAC;YAClC,CAAC,CAAC,CAAC;QACL,CAAC,CAAC,CAAC;KACJ;IACD,6BAA6B;IAC7B,IAAM,QAAQ,GAAyB,EAAE,CAAC;IAC1C,IAAI,CAAC,IAAI,EAAE,UAAC,GAAkB;QAC5B,QAAQ,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;IACrB,CAAC,CAAC,CAAC;IACH,OAAO,QAAQ,CAAC;AAClB,CAAC","sourcesContent":["import { clone, each, getRange, groupBy, hasKey, isEmpty, sortBy, valuesOfKey } from '@antv/util';\nimport { Data } from '../../types';\n\ntype StatisticData = {\n range: Array;\n count: number;\n};\ntype StatisticBin = {\n [key: string]: StatisticData;\n};\n\n// 进行转换得到值所在的 range\nfunction getBinKey(value: number, binWidth: number, binNumber?: number): [number, number] {\n // 做一点特殊处理\n if (binNumber === 1) {\n return [0, binWidth];\n }\n const index = Math.floor(value / binWidth);\n return [binWidth * index, binWidth * (index + 1)];\n}\n\n// 默认 sturges 转换\nfunction sturges(values: Array): number {\n return Math.ceil(Math.log(values.length) / Math.LN2) + 1;\n}\n/**\n * 对数据进行百分比化\n * @param data\n * @param binField\n * @param binWidth\n * @param binNumber\n * @param stackField\n */\nexport function binHistogram(data: Data, binField: string, binWidth: number, binNumber?: number, stackField?: string) {\n const originData_copy = clone(data);\n\n // 根据 binField 对源数据进行排序\n sortBy(originData_copy, binField);\n\n // 获取源数据 binField 的 range\n const values = valuesOfKey(originData_copy, binField);\n const range = getRange(values);\n const rangeWidth = range.max - range.min;\n\n // 计算分箱,直方图分箱的计算基于 binWidth,如配置了 binNumber 则将其转为 binWidth 进行计算\n let _binWidth = binWidth;\n if (!binWidth && binNumber) {\n _binWidth = binNumber > 1 ? rangeWidth / (binNumber - 1) : range.max;\n }\n // 当 binWidth 和 binNumber 都没有指定的情况,采用 Sturges formula 自动生成 binWidth\n if (!binWidth && !binNumber) {\n const _defaultBinNumber = sturges(values);\n _binWidth = rangeWidth / _defaultBinNumber;\n }\n // 构建 key - StatisticData 结构\n const bins: StatisticBin = {};\n const groups = groupBy(originData_copy, stackField);\n // 判断分组是否为空,如果为空,说明没有 stackField 字段\n if (isEmpty(groups)) {\n each(originData_copy, (data: any) => {\n const value = data[binField];\n const bin = getBinKey(value, _binWidth, binNumber);\n const binKey = `${bin[0]}-${bin[1]}`;\n if (!hasKey(bins, binKey)) {\n bins[binKey] = { range: bin, count: 0 };\n }\n bins[binKey].count += 1;\n });\n } else {\n Object.keys(groups).forEach((groupKey: string) => {\n each(groups[groupKey], (data: any) => {\n const value = data[binField];\n const bin = getBinKey(value, _binWidth, binNumber);\n const binKey = `${bin[0]}-${bin[1]}`;\n const groupKeyBinKey = `${binKey}-${groupKey}`;\n if (!hasKey(bins, groupKeyBinKey)) {\n bins[groupKeyBinKey] = { range: bin, count: 0 };\n bins[groupKeyBinKey][stackField] = groupKey;\n }\n bins[groupKeyBinKey].count += 1;\n });\n });\n }\n // 将分箱数据转换为 plotData 才是图表所需要的\n const plotData: Array = [];\n each(bins, (bin: StatisticData) => {\n plotData.push(bin);\n });\n return plotData;\n}\n"]}