normalize method
Convert a raw data value to 0..1 normalised.
For AxisScaleType.log, values ≤ 0 are clamped to a tiny positive.
Implementation
double normalize(double value, double dataMin, double dataMax) {
final lo = _finite(min ?? dataMin, 0);
final hi = _finite(max ?? dataMax, lo);
if (!value.isFinite) return 0.5;
if (hi == lo) return 0.5;
switch (scaleType) {
case AxisScaleType.linear:
case AxisScaleType.time:
case AxisScaleType.percent:
return _unitInterval((value - lo) / (hi - lo));
case AxisScaleType.log:
final safeBase = _safeLogBase(logBase);
final logLo =
math.log(lo.clamp(1e-10, double.infinity)) / math.log(safeBase);
final logHi =
math.log(hi.clamp(1e-10, double.infinity)) / math.log(safeBase);
final logV =
math.log(value.clamp(1e-10, double.infinity)) / math.log(safeBase);
if (logHi == logLo) return 0.5;
return _unitInterval((logV - logLo) / (logHi - logLo));
case AxisScaleType.category:
final cats = categories ?? const [];
if (cats.isEmpty) return 0;
if (cats.length == 1) return 0.5;
final idx = value.round().clamp(0, cats.length - 1);
return idx / (cats.length - 1);
}
}