Hello,
I have a chart which display will should display timeserie data which could vary from a few point to hunderds. And of course the chart could be resized. In some this end up in an unreadable chart with too much tick label (or not enough).
It will be great if the chartview control could be able to update automatically the MajorTickInterval to prevent this. Just like the chart in Excel !
I attach two screenshot (one of the ChartView, one of Excel) to illustrate.
5 Answers, 1 is accepted
Thank you for writing.
Indeed, the label interval is not automatically adjusted depending on the available space. You can, however, achieve a similar result as the one required by calculating the interval depending on the viewport`s width. Please check my code snippet below:
public partial class Form1 : Form{ private int step = 100; public Form1() { InitializeComponent(); LineSeries lineSeries = new LineSeries(); Random r = new Random(); for (int i = 0; i < 100; i++) { lineSeries.DataPoints.Add(new CategoricalDataPoint(i * r.Next(100), DateTime.Now.AddDays(i))); } DateTimeContinuousAxis continuousAxis = new DateTimeContinuousAxis(); continuousAxis.PlotMode = AxisPlotMode.OnTicksPadded; continuousAxis.LabelFitMode = AxisLabelFitMode.Rotate; continuousAxis.LabelInterval = 8; continuousAxis.LabelRotationAngle = 90; lineSeries.HorizontalAxis = continuousAxis; this.radChartView1.Series.Add(lineSeries); this.radChartView1.SizeChanged += radChartView1_SizeChanged; } private void radChartView1_SizeChanged(object sender, EventArgs e) { DateTimeContinuousAxis axis = radChartView1.Axes[0] as DateTimeContinuousAxis; int diff = (int)radChartView1.View.Viewport.Width - this.step; if (diff > 100 && axis.LabelInterval > 1) { axis.LabelInterval -= 1; this.step = (int)radChartView1.View.Viewport.Width; } else if (diff < -100) { axis.LabelInterval += 1; this.step = (int)radChartView1.View.Viewport.Width; } }}I am also sending you a short video showing the result on my end.
I hope this helps. Should you have further questions please do not hesitate to write back.
Regards,
Hristo Merdjanov
Telerik by Progress
Hi Hristo,
Thank you for answering.
Sorry for my late answer, I was a little busy on other priorities.
Now I understand that I have to go on with the viewport.width (which I should translate in the number of label I could display) and the range of my axis value (total interval) to calculate the value of the labelInterval.
I'm not a great fan of the sample provided, because it won't handle well the maximize/minimize of a windows but it is perfect to understand the concept :-)
Thank you for writing back.
Indeed that is the idea. The interval needs to be calculated according to the width and the available data points along your axis. The example I sent you handles a situation in which the chart is resized with a step of 100 pixels. In order to handle the maximized form state, you would need to assign a smaller label interval. You can calculate it this way:
private void radChartView1_SizeChanged(object sender, EventArgs e){ DateTimeContinuousAxis axis = radChartView1.Axes[0] as DateTimeContinuousAxis; int diff = (int)radChartView1.View.Viewport.Width - this.step; if (diff > 100 && axis.LabelInterval > 1) { int interval = axis.LabelInterval - diff/100; axis.LabelInterval = interval > 1 ? interval : 1; this.step = (int)radChartView1.View.Viewport.Width; }}I hope this helps. Please let me know if you need further assistance.
Regards,
Hristo Merdjanov
Telerik by Progress
Thanks for the update,
I was written the following before I read your message.
It's actually looking fine too, so I share the result here and go to next point of my TODO list.
Thanks a lot for your support !
Private chartviewlabelspacing As Integer = 40 Private Sub Base100ChartView_SizeChanged(sender As System.Object, e As System.EventArgs) Handles Base100ChartView.SizeChanged Dim labelcount As Integer = Me.Base100ChartView.View.Viewport.Width / Me.chartviewlabelspacing Dim EDate As Date = Me.Base100ChartView.Series(0).DataPoints.Cast(Of Telerik.Charting.CategoricalDataPoint).Select(Function(c) c.Category).Cast(Of Date).DefaultIfEmpty().Min Dim LDate As Date = Me.Base100ChartView.Series(0).DataPoints.Cast(Of Telerik.Charting.CategoricalDataPoint).Select(Function(c) c.Category).Cast(Of Date).DefaultIfEmpty().Max Dim monthCount As Integer = (LDate.Year - EDate.Year) * 12 + LDate.Month - EDate.Month Dim axisX As DateTimeCategoricalAxis = CType(Me.Base100ChartView.Axes(0), DateTimeCategoricalAxis) Dim labelInterval As Integer = monthCount / labelcount axisX.MajorTickInterval = If(labelInterval < 1, 1, labelInterval) End SubI am glad that you have achieved the desired result with respect to your actual project and scenario. Thank you also for sharing your solution with the community.
Please let me know if you need further assistance.
Regards,
Hristo Merdjanov
Telerik by Progress
