mirror of
https://github.com/grafana/grafana.git
synced 2025-02-25 18:55:37 -06:00
TimeSeries: clamp log-y-axis min to 1 when decimals=0 (#55882)
This commit is contained in:
@@ -98,6 +98,8 @@ export class UPlotScaleBuilder extends PlotConfigBuilder<ScaleProps, Scale> {
|
||||
return minMax;
|
||||
}
|
||||
|
||||
let logBase = scale.log ?? 10;
|
||||
|
||||
if (scale.distr === 1 || scale.distr === 2 || scale.distr === 4) {
|
||||
if (centeredZero) {
|
||||
let absMin = Math.abs(dataMin!);
|
||||
@@ -110,18 +112,48 @@ export class UPlotScaleBuilder extends PlotConfigBuilder<ScaleProps, Scale> {
|
||||
if (scale.distr === 4) {
|
||||
// TODO: switch to `, true)` after updating uPlot to 1.6.23+
|
||||
// see https://github.com/leeoniya/uPlot/issues/749
|
||||
minMax = uPlot.rangeAsinh(dataMin!, dataMax!, scale.log ?? 10, false);
|
||||
minMax = uPlot.rangeAsinh(dataMin!, dataMax!, logBase, false);
|
||||
} else {
|
||||
// @ts-ignore here we may use hardMin / hardMax to make sure any extra padding is computed from a more accurate delta
|
||||
minMax = uPlot.rangeNum(hardMinOnly ? hardMin : dataMin, hardMaxOnly ? hardMax : dataMax, rangeConfig);
|
||||
}
|
||||
} else if (scale.distr === 3) {
|
||||
minMax = uPlot.rangeLog(dataMin!, dataMax!, scale.log ?? 10, true);
|
||||
minMax = uPlot.rangeLog(dataMin!, dataMax!, logBase, true);
|
||||
}
|
||||
|
||||
if (decimals === 0) {
|
||||
minMax[0] = incrRoundDn(minMax[0]!, 1);
|
||||
minMax[1] = incrRoundUp(minMax[1]!, 1);
|
||||
if (scale.distr === 1 || scale.distr === 2) {
|
||||
minMax[0] = incrRoundDn(minMax[0]!, 1);
|
||||
minMax[1] = incrRoundUp(minMax[1]!, 1);
|
||||
}
|
||||
// log2 or log10 scale min must be clamped to 1
|
||||
else if (scale.distr === 3) {
|
||||
let logFn = scale.log === 2 ? Math.log2 : Math.log10;
|
||||
|
||||
if (minMax[0]! <= 1) {
|
||||
// clamp min
|
||||
minMax[0] = 1;
|
||||
} else {
|
||||
// snap min to nearest mag below
|
||||
let minExp = Math.floor(logFn(minMax[0]!));
|
||||
minMax[0] = logBase ** minExp;
|
||||
}
|
||||
|
||||
// snap max to nearest mag above
|
||||
let maxExp = Math.ceil(logFn(minMax[1]!));
|
||||
minMax[1] = logBase ** maxExp;
|
||||
|
||||
// inflate max by mag if same
|
||||
if (minMax[0] === minMax[1]) {
|
||||
minMax[1] *= logBase;
|
||||
}
|
||||
}
|
||||
// TODO: this should be better. symlog values can be <= 0, but should also be snapped to log2 or log10 boundaries
|
||||
// for now we just do same as linear snapping above, so may have non-neat range and ticks at edges
|
||||
else if (scale.distr === 4) {
|
||||
minMax[0] = incrRoundDn(minMax[0]!, 1);
|
||||
minMax[1] = incrRoundUp(minMax[1]!, 1);
|
||||
}
|
||||
}
|
||||
|
||||
// if all we got were hard limits, treat them as static min/max
|
||||
@@ -135,7 +167,7 @@ export class UPlotScaleBuilder extends PlotConfigBuilder<ScaleProps, Scale> {
|
||||
|
||||
// guard against invalid y ranges
|
||||
if (minMax[0]! >= minMax[1]!) {
|
||||
minMax[0] = 0;
|
||||
minMax[0] = scale.distr === 3 ? 1 : 0;
|
||||
minMax[1] = 100;
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user