diff --git a/lib/src/chart/radar_chart/radar_chart_data.dart b/lib/src/chart/radar_chart/radar_chart_data.dart index 02664dd7b..665a0cb0d 100644 --- a/lib/src/chart/radar_chart/radar_chart_data.dart +++ b/lib/src/chart/radar_chart/radar_chart_data.dart @@ -70,6 +70,7 @@ class RadarChartData extends BaseChartData with EquatableMixin { BorderSide? tickBorderData, BorderSide? gridBorderData, RadarTouchData? radarTouchData, + this.isMinValueAtCenter = false, super.borderData, }) : assert(dataSets != null && dataSets.hasEqualDataEntriesLength), assert( @@ -154,6 +155,9 @@ class RadarChartData extends BaseChartData with EquatableMixin { /// Handles touch behaviors and responses. final RadarTouchData radarTouchData; + /// If [isMinValueAtCenter] is true, the minimum value of the [RadarChart] will be at the center of the chart. + final bool isMinValueAtCenter; + /// [titleCount] we use this value to determine number of [RadarChart] grid or lines. int get titleCount => dataSets[0].dataEntries.length; diff --git a/lib/src/chart/radar_chart/radar_chart_painter.dart b/lib/src/chart/radar_chart/radar_chart_painter.dart index 3c2e5ac9e..2dcce4d3e 100644 --- a/lib/src/chart/radar_chart/radar_chart_painter.dart +++ b/lib/src/chart/radar_chart/radar_chart_painter.dart @@ -76,6 +76,11 @@ class RadarChartPainter extends BaseChartPainter { double getChartCenterValue(RadarChartData data) { final dataSetMaxValue = data.maxEntry.value; final dataSetMinValue = data.minEntry.value; + + if (data.isMinValueAtCenter) { + return dataSetMinValue; + } + final tickSpace = getSpaceBetweenTicks(data); final centerValue = dataSetMinValue - tickSpace; @@ -100,6 +105,10 @@ class RadarChartPainter extends BaseChartPainter { @visibleForTesting double getFirstTickValue(RadarChartData data) { final defaultCenterValue = getDefaultChartCenterValue(); + if (data.isMinValueAtCenter) { + return defaultCenterValue; + } + final dataSetMaxValue = data.maxEntry.value; final dataSetMinValue = data.minEntry.value; @@ -111,9 +120,14 @@ class RadarChartPainter extends BaseChartPainter { @visibleForTesting double getSpaceBetweenTicks(RadarChartData data) { - final defaultCenterValue = getDefaultChartCenterValue(); final dataSetMaxValue = data.maxEntry.value; final dataSetMinValue = data.minEntry.value; + + if (data.isMinValueAtCenter) { + return (dataSetMaxValue - dataSetMinValue) / (data.tickCount); + } + + final defaultCenterValue = getDefaultChartCenterValue(); final tickSpace = (dataSetMaxValue - dataSetMinValue) / data.tickCount; final defaultTickSpace = (dataSetMaxValue - defaultCenterValue) / (data.tickCount + 1); @@ -171,7 +185,9 @@ class RadarChartPainter extends BaseChartPainter { tickValue += tickSpace; } - final tickDistance = radius / (ticks.length); + final tickDistance = data.isMinValueAtCenter + ? radius / (ticks.length - 1) + : radius / ticks.length; _tickPaint ..color = data.tickBorderData.color @@ -180,7 +196,8 @@ class RadarChartPainter extends BaseChartPainter { /// draw radar ticks ticks.sublist(0, ticks.length - 1).asMap().forEach( (index, tick) { - final tickRadius = tickDistance * (index + 1); + final tickRadius = + tickDistance * (index + (data.isMinValueAtCenter ? 0 : 1)); if (data.radarShape == RadarShape.circle) { canvasWrapper.drawCircle(centerOffset, tickRadius, _tickPaint); } else { diff --git a/repo_files/documentations/radar_chart.md b/repo_files/documentations/radar_chart.md index 7a9972488..64c5d2cd2 100644 --- a/repo_files/documentations/radar_chart.md +++ b/repo_files/documentations/radar_chart.md @@ -31,6 +31,7 @@ When you change the chart's state, it animates to the new state internally (usin |tickBorderData|Style of the tick borders|BorderSide(color: Colors.black, width: 2)| |gridBorderData|Style of the grid borders|BorderSide(color: Colors.black, width: 2)| |radarTouchData|[RadarTouchData](#radartouchdata-read-about-touch-handling) handles the touch behaviors and responses.|RadarTouchData()| +|isMinValueAtCenter|If true, the minimum value of the [RadarChart] will be at the center of the chart.|false| ### RadarDataSet |PropName |Description |default value|