in packages/charts/src/chart_types/xy_chart/state/selectors/visible_ticks.ts [97:184]
direction: getDirection(label),
multilayerTimeAxis,
};
});
}
function getVisibleTicks(
axisSpec: AxisSpec,
labelBox: TickLabelBounds,
totalBarsInCluster: number,
labelFormatter: AxisLabelFormatter,
rotationOffset: number,
scale: ScaleBand | ScaleContinuous,
enableHistogramMode: boolean,
layer: number | undefined,
detailedLayer: number,
ticks: (number | string)[],
multilayerTimeAxis: boolean = false,
showGrid = true,
): AxisTick[] {
const isSingleValueScale = scale.domain[0] === scale.domain[1];
const makeRaster = enableHistogramMode && scale.bandwidth > 0 && !multilayerTimeAxis;
const ultimateTick = ticks.at(-1);
const penultimateTick = ticks.at(-2);
if (makeRaster && !isSingleValueScale && typeof penultimateTick === 'number' && typeof ultimateTick === 'number') {
const computedTickDistance = ultimateTick - penultimateTick;
const numTicks = scale.minInterval / (computedTickDistance || scale.minInterval); // avoid infinite loop
for (let i = 1; i <= numTicks; i++) ticks.push(i * computedTickDistance + ultimateTick);
}
const shift = totalBarsInCluster > 0 ? totalBarsInCluster : 1;
const band = scale.bandwidth / (1 - scale.barsPadding);
const halfPadding = (band - scale.bandwidth) / 2;
const offset =
(enableHistogramMode ? -halfPadding : (scale.bandwidth * shift) / 2) + (scale.isSingleValue() ? 0 : rotationOffset);
const firstTickValue = ticks[0];
const allTicks: AxisTick[] =
makeRaster && isSingleValueScale && typeof firstTickValue === 'number'
? [
{
value: firstTickValue,
domainClampedValue: firstTickValue,
label: labelFormatter(firstTickValue),
position: (scale.scale(firstTickValue) || 0) + offset,
domainClampedPosition: (scale.scale(firstTickValue) || 0) + offset,
layer: undefined, // no multiple layers with `singleValueScale`s
detailedLayer: 0,
direction: 'rtl',
showGrid,
multilayerTimeAxis,
},
{
value: firstTickValue + scale.minInterval,
domainClampedValue: firstTickValue + scale.minInterval,
label: labelFormatter(firstTickValue + scale.minInterval),
position: scale.bandwidth + halfPadding * 2,
domainClampedPosition: scale.bandwidth + halfPadding * 2,
layer: undefined, // no multiple layers with `singleValueScale`s
detailedLayer: 0,
direction: 'rtl',
showGrid,
multilayerTimeAxis,
},
]
: generateTicks(
axisSpec,
scale,
ticks,
offset,
labelFormatter,
layer,
detailedLayer,
showGrid,
multilayerTimeAxis,
);
const { showOverlappingTicks, showOverlappingLabels, position } = axisSpec;
const requiredSpace = isVerticalAxis(position) ? labelBox.maxLabelBboxHeight / 2 : labelBox.maxLabelBboxWidth / 2;
const bypassOverlapCheck = showOverlappingLabels || multilayerTimeAxis;
return bypassOverlapCheck
? allTicks
: allTicks
.slice()
.sort((a: AxisTick, b: AxisTick) => a.position - b.position)
.reduce(
(prev, tick) => {
const tickLabelFits = tick.position >= prev.occupiedSpace + requiredSpace;
if (tickLabelFits || showOverlappingTicks) {