Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Scale Y-Axis of a Chart depending on the Values within a section of X-Values for several Series

I have got an aplication like this: Chart with scaling for the X-axis 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.

like image 821
kimliv Avatar asked Jun 01 '14 16:06

kimliv


People also ask

What is the scale for the y-axis?

On the y-axis, the numbers are marked at intervals of 5. This indicates that the scale used for the graph is 1 unit is 5 children.

Does the x-axis have to have the same scale as the y-axis?

It is also possible to have different scales on each axis. For example, each interval on the y-axis could represent 2, or even 10 units, while each interval on the x-axis represents 1 unit.

What is X scale and Y scale?

The x and y-axis are two important lines of the coordinate plane. The x-axis is a horizontal number line and the y-axis is a vertical number line. These two axes intersect perpendicularly to form the coordinate plane. The x-axis is also called the abscissa and the y-axis is called the ordinate.


2 Answers

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;
like image 116
TaW Avatar answered Nov 09 '22 04:11

TaW


The axis minimum is automatically sets to 0, just use the IsStartesFromZero property:

chart.ChartAreas[0].AxisY.IsStartedFromZero = false;
like image 38
idanp Avatar answered Nov 09 '22 04:11

idanp