Back to Devexpress

INumericMeasureUnitsCalculator.CalculateMeasureUnit(IEnumerable<Series>, Double, Int32, Double, Double, Double, Double) Method

wpf-devexpress-dot-xpf-dot-charts-dot-inumericmeasureunitscalculator-dot-calculatemeasureunit-x28-ienumerable-series-double-int32-double-double-double-double-x29.md

latest6.9 KB
Original Source

INumericMeasureUnitsCalculator.CalculateMeasureUnit(IEnumerable<Series>, Double, Int32, Double, Double, Double, Double) Method

Calculates the numeric measurement unit that an axis should use for display.

Namespace : DevExpress.Xpf.Charts

Assembly : DevExpress.Xpf.Charts.v25.2.dll

NuGet Package : DevExpress.Wpf.Charts

Declaration

csharp
double CalculateMeasureUnit(
    IEnumerable<Series> series,
    double axisLength,
    int pixelsPerUnit,
    double visualMin,
    double visualMax,
    double wholeMin,
    double wholeMax
)
vb
Function CalculateMeasureUnit(
    series As IEnumerable(Of Series),
    axisLength As Double,
    pixelsPerUnit As Integer,
    visualMin As Double,
    visualMax As Double,
    wholeMin As Double,
    wholeMax As Double
) As Double

Parameters

NameTypeDescription
seriesIEnumerable<Series>

All Series associated with the axis.

| | axisLength | Double |

The length of the axis’s current visual range in pixels.

| | pixelsPerUnit | Int32 |

The minimum count of pixels that series require to draw their points correctly.

| | visualMin | Double |

The visual range’s minimum value.

| | visualMax | Double |

The visual range’s maximum value.

| | wholeMin | Double |

The whole range’s minimum value.

| | wholeMax | Double |

The whole range’s maximum value.

|

Returns

TypeDescription
Double

The calculated measurement unit.

|

Remarks

For example, bars can overlap each other if the calculated measurement unit covers fewer pixels on the axis than the pixelPerUnit parameter specifies.

Example

The automatic numeric scale options provide the capability to use a custom measurement unit calculator to determine the current measurement unit if the predefined one does not fit your requirements. Design a class that implements the INumericMeasureUnitsCalculator interface and assign it to the AutomaticNumericScaleOptions.AutomaticMeasureUnitsCalculator property to use a custom measurement units calculation algorithm:

csharp
public class CustomAutomaticNumericMeasureUnitsCalculator : INumericMeasureUnitsCalculator {
    public double CalculateMeasureUnit(
        IEnumerable<Series> series, 
        double axisLength, int pixelsPerUnit, 
        double visualMin, double visualMax, 
        double wholeMin, double wholeMax
    ) {
        double rawMeasureUnit = (visualMax - visualMin) * pixelsPerUnit / axisLength;
        return Math.Pow(10, GetDigitCount((int)Math.Abs(rawMeasureUnit)));
    }

    private static readonly int[] valueStops = {
        9, 99, 999, 9999, 99999, 999999, 9999999,
        99999999, 999999999, Int32.MaxValue
    };
    private static int GetDigitCount(int value) {
        for (int i = 0; ; i++)
            if (value <= valueStops[i])
                return i + 1;
    }
}
vb
Class CustomAutomaticNumericMeasureUnitsCalculator
    Implements INumericMeasureUnitsCalculator
    Public Function CalculateMeasureUnit(
        series As IEnumerable(Of Series),
        axisLength As Double, pixelsPerUnit As Integer,
        visualMin As Double, visualMax As Double,
        wholeMin As Double, wholeMax As Double
    ) As Double Implements INumericMeasureUnitsCalculator.CalculateMeasureUnit
        Dim rawMeasureUnit = (visualMax - visualMin) * pixelsPerUnit / axisLength
        Return Math.Pow(10, GetDigitCount(CType(Math.Abs(rawMeasureUnit), Integer)))
    End Function

    Private Shared ReadOnly valueStops As Integer() = {
            9, 99, 999, 9999, 99999, 999999, 9999999,
            99999999, 999999999, Int32.MaxValue
    }
    Private Shared Function GetDigitCount(value As Integer) As Integer
        For i As Integer = 0 To valueStops.Length
            If (value <= valueStops(i)) Then Return i + 1
        Next
    End Function
End Class
xaml
<dxc:ChartControl>
    <dxc:XYDiagram2D>
        <dxc:XYDiagram2D.AxisX>
            <dxc:AxisX2D>
                <dxc:AxisX2D.NumericScaleOptions>
                    <dxc:AutomaticNumericScaleOptions>
                        <dxc:AutomaticNumericScaleOptions.AutomaticMeasureUnitsCalculator>
                            <view:CustomAutomaticNumericMeasureUnitsCalculator/>
                        </dxc:AutomaticNumericScaleOptions.AutomaticMeasureUnitsCalculator>
                    </dxc:AutomaticNumericScaleOptions>
                </dxc:AxisX2D.NumericScaleOptions>
            </dxc:AxisX2D>
        </dxc:XYDiagram2D.AxisX>
    </dxc:XYDiagram2D>
</dxc:ChartControl>

See Also

INumericMeasureUnitsCalculator Interface

INumericMeasureUnitsCalculator Members

DevExpress.Xpf.Charts Namespace