Auto scale Y axis when X axis is zoomed
12 Jul 20227 minutes to read
The auto scale of y-axis when the x-axis is zoomed can be achieved by the following steps:
- Get the start and end value of the visible range of X axis.
- Filter out the point’s collection using the RecordFilters and get the points within that range.
- Get the maximum and minimum value of Y axis.
- Change the range of the Y axis with the interval.
The following code example must be given under the VisibleRangeChanged event.
void chartControl1_VisibleRangeChanged(object sender, EventArgs e)
{
MinMaxInfo xInfo = chartControl1.PrimaryXAxis.VisibleRange;
double max = double.MinValue;
double min = double.MaxValue;
bool toChange = false;
double start = 0;
double end = 0;
// 1. Get the Start and End value of the visible range of X axis.
start = xInfo.Min + xInfo.Interval;
end = xInfo.Max + xInfo.Interval;
//2. Filter out the point’s collection using the Record filter and get the points with in that range.
GetVisiblePoints(start, end,ref max,ref min,ref toChange);
// 4. Change the range of the Y axis with the interval.
double steps = (max-min)/5;
if (toChange)
{
m_Min = min - steps;
m_Max = max + steps;
chartControl1.PrimaryYAxis.Range = new MinMaxInfo(m_Min, m_Max, steps);
chartControl1.ZoomFactorY = 1;
}
}
private void GetVisiblePoints(double start, double end, ref double max, ref double min, ref bool toChange)
{
ChartPointIndexer points = this.chartControl1.Series[0].Points;
Engine group = new Engine();
group.SetSourceList(points);
RecordFilterDescriptor rfd = new RecordFilterDescriptor("X",FilterLogicalOperator.And,new FilterCondition[]{new FilterCondition(FilterCompareOperator.GreaterThanOrEqualTo,start),new FilterCondition(FilterCompareOperator.LessThanOrEqualTo ,end)});
// add the record filter to group engine
group.TableDescriptor.RecordFilters.Add(rfd);
// 3. Get the maximum and minimum value of Y.
foreach (Record rec in group.Table.FilteredRecords)
{
toChange = true;
double[] yvalues = (double[])rec["YValues"];
max = yvalues[0] > max ? yvalues[0] : max;
min = yvalues[0] < min ? yvalues[0] : min;
}
}
Private Sub chartControl1_VisibleRangeChanged(ByVal sender As Object, ByVal e As EventArgs)
Dim xInfo As MinMaxInfo = chartControl1.PrimaryXAxis.VisibleRange
Dim max As Double = Double.MinValue
Dim min As Double = Double.MaxValue
Dim toChange As Boolean = False
Dim start As Double = 0
Dim [end] As Double = 0
' 1. Get the Start and End value of the visible range of X axis.
start = xInfo.Min + xInfo.Interval
[end] = xInfo.Max + xInfo.Interval
'2. Filter out the point’s collection using the Record filter and get the points within that range.
GetVisiblePoints(start, [end],max,min,toChange)
' 4. Change the range of the Y axis with the interval.
Dim steps As Double = (max-min)/5
If toChange Then
m_Min = min - steps
m_Max = max + steps
chartControl1.PrimaryYAxis.Range = New MinMaxInfo(m_Min, m_Max, steps)
chartControl1.ZoomFactorY = 1
End If
End Sub
Private Sub GetVisiblePoints(ByVal start As Double, ByVal [end] As Double, ByRef max As Double, ByRef min As Double, ByRef toChange As Boolean)
Dim points As ChartPointIndexer = Me.chartControl1.Series(0).Points
Dim group As Engine = New Engine()
group.SetSourceList(points)
Dim rfd As RecordFilterDescriptor = New RecordFilterDescriptor("X",FilterLogicalOperator.And,New FilterCondition(){New FilterCondition(FilterCompareOperator.GreaterThanOrEqualTo,start),New FilterCondition(FilterCompareOperator.LessThanOrEqualTo,[end])})
' add the record filter to group engine
group.TableDescriptor.RecordFilters.Add(rfd)
' 3. Get the maximum and minimum value of Y.
For Each rec As Record In group.Table.FilteredRecords
toChange = True
Dim yvalues() As Double = CType(rec("YValues"), Double())
max = If(yvalues(0) > max, yvalues(0), max)
min = If(yvalues(0) < min, yvalues(0), min)
Next rec
End Sub