有回响的山谷 2023-06-14 15:39 采纳率: 53.3%
浏览 41
已结题

C# ZedGraph实时更新多曲线

本人最近在使用zedgraph绘制曲线图,具体情况如下:通过串口通讯,接收数据,然后根据协议对接收的数据解包,把需要绘制成曲线的数据填充到曲线上;
目前已把需要填充的数据复制,但是不知道怎么由点绘成曲线(运行后没有曲线,不知道怎么修改)想请教一下大家
下面是我的解包与曲线的显示的主要代码:(协议中表示,根据帧头帧尾确定一帧数据的大小,其中帧数据会显示曲线的个数:例如:接收3个实际需要填充为曲线的数据,就是绘制3个曲线)


```c#
//全局变量中的初始化
RollingPointPairList[] point = new RollingPointPairList[12];
GraphPane myPane;
string[] curveTitles = {"CH1","CH2","CH3","CH4","CH5","CH6","CH7","CH8","CH9","CH10","CH11","CH12"};
Color[] colors = {Color.Red,Color.Green,Color.Yellow,Color.Pink,Color.Red,Color.Red,Color.Red,Color.Red,Color.Red,Color.Red,Color.Red,Color.Red};
ZedGraph.SymbolType[] symbox = {SymbolType.None,SymbolType.None,SymbolType.None,SymbolType.None,SymbolType.None,SymbolType.None,SymbolType.None,SymbolType.None,SymbolType.None,SymbolType.None,SymbolType.None,SymbolType.None};
double X_Value;
//初始化图形
private void InitPlot()
{
    myPane = zgc.GraphPane;
    for(int k = 0;k < myPane.YAxisList.Count;k++)
    {
        YAxis y_axis = myPane.YAxisList[k];
        y_axis.Title.Text = curveTitles[k];
        y_axis.Color = colors[k];
    }
    myPane.CurveList[0] = myPane.AddCurve("CH1",point[0],colors[0],symbox[0]);
    myPane.CurveList[1] = myPane.AddCurve("CH2",point[1],colors[1],symbox[1]);
    myPane.CurveList[2] = myPane.AddCurve("CH3",point[2],colors[2],symbox[2]);
    myPane.CurveList[3] = myPane.AddCurve("CH4",point[3],colors[3],symbox[3]);
    myPane.CurveList[4] = myPane.AddCurve("CH5",point[4],colors[4],symbox[4]);
    myPane.CurveList[5] = myPane.AddCurve("CH6",point[5],colors[5],symbox[5]);
    myPane.CurveList[6] = myPane.AddCurve("CH7",point[6],colors[6],symbox[6]);
    myPane.CurveList[7] = myPane.AddCurve("CH8",point[7],colors[7],symbox[7]);
    myPane.CurveList[8] = myPane.AddCurve("CH9",point[8],colors[8],symbox[8]);
    myPane.CurveList[9] = myPane.AddCurve("CH10",point[9],colors[9],symbox[9]);
    myPane.CurveList[10] = myPane.AddCurve("CH11",point[10],colors[10],symbox[10]);
    myPane.CurveList[11] = myPane.AddCurve("CH12",point[11],colors[11],symbox[11]);
}
//解包执行代码,填充数据到图形
public void DisPlay(float[] PData)
{//PData里面是接收的一帧数据中需要显示到曲线上的数据,PData的长度决定曲线的个数
    
    float[] Y_Value = new float[12];
    for(int x = 0;x < pData.lenght;x++)
    {
        X_Value = (double)x; //X_Value是全局变量,X轴数据
        Y_Value[x] = PData[x];//Y轴值
        point[x] = new RollingPointPairList[100];
        point[x].Add(X_Value,Y_Value[x]);
    }
    if(point[x].Count > 100)
    {
        point[x].RemoveAt(0);
    }
    zgc.AxisChange();
    zgc.Invalidate();
    zgc.Refresh();
}

```

  • 写回答

1条回答 默认 最新

  • 火花怪怪 2023-06-14 16:31
    关注

    麻烦采纳一下哈,谢谢啦

    根据您提供的代码,问题可能出在 DisPlay 函数中。在这个函数中,您创建了 RollingPointPairList 数组 point 并为每个曲线创建了一个 RollingPointPairList,但是您没有将这些点添加到曲线中。因此,在调用 zgc.AxisChange() 和 zgc.Invalidate() 后,界面上并没有显示曲线。

    要将点添加到曲线中,可以使用 AddPoint 方法。例如,如果要将 point[0] 中的点添加到第一个曲线中,可以使用以下代码:

    myPane.CurveList[0].Points.AddPoint(point[0].First().X, point[0].First().Y);
    这个代码将 point[0] 中的第一个点添加到第一个曲线中。需要注意的是,如果 point[0] 中有多个点,您需要使用循环将它们全部添加到曲线中。
    
    修改后的 DisPlay 函数如下所示:
    
    c
    Copy
    public void DisPlay(float[] PData)
    {
        // PData里面是接收的一帧数据中需要显示到曲线上的数据,PData的长度决定曲线的个数
        for (int x = 0; x < PData.Length; x++)
        {
            X_Value = x; // X_Value是全局变量,X轴数据
            float Y_Value = PData[x]; // Y轴值
            point[x].Add(X_Value, Y_Value);
            if (point[x].Count > 100)
            {
                point[x].RemoveAt(0);
            }
            myPane.CurveList[x].Points.Clear();
            myPane.CurveList[x].Points.AddRange(point[x]);
        }
        zgc.AxisChange();
        zgc.Invalidate();
        zgc.Refresh();
    }
    在
    
    

    这个代码中,我们首先使用 Add 方法将新的点添加到 point 中。然后,我们检查 point 中的点的数量是否超过了设定的最大值,如果超过了,就使用 RemoveAt 方法删除最早的点。接下来,我们使用 Clear 方法清空第 x 个曲线中的所有点,并使用 AddRange 方法将 point[x] 中的所有点添加到曲线中。最后,我们调用 zgc.AxisChange()、zgc.Invalidate() 和 zgc.Refresh() 方法更新图形界面。

    需要注意的是,这个代码假定曲线的数量与数据中需要绘制为曲线的数据数量相同,并且曲线的颜色、符号、标题等已经在 InitPlot 函数中设置好了。如果曲线数量不同,需要根据实际情况修改代码。

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论

报告相同问题?

问题事件

  • 系统已结题 6月22日
  • 已采纳回答 6月14日
  • 创建了问题 6月14日