--- title: Multiple Axes in Xamarin Chart description: how to create multiple horizontal and vertical chart axis type: how-to page_title: Multiple Chart Axes in Xamarin slug: chart-xamarin-multiple-axis position: tags: chart, xamarin, multiple, axis, axes, horizontal, vertical, xamarin.forms ticketid: 1469277 res_type: kb --- ## Environment
Product Version 2020.2.624.1
Product Chart for Xamarin Cross-Platform
## Description This article will show you how to create chart with multiple axis using [Telerik UI for Xamarin RadChart control]({%slug chart-overview%}). ## Solution Scenario with Multiple vertical and/or horizontal chart axis can be achieved using custom renderer. Here is a sample RadCartesianChart definition with Line and Bar Series: ```XAML ``` For the sample project we will use the following business model and ViewModel: ```C# public class CategoricalData { public object Category { get; set; } public double Value { get; set; } public DateTime Time { get; set; } } public class ViewModel { public ViewModel() { this.CategoricalData = GetCategoricalData(); this.CategoricalData2 = GetCategoricalData2(); } public ObservableCollection CategoricalData { get; set; } public ObservableCollection CategoricalData2 { get; set; } public static ObservableCollection GetCategoricalData() { var date = DateTime.Today; var data = new ObservableCollection { new CategoricalData { Category = "A", Value = 0.63, Time = date.AddDays(1) }, new CategoricalData { Category = "B", Value = 0.85, Time = date.AddDays(10)}, new CategoricalData { Category = "C", Value = 0.75, Time = date.AddDays(20)}, new CategoricalData { Category = "D", Value = 0.96, Time = date.AddDays(30)}, new CategoricalData { Category = "E", Value = 0.78, Time = date.AddDays(40)}, }; return data; } public static ObservableCollection GetCategoricalData2() { var date = DateTime.Now; var data = new ObservableCollection { new CategoricalData { Category = "A", Time = date.AddDays(1) , Value = 0.53}, new CategoricalData { Category = "B", Time = date.AddDays(10), Value = 0.65}, new CategoricalData { Category = "C", Time = date.AddDays(20), Value = 0.55}, new CategoricalData { Category = "D", Time = date.AddDays(30), Value = 0.76}, new CategoricalData { Category = "E", Time = date.AddDays(40), Value = 0.58}, }; return data; } } ``` ### Android Custom Renderer: Create a class inside the Android project, for example **CustomChartRenderer** that inherits from **Telerik.XamarinForms.ChartRenderer.Android.CartesianChartRenderer** ```C# public class CustomChartRenderer : Telerik.XamarinForms.ChartRenderer.Android.CartesianChartRenderer { public CustomChartRenderer(Context context) : base(context) { } protected override void OnElementChanged(Xamarin.Forms.Platform.Android.ElementChangedEventArgs e) { base.OnElementChanged(e); var series = this.Control.Series.ToArray(); AddSecondaryHorizontalAxis(series[1]); AddSecondaryVerticalAxis(series[1]); } private void AddSecondaryVerticalAxis(Java.Lang.Object lineSeries) { if (lineSeries is Com.Telerik.Widget.Chart.Visualization.CartesianChart.Series.Categorical.LineSeries) { var series = lineSeries as Com.Telerik.Widget.Chart.Visualization.CartesianChart.Series.Categorical.LineSeries; Com.Telerik.Widget.Chart.Visualization.CartesianChart.Axes.LinearAxis verticalAxisBar = new Com.Telerik.Widget.Chart.Visualization.CartesianChart.Axes.LinearAxis(); verticalAxisBar.HorizontalLocation = Com.Telerik.Widget.Chart.Engine.Axes.Common.AxisHorizontalLocation.Right; series.VerticalAxis = verticalAxisBar; } } private void AddSecondaryHorizontalAxis(Java.Lang.Object lineSeries) { if (lineSeries is Com.Telerik.Widget.Chart.Visualization.CartesianChart.Series.Categorical.LineSeries) { var series = lineSeries as Com.Telerik.Widget.Chart.Visualization.CartesianChart.Series.Categorical.LineSeries; Com.Telerik.Widget.Chart.Visualization.CartesianChart.Axes.DateTimeCategoricalAxis horizontalAXis = new Com.Telerik.Widget.Chart.Visualization.CartesianChart.Axes.DateTimeCategoricalAxis(); horizontalAXis.VerticalLocation = Com.Telerik.Widget.Chart.Engine.Axes.Common.AxisVerticalLocation.Top; series.HorizontalAxis = horizontalAXis; } } } ``` and register the renderer: ```C# [assembly: Xamarin.Forms.ExportRenderer(typeof(Telerik.XamarinForms.Chart.RadCartesianChart), typeof(ChartAxis.Droid.CustomChartRenderer))] ``` ### iOS Custom Renderer: Create a call inside the iOS project, for example **CustomChartRenderer** which inherits from **Telerik.XamarinForms.ChartRenderer.iOS.CartesianChartRenderer** ```C# public class CustomChartRenderer : Telerik.XamarinForms.ChartRenderer.iOS.CartesianChartRenderer { public CustomChartRenderer() { } protected override void UpdateNativeWidget() { base.UpdateNativeWidget(); TelerikUI.TKChartNumericAxis tKChartNumericAxis = new TelerikUI.TKChartNumericAxis(); tKChartNumericAxis.Position = TelerikUI.TKChartAxisPosition.Right; this.Control.AddAxis(tKChartNumericAxis); var lineSeries = this.Control.Series[1] as TelerikUI.TKChartLineSeries; lineSeries.YAxis = tKChartNumericAxis; TelerikUI.TKChartDateTimeAxis dateTimeAxis = new TelerikUI.TKChartDateTimeAxis(); dateTimeAxis.Position = TelerikUI.TKChartAxisPosition.Top; dateTimeAxis.MajorTickInterval = 10; dateTimeAxis.MajorTickIntervalUnit = TelerikUI.TKChartDateTimeAxisIntervalUnit.Days; this.Control.AddAxis(dateTimeAxis); lineSeries.XAxis = dateTimeAxis; } } ``` and register the renderer: ```C# [assembly: Xamarin.Forms.ExportRenderer(typeof(Telerik.XamarinForms.Chart.RadCartesianChart), typeof(ChartAxis.iOS.CustomChartRenderer))] ``` ## See Also - [Android chart Axes Overview]({%slug chart-axes-overview%}) - [iOS chart Axes Overview]({%slug chart-ios-axes-overview%})