web-dev-qa-db-ja.com

いくつかのシリーズのX値のセクション内の値に応じてチャートのY軸をスケーリングします

私はこのようなアプリケーションを持っています: Chart with scaling for the X-axis チャートの下のテキストボックスを使用して、ユーザーはチャートのX軸の最小値と最大値を設定できます。これはそのためのコードです:

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;
}

ここで、Y軸を自動的にスケーリングしたいと思います。 Y-minは、(X-minおよびX-max)のセクションのすべてのシリーズの最小値として計算され、Y-maxは選択されたセクションのすべてのシリーズの最大値として計算されます。私の問題は実装です。

この例では、Y-minを約50に変更する必要があります。

私はここで穴のexampleprojectを GitHup でホストしました。

6
kimliv

これにより、0から1までのすべてのシリーズのX軸の最小値と最大値[0]の間の最小値と最大値にY軸がスケーリングされます。

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;

編集:テスト中に、最小値と最大値のリセットがあまり明白ではないことに気づきました。方法は次のとおりです。

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;
9
TaW

軸の最小値は自動的に0に設定されます。IsStartesFromZeroプロパティを使用するだけです。

chart.ChartAreas[0].AxisY.IsStartedFromZero = false;
6
idanp

私がプロジェクトに使用したコードは次のとおりです:(@ TaWの回答に基づく)

private void changeYScala(object chart)
{
    double max = Double.MinValue;
    double min = Double.MaxValue;

    Chart tmpChart = (Chart)chart;

    double leftLimit = tmpChart.ChartAreas[0].AxisX.Minimum;
    double rightLimit = tmpChart.ChartAreas[0].AxisX.Maximum;

    for (int s = 0; s < tmpChart.Series.Count(); s++)
    {
        foreach (DataPoint dp in tmpChart.Series[s].Points)
        {
            if (dp.XValue >= leftLimit && dp.XValue <= rightLimit)
            {
                min = Math.Min(min, dp.YValues[0]);
                max = Math.Max(max, dp.YValues[0]);
            }
        }
    }
    //tmpChart.ChartAreas[0].AxisY.Maximum = max;
    tmpChart.ChartAreas[0].AxisY.Maximum = (Math.Ceiling((max / 10)) * 10);
    tmpChart.ChartAreas[0].AxisY.Minimum = (Math.Floor((min / 10)) * 10);
    //tmpChart.ChartAreas[0].AxisY.Minimum = min;
}

このメソッドは、上記の質問コードで次のように呼び出されます。

changeYScala(chart1);

以下を含めることを忘れないでください:

using System.Windows.Forms.DataVisualization.Charting;
3
kimliv