0

我有一个包含两个系列的图表,它们共享相同的 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];
        }
    

这样做的问题是,这只从第一个系列中获取 X 值,而忽略了第二个系列的 X 值。

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

    chart2.Series[SplitListBox.Items[0].ToString()].Points.AddXY(e, firstval);  
    chart2.Series[SplitListBox.Items[1].ToString()].Points.AddXY(e, firstval);  
    

两者都在单独的循环中。我打算使用 2 个数组来捕获每个循环的点(e,firstval),但我不知道如何将两者相减,并且仍然保留一个系列中存在但另一个系列中不存在的值。

4

1 回答 1

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

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

这是一个测试平台:

    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"]);
    }

在此处输入图像描述

当然你可以将增量系列的创建集成到函数中;但是你必须传入任何你可能想要改变的属性,比如颜色、图表类型等。

于 2016-03-16T08:19:39.603 回答