存储减去2个Y系列值的结果,作为新系列

时间:2016-03-16 00:29:50

标签: c# asp.net aspchart

我有一个包含两个系列的图表,它们共享相同的X轴值。我想减去Y值并创建一个新系列。

到目前为止,我尝试过两种方式:

  1. 转换图表上的点并将它们放入数组并减去它们:

       double[] arrayX = new double[chart2.Series[0].Points.Count()];
       double[] arrayY = new double[chart2.Series[0].Points.Count()];
       double[] arrayResult = { };
    
        for (int i = 0; i < chart2.Series[0].Points.Count(); i++)
        {               
            arrayX[i] = chart2.Series[0].Points[i].XValue;
            arrayY[i] = chart2.Series[0].Points[i].YValues[0];
        }
    
  2. 这个问题是,它只从第一个系列中获取X值,并省略第二个系列X值。

    1. 当我将点添加到图表时,我使用了这个:

      chart2.Series[SplitListBox.Items[0].ToString()].Points.AddXY(e, firstval);  
      chart2.Series[SplitListBox.Items[1].ToString()].Points.AddXY(e, firstval);  
      
    2. 两者都在不同的循环中。我打算使用2个数组来捕获每个循环的点(e,firstval),但我不知道如何相互减去这两个并保持一个系列中存在的值而不是另一个系列中存在的值

1 个答案:

答案 0 :(得分:1)

根据自己的喜好创建新的Series SDelta之后,您可以调用一个简单的函数来填充它:

void PlotDelta(Chart chart, Series S1, Series S2, Series SDelta)
{
    for (int i = 0; i < S1.Points.Count; i++)
    {
        if ( i < S2.Points.Count)
        {
            DataPoint dp1 = S1.Points[i];
            DataPoint dp2 = S2.Points[i];
            if (!dp1.IsEmpty && !dp2.IsEmpty)
                SDelta.Points.AddXY(dp1.XValue, dp2.YValues[0] - dp1.YValues[0]);
        }
    }

您可能希望改进针对不同点数或emtpy点的错误处理。

这是一个测试床:

    private void button1_Click(object sender, EventArgs e)
    {
        chart1.Series.Clear();
        chart1.Series.Add(new Series { Name = "Cos", ChartType = SeriesChartType.Line });
        chart1.Series.Add(new Series { Name = "Sin", ChartType = SeriesChartType.Line });
        chart1.Series.Add(new Series { Name = "Delta", ChartType = SeriesChartType.Line });

        for (int i = 0; i < 100; i++ )
        {
            chart1.Series["Cos"].Points.AddXY(i, Math.Cos(i / Math.PI));
            chart1.Series["Sin"].Points.AddXY(i, Math.Sin(i / Math.PI));
        }

        PlotDelta(chart1, chart1.Series["Cos"], chart1.Series["Sin"],
                          chart1.Series["Delta"]);
    }

enter image description here

当然,您可以在函数中集成delta系列的创建;但你必须传入你可能想要变化的任何属性,如Color,ChartType等。