Scale Y-Axis of a Chart depending on the Values within a section of X-Values for several Series
axis, c#, charts, scaling, winforms
Solution
This will scale the Y-Axis to the Minimum and Maximum values between the Minimum and Maximum values[0] of the X-Axis for all series from 0 to 1:
double max = Double.MinValue;
double min = Double.MaxValue;
double leftLimit = chart1.ChartAreas[0].AxisX.Minimum;
double rightLimit = chart1.ChartAreas[0].AxisX.Maximum;
for (int s = 0; s <= 1; s++)
{
foreach (DataPoint dp in chart1.Series[s].Points)
{
if (dp.XValue >= leftLimit && dp.XValue <= rightLimit)
{
min = Math.Min(min, dp.YValues[0]);
max = Math.Max(max, dp.YValues[0]);
}
}
}
chart1.ChartAreas[0].AxisY.Maximum = max;
chart1.ChartAreas[0].AxisY.Minimum = min;
Edit: While testing I noticed that resetting the Min&Max Values is not quite obvious. Here is how:
chart1.ChartAreas[0].AxisY.Minimum = Double.NaN;
chart1.ChartAreas[0].AxisY.Maximum = Double.NaN;
chart1.ChartAreas[0].AxisX.Minimum = Double.NaN;
chart1.ChartAreas[0].AxisX.Maximum = Double.NaN;
Problem
I have got an aplication like this: With the textboxes below the chart the user can set the min and max of the X-Axis of the Chart. This is the code for it: ``` private void textBoxXaxisMin_TextChanged(object sender, EventArgs e) { double x; //checks if the input is a double and smaller than the max value //if (Double.TryParse(this.textBoxXaxisMin.Text, out x) && x < chart1.ChartAreas[0].AxisX.Maximum) if (Double.TryParse(this.textBoxXaxisMin.Text, out x)) { this.textBoxXaxisMin.BackColor = Color.White; chart1.ChartAreas[0].AxisX.Minimum = Convert.ToDouble(this.textBoxXaxisMin.Text); //changeYScalaMin(chartCharacteristicCurvesThermoelemts, Convert.ToDouble(this.textBoxCharacteristicCurvesThermoelementXmin.Text), Convert.ToDouble(this.textBoxCharacteristicCurvesThermoelementXmax.Text)); //method to scale y axis } else //if the textbox is not highlighted this.textBoxXaxisMin.BackColor = Color.Orange; //calls the Max Function to update the chart if the Max-value is now valid double y; //checks if the input is a double and greater than the min value if (Double.TryParse(this.textBoxXaxisMax.Text, out y) && y > chart1.ChartAreas[0].AxisX.Minimum) { this.textBoxXaxisMax.BackColor = Color.White; chart1.ChartAreas[0].AxisX.Maximum = Convert.ToDouble(this.textBoxXaxisMax.Text); //method to scale y axis } else //if the textbox is not highlighted this.textBoxXaxisMax.BackColor = Color.Orange; } ``` Now I would like to have the Y-axis scaled automatically. Y-min should be calulated as the min value of all series in the section of (X-min and X-max) and the Y-max as the maximum of all series in the selected section. My problem is the implementation. In this example, Y-min should be changed to about 50. I hosted the hole exampleproject here at GitHup.