RadChartView: Axes

RadCartesianChartView plots data points in a coordinate system defined by its two axes. Usually, one data point has category and value, which define its Cartesian coordinates. This means that your chart will need one axis that can visualize the category and another which can visualize the value. CartesianAxis is the base class for all axes that RadCartesianChartView can plot.

Category axes

The axes that can be used to visualize the category of a data point are:

Value axes

The axes that can be used to visualize the value of a data point extend the NumericalAxis class. They are:

Features

Each axis several important properties that developers can use to customize their axis as required. These properties can be either visual or functional. Here is a list of all properties that can be set on an Axis object: LabelFont LabelMargin LabelTextColor LabelFontStyle LabelSize LabelValueToStringConverter LabelRotationAngle LastLabelVisibility LabelFormat MajorTickOffset LabelOffset ShowLabels LabelFitMode LabelLayoutMode TickThickness TickColor LabelInterval LabelRenderer

Below is a description with examples of several properties which accept complex objects instead of simple values.

LabelValueToStringConverter

This is an interface that can be used to convert the actual label to value to an arbitrary string before rendering.

    LinearAxis axis = new LinearAxis();
    axis.setLabelValueToStringConverter(new Function<Object, String>() {
        @Override
        public String apply(Object argument) {
            Double labelValue = ((MajorTickModel)argument).value();
            // Insert formatting logic here.
            String format = "Value is: %s";
            return String.format(format, labelValue);
        }
    });
    LinearAxis verticalAxis = new LinearAxis();
    verticalAxis.LabelValueToStringConverter = new LabelValueConverter();

    private class LabelValueConverter : Java.Lang.Object, IFunction
    {
        public Java.Lang.Object Apply(Java.Lang.Object argument)
        {
            double labelValue = (argument.JavaCast<MajorTickModel>()).Value();
            String format = "Value is: {0}";
            return String.Format(format, labelValue);
        }
    }

LabelRenderer

An interface that allows developers to swap the label rendering with their own implementation.

    public class MyLabelRenderer extends CartesianAxisLabelRenderer {
        public MyLabelRenderer(CartesianAxis axis) {
            super(axis);
        }

        @Override
        protected void renderLabelNoFitMode(Canvas canvas, RadRect layoutSlot, String labelContent, AxisLabelModel labelModel) {
            // Draw something only when label fit mode is NONE
            Paint pink = new Paint();
            pink.setColor(Color.parseColor("#ff69b4"));
            canvas.drawRect(Util.convertToRectF(layoutSlot), pink);
            super.renderLabelNoFitMode(canvas, layoutSlot, labelContent, labelModel);
        }

        @Override
        protected void renderLabelMultiLine(Canvas canvas, RadRect layoutSlot, String labelContent, AxisLabelModel labelModel) {
            // Draw something only when label fit mode is MULTILINE
            Paint khaki = new Paint();
            khaki.setColor(Color.parseColor("#F0E68C"));
            canvas.drawRect(Util.convertToRectF(layoutSlot), khaki);
            super.renderLabelMultiLine(canvas, layoutSlot, labelContent, labelModel);
        }

        @Override
        protected void renderLabelRotate(Canvas canvas, RadRect layoutSlot, String labelContent, AxisLabelModel labelModel) {
            // Draw something only when label fit mode is ROTATE
            Paint moccasin = new Paint();
            moccasin.setColor(Color.parseColor("#ffe4b5"));
            canvas.drawRect(Util.convertToRectF(layoutSlot), moccasin);
            super.renderLabelRotate(canvas, layoutSlot, labelContent, labelModel);
        }

        @Override
        public void renderLabel(Canvas canvas, ChartNode dataPoint) {
            // Always draw something before the given label is drawn.
            super.renderLabel(canvas, dataPoint);
        }

        @Override
        public RadSize measureLabel(AxisLabelModel label, Object content) {
            // Plug some logic when the label is being measured.
            return super.measureLabel(label, content);
        }
    }
    public class MyLabelRenderer : CartesianAxisLabelRenderer
    {
        public MyLabelRenderer(CartesianAxis axis):base(axis)
        {
        }

        protected override void RenderLabelNoFitMode(Android.Graphics.Canvas canvas,
            RadRect p1, string p2, AxisLabelModel p3)
        {
            // Draw something only when label fit mode is None
            Paint pink = new Paint();
            pink.Color = Color.ParseColor("#ff69b4");
            canvas.DrawRect(new RectF((float)p1.GetX(), (float)p1.GetY(), (float)p1.Right, (float)p1.Bottom), pink);
            base.RenderLabelNoFitMode(canvas, p1, p2, p3);
        }

        protected override void RenderLabelMultiLine(Canvas canvas, RadRect p1, string p2, AxisLabelModel p3)
        {
            // Draw something only when label fit mode is Multiline
            Paint khaki = new Paint();
            khaki.Color = Color.ParseColor("#f0e68c");
            canvas.DrawRect(new RectF((float)p1.GetX(), (float)p1.GetY(), (float)p1.Right, (float)p1.Bottom), khaki);
            base.RenderLabelMultiLine(canvas, p1, p2, p3);
        }

        protected override void RenderLabelRotate(Canvas canvas, RadRect p1, string p2, AxisLabelModel p3)
        {
            // Draw something only when label fit mode is ROTATE
            Paint moccasin = new Paint();
            moccasin.Color = Color.ParseColor("#ffe4b5");
            canvas.DrawRect(new RectF((float)p1.GetX(), (float)p1.GetY(), (float)p1.Right, (float)p1.Bottom), moccasin);
            base.RenderLabelRotate(canvas, p1, p2, p3);
        }

        public override void RenderLabel(Canvas p0, ChartNode p1)
        {
            // Always draw something before the given label is drawn.
            base.RenderLabel(p0, p1);
        }

        public override Com.Telerik.Android.Common.Math.RadSize MeasureLabel(AxisLabelModel p0, Java.Lang.Object p1)
        {
            // Plug some logic when the label is being measured.
            return base.MeasureLabel(p0, p1);
        }
    }

Finally, developers can use this custom label renderer by calling axis.setLabelRenderer(new MyLabelRenderer(axis)) or axis.LabelRenderer = new MyLabelRenderer(axis); for Xamarin.