vega-lite
Version:
Vega-Lite is a concise high-level language for interactive visualization.
35 lines (30 loc) • 1.16 kB
text/typescript
import {VgValueRef} from '../../../vega.schema.js';
import {ScaleComponent} from '../../scale/component.js';
export interface ScaledZeroOrMinOrMaxProps {
scaleName: string;
scale: ScaleComponent;
mode: 'zeroOrMin' | {zeroOrMax: {widthSignal: string; heightSignal: string}};
}
export function scaledZeroOrMinOrMax({scaleName, scale, mode}: ScaledZeroOrMinOrMaxProps): VgValueRef | undefined {
const domain = `domain('${scaleName}')`;
if (!scale || !scaleName) {
return undefined;
}
const min = `${domain}[0]`;
const max = `peek(${domain})`; // peek = the last item of the array
// If there is a scale (and hence its name)
const domainHasZero = scale.domainHasZero();
// zeroOrMin or zeroOrMax mode
if (domainHasZero === 'definitely') {
return {
scale: scaleName,
value: 0,
};
} else if (domainHasZero === 'maybe') {
const nonZeroValue = mode === 'zeroOrMin' ? min : max;
return {signal: `scale('${scaleName}', inrange(0, ${domain}) ? 0 : ${nonZeroValue})`};
} else {
// domainHasZero === 'definitely-not'
return {signal: `scale('${scaleName}', ${mode === 'zeroOrMin' ? min : max})`};
}
}