in packages/charts/src/chart_types/xy_chart/domains/y_domain.ts [53:115]
function mergeYDomainForGroup(
stacked: DataSeries[],
nonStacked: DataSeries[],
annotationYValueMap: Map<GroupId, number[]>,
hasZeroBaselineSpecs: boolean,
yScaleConfig: ScaleConfigs['y'],
): YDomain | null {
const dataSeries = stacked.concat(nonStacked);
if (!dataSeries[0]) return null;
const [{ isStacked, stackMode, spec }] = dataSeries;
const groupId = getSpecDomainGroupId(spec);
const scaleConfig = yScaleConfig[groupId];
if (!scaleConfig) return null;
const { customDomain, type, nice, desiredTickCount } = scaleConfig;
const newCustomDomain: YDomainRange = customDomain ? { ...customDomain } : { min: NaN, max: NaN };
const { paddingUnit, padding, constrainPadding } = newCustomDomain;
let mergedDomain: ContinuousDomain;
if (isStacked && stackMode === StackMode.Percentage) {
mergedDomain = computeContinuousDataDomain([0, 1], type, customDomain);
} else {
const annotationData = annotationYValueMap.get(groupId) ?? [];
const stackedDomain = computeYDomain(stacked, annotationData, hasZeroBaselineSpecs, type, newCustomDomain);
const nonStackedDomain = computeYDomain(nonStacked, annotationData, hasZeroBaselineSpecs, type, newCustomDomain);
mergedDomain = computeContinuousDataDomain([...stackedDomain, ...nonStackedDomain], type, newCustomDomain);
const [computedDomainMin, computedDomainMax] = mergedDomain;
if (newCustomDomain && Number.isFinite(newCustomDomain.min) && Number.isFinite(newCustomDomain.max)) {
// Don't need to check min > max because this has been validated on axis domain merge
mergedDomain = [newCustomDomain.min, newCustomDomain.max];
} else if (newCustomDomain && Number.isFinite(newCustomDomain.min)) {
if (newCustomDomain.min > computedDomainMax) {
Logger.warn(`custom yDomain for ${groupId} is invalid, custom min is greater than computed max.`);
mergedDomain = [newCustomDomain.min, newCustomDomain.min];
} else {
mergedDomain = [newCustomDomain.min, computedDomainMax];
}
} else if (newCustomDomain && Number.isFinite(newCustomDomain.max)) {
if (computedDomainMin > newCustomDomain.max) {
Logger.warn(`custom yDomain for ${groupId} is invalid, custom max is less than computed max.`);
mergedDomain = [newCustomDomain.max, newCustomDomain.max];
} else {
mergedDomain = [computedDomainMin, newCustomDomain.max];
}
}
}
return {
type,
nice,
isBandScale: false,
groupId,
domain: mergedDomain,
logBase: customDomain?.logBase,
logMinLimit: customDomain?.logMinLimit,
desiredTickCount,
domainPixelPadding: paddingUnit === DomainPaddingUnit.Pixel ? padding : 0,
constrainDomainPadding: constrainPadding,
};
}