@data-ui/histogram
Version:
React + d3 library for creating histograms
70 lines (58 loc) • 1.83 kB
JavaScript
;
exports.__esModule = true;
exports.default = computeDomainsFromBins;
var _d3Array = require("d3-array");
var _caseInsensitiveSort = _interopRequireDefault(require("./caseInsensitiveSort"));
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
/*
* Computes the bin and value domains from numeric or categorical bins
*/
function computeDomainsFromBins(_ref) {
var binsByIndex = _ref.binsByIndex,
binType = _ref.binType,
valueKey = _ref.valueKey,
binValues = _ref.binValues;
var binDomain;
var valueDomain;
Object.values(binsByIndex).forEach(function (bins) {
var currValueMax = (0, _d3Array.max)(bins, function (d) {
return d[valueKey];
});
if (valueDomain) {
valueDomain[1] = Math.max(currValueMax, valueDomain[1]);
} else {
valueDomain = [0, currValueMax];
}
if (binType === 'numeric') {
if (binDomain) {
binDomain[0] = Math.min(bins[0].bin0, binDomain[0]);
binDomain[1] = Math.max(bins[bins.length - 1].bin1, binDomain[1]);
} else {
binDomain = [bins[0].bin0, bins[bins.length - 1].bin1];
}
} else {
if (!binDomain) binDomain = {}; // use lookup to avoid lots of Array scans
bins.forEach(function (bin) {
binDomain[bin.bin] = true;
});
}
});
if (Array.isArray(binValues)) {
var providedBinsCoverDomain = true;
binValues.forEach(function (binValue) {
if (!(binValue in binDomain)) {
providedBinsCoverDomain = false;
}
});
if (providedBinsCoverDomain) {
binDomain = binValues;
}
}
if (!Array.isArray(binDomain)) {
binDomain = Object.keys(binDomain).sort(_caseInsensitiveSort.default);
}
return {
binDomain: binDomain,
valueDomain: valueDomain
};
}