How to add a logarithmic axis scale in Flutter SfRadialGauge?
Description
This article describes how to add a logarithmic axis in Flutter radial gauge.
Solution
You can create a logarithmic axis in radial gauge widget by extending a custom axis renderer class from radial axis renderer class.
Step 1: Create a custom axis renderer class by extending it from radial axis renderer.
class _CustomAxisRenderer extends RadialAxisRenderer {
  _CustomAxisRenderer() : super();
}
 Step 2: Change the text value of the labels to required logarithmic visible labels by overriding the generateVisibleLabels  method.
@override
  List<CircularAxisLabel> generateVisibleLabels() {
    final List<CircularAxisLabel> _visibleLabels = <CircularAxisLabel>[];
    num _minimum = _logBase(minimum, 10);
    num _maximum = _logBase(maximum, 10);
    for (num i = _minimum; i <= _maximum; i++) {
      final int _value = math.pow(10, i).floor(); // logBase  value is 10
      final CircularAxisLabel label = CircularAxisLabel(
          axisLabelStyle, _value.toInt().toString(), i, false);
      label.value = _value;
      _visibleLabels.add(label);
    }
 
    _labelsCount = _visibleLabels.length;
    return _visibleLabels;
  }
// To convert the log value into linear value num _logBase(num value, num base) => math.log(value) / math.log(base);
Step 3: To find the factor values based on the respective logarithmic value, override the valueToFactor method of custom axis renderer and implement the logics for converting the values.
@override
  double valueToFactor(double value) {
    double _number = _logBase(value, 10) / (_labelsCount - 1); 
    return _number;
  }
Step 4: Create the radial gauge and add the custom axis with desired range.
@override
  Widget build(BuildContext context) {
    return Scaffold(
      backgroundColor: Colors.white,
      body: Center(
        child: SfRadialGauge(
          axes: <RadialAxis>[
            CustomAxis(
              minimum: 1, 
              maximum: 10000,
            )
          ],
        ),
      ),
    );
  }
Step 5: Return the custom axis renderer in the onCreateAxisRenderer event of radial axis.
@override
  Widget build(BuildContext context) {
    return Scaffold(
      backgroundColor: Colors.white,
      body: Center(
        child: SfRadialGauge(
          axes: <RadialAxis>[
            CustomAxis(
              minimum: 1, 
              maximum: 10000,
              onCreateAxisRenderer: () {
                  final _CustomAxisRenderer renderer = _CustomAxisRenderer();
                  return renderer;
               },
            )
          ],
        ),
      ),
    );
  }
Step 6: Include the needle pointer to annotate the desired value.
pointers: <GaugePointer>[NeedlePointer(value: 1000)]
Output
