C# ZedGraph实时多条曲线数据更新实例

C# ZedGraph实时多条曲线数据更新实例

先看展示效果

1.创建曲线实例添加必要的元素

 1 public class LineChannel
 2     {
 3         public LineChannel(int id,int number,string name,string type,bool selected,Color lineColor,int lineWidth)
 4         {
 5             this.id = id;
 6             this.number = number;
 7             this.name = name;
 8             this.type = type;
 9             this.selected = selected;
10             this.lineColor = lineColor;
11             this.lineWidth = lineWidth;
12         }
13
14         private int id;
15         private int number;
16         private string name;
17         private string type;
18         private bool selected;
19         private Color lineColor;
20         private int lineWidth;
21
22
23         public int ID
24         {
25             get { return this.id; }
26             //set { this.id = value; }
27         }
28
29         public int Number
30         {
31             get { return this.number; }
32         }
33
34         public string Name
35         {
36             get { return this.name; }
37             //set { this.name = value; }
38         }
39
40         public string Type
41         {
42             get { return this.type; }
43             //set { this.type = value; }
44         }
45         public bool Selected
46         {
47             get { return this.selected; }
48             set { this.selected = value; }
49         }
50         public Color LineColor
51         {
52             get { return this.lineColor; }
53             set { this.lineColor = value; }
54         }
55         public int LineWidth
56         {
57             get { return this.lineWidth; }
58             set { this.lineWidth = value; }
59         }
60
61     }

2.初始化控件增加曲线

 1   //加载创建曲线数据
 2             LineChannel lineChannel1 = new LineChannel(1111, 1, "曲线 1", "温度", true, Color.Red, 1);
 3             LineChannel lineChannel2 = new LineChannel(2222, 2, "曲线 2", "温度", true, Color.Green, 1);
 4             LineChannel lineChannel3 = new LineChannel(3333, 3, "曲线 3", "温度", true, Color.Gray, 1);
 5             LineChannel lineChannel4 = new LineChannel(4444, 4, "曲线 4", "温度", true, Color.Black, 1);
 6
 7             this.lines.Add(lineChannel1);
 8             this.lines.Add(lineChannel2);
 9             this.lines.Add(lineChannel3);
10             this.lines.Add(lineChannel4);
11
12
13             //获取引用
14             GraphPane myPane = zedGraphControl1.GraphPane;
15             //设置标题
16             myPane.Title.Text = "实时曲线";
17             //设置X轴说明文字
18             myPane.XAxis.Title.Text = "时间";
19             //设置Y轴说明文字
20             myPane.YAxis.Title.Text = "温度";
21
22
23             //添加曲线
24             foreach (LineChannel channel in this.lines)
25             {
26                 RollingPointPairList list = new RollingPointPairList(1200);
27                 LineItem curve = myPane.AddCurve(channel.Name, list, channel.LineColor, SymbolType.None);
28             }
29
30
31             int increment = 30;//单位s
32
33
34
35
36             myPane.XAxis.Scale.Min = 0; //X轴最小值0
37             myPane.XAxis.Scale.Max = 30; //X轴最大30
38             myPane.XAxis.Scale.MinorStep = 1;//X轴小步长1,也就是小间隔
39             myPane.XAxis.Scale.MajorStep = 5;//X轴大步长为5,也就是显示文字的大间隔
40
41             //改变轴的刻度
42             zedGraphControl1.AxisChange();
43             this.zedGraphControl1.Invalidate();
44             this.dataGridViewLines.DataSource = this.lines;
45             this.dataGridViewLines.ClearSelection();

3.增加线程处理 模拟数据

 1   //保存开始时间
 2             tickStart = Environment.TickCount;
 3             stop = false;
 4             BackgroundWorker worker = sender as BackgroundWorker;
 5
 6             isSampling = true;
 7             List<LineChannel> channels = this.lines;
 8             //DoWork
 9             LineData lineData;
10             while (isSampling)
11             {
12                 lineData = new LineData();
13
14
15                 //获取数据
16                 double time = (Environment.TickCount - tickStart) / 1000.0;
17                 double data = Math.Sin(2.0 * Math.PI * time / 3.0);
18                 double data2 = data - 0.4;
19                 double data3 = data - 0.8;
20                 double data4 = data - 1.2;
21
22                 //添加数据
23                 lineData.Add(channels[0], time, data);
24                 lineData.Add(channels[1], time, data2);
25                 lineData.Add(channels[2], time, data3);
26                 lineData.Add(channels[3], time, data4);
27
28                 //上报数据处理
29                 worker.ReportProgress(0, lineData);
30
31                 Thread.Sleep(50);
32             }

4.数据接受更新曲线

 1 LineData lineData = e.Data;
 2
 3             double time = 0, data = 0;
 4
 5             foreach (LineChannel channel in lineData.Channels)
 6             {
 7                 if (e.Data.GetData(channel, out time, out data))
 8                 {
 9                     LineItem curve = null;
10
11                     foreach (var item in zedGraphControl1.GraphPane.CurveList)
12                     {
13                         if (item.Label.Text == channel.Name)
14                             curve = item as LineItem;
15                     }
16
17                     if (curve != null)
18                     {
19                         IPointListEdit list = curve.Points as IPointListEdit;
20                         list.Add(time, data);
21                     }
22
23                     curve.IsVisible = channel.Selected;
24                     curve.Line.Width = channel.LineWidth;
25                     curve.Line.Color = channel.LineColor;
26
27
28                 }
29
30
31             }
32
33
34             Scale xScale = zedGraphControl1.GraphPane.XAxis.Scale;
35             if (time > xScale.Max - xScale.MajorStep)
36             {
37                 xScale.Max = time + xScale.MajorStep;
38                 xScale.Min = xScale.Max - 30.0;
39             }
40
41
42             //if (time > xScale.Max)
43             //{
44             //    xScale.Max = time;
45             //    xScale.Min = xScale.Max - 30;
46             //}
47
48
49             //第三步:调用ZedGraphControl.AxisChange()方法更新X和Y轴的范围
50             zedGraphControl1.AxisChange();
51
52             //第四步:调用Form.Invalidate()方法更新图表
53             zedGraphControl1.Invalidate();

程序运行效果

初始化曲线

开始采集

程序源代码工程下载

实现了比较基础简单的功能,提供思路,遇到bug不要惊讶,没有细调,需要源代码可以留言,给出邮箱,看到后会回复。

本程序参考

https://www.cnblogs.com/chuhj/p/7988404.html

原文地址:https://www.cnblogs.com/JiYF/p/11182658.html

时间: 2024-11-09 03:06:11

C# ZedGraph实时多条曲线数据更新实例的相关文章

highcharts 实时动态多条曲线

<!DOCTYPE HTML> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=gbk"> <title>Highcharts Example</title> <link rel="stylesheet" type="text/css" href=&q

ASP.NET技巧:教你制做Web实时进度条

网上已经有很多Web进度条的例子,但是很多都是估算时间,不能正真反应任务的真实进度.我自己结合多线程和ShowModalDialog制做了 一个实时进度条,原理很简单:使用线程开始长时间的任务,定义一个Session,当任务进行到不同的阶段改变Session的值,线程开始的同时使用 ShowModalDialog打开一个进度条窗口,不断刷新这个窗口获取Session值,反应出实时的进度.下面就来看看具体的代码:(文章结尾处下 载源代码) 先新建一个Default.aspx页面,客户端代码: <b

数据导入与实时进度条实现

digiflow数据导入与实时进度条实现 本文档只是稍微解析下数据导入的流程,以及讲解实时进度条实现方法 [数据批量导入流程] 1.客户把.txt数据打包成.gz文件,发给我们. GZ文件格式,每个文件的第一行是唯一的数据,导入完成后要插入到ImportRecord表 名字格式:DigiFlow_南宁 - 平安出单中心_20100201_000100ECHW8P8708.txt 内容格式:以"||"为分割符 比如:00||000100ECHW8P8708||8||18:08:17 00

如何定距等分一条曲线线段?

小伙伴们在CAD绘图设计的过程中,常常会遇到各种各样不同的问题,有时候就会遇到需要调用定距等分命令的情况.若是有一条不规则的曲线,我们该如何把它定距等分呢?现在小编就想和大家讨论一下,具体如何定距等分一条曲线线段? 步骤一:绘制一条曲线线段 首先,我们先运行迅捷CAD编辑器专业版,然后在绘图框中,绘制一条曲线. 步骤二:"格式"-"点样式" 首先,我们点击菜单栏里的"格式-点样式"选项按钮.会有"绘图设置"弹窗弹出. 在打开的

EXTJS+ASP.NET上传文件带实时进度条代码

一,文件夹 二,upLoad.cs是继承IHttpModule的类: using System; using System.Collections.Generic; using System.Linq; using System.Web; using System.Text; using System.IO; using System.Reflection; using System.Globalization; using System.Web.Hosting; /// <summary>

有关任意多条曲线的拟合度算法

在股市中,经常会遇到趋势的预判.所谓趋势,即相对而言的规律化的模式识别形态.形象来讲,就是个股的一段时间内的曲线分布状况. 那么,问题来了. 我们虽然可以在少量的图像中分辨出差异不是很大的趋势之间的相似度.如果,在进行量化交易的时候,进行程序化的批量匹配过程中,该如何分辨出相似度最高的曲线标的呢?这就需要程序化算法进行匹配. 对于曲线而言,无非就是一系列的坐标点的连线.在对相邻坐标点的倾斜角进行递归计算,就可以合计出曲线的倾斜角分布积,就代表了曲线的形态.那么,又如何进行批量的匹配呢?需要进行倾

Extjs+Asp.net实现上传大文件带实时进度条

主要是为了记录自己的学习过程,整理自己的思路以便以后的学习. 首先先说一下整体的思路. 我门都知道,asp自带的上传文件是先将上传的文件整个读取到内存然后在写入磁盘的.如果文件很大的话,上传时就会出现页面停滞,没有任何反映.用户根本不知道页面在做什么,也不知道是否在上传,上传了多少?这样的用户体验是很差的. 所以我门需要实现一个进度条来反映文件上传的进度,可以反映文件写入的进度.具体的思路是通过asp.net提供的HttpModule(Http模块)中的init方法内订阅各种应用程序事件(如Be

LabVIEW 波形图表显示多条曲线

如何在波形图表中显示多条曲线呢? 首先看看波形图表的说明,请查看labVIEW 帮助 图 1 波形图表控件的即时帮助信息 关键就在绑定多个点. 图 2 利用捆绑函数将多个信号捆绑成簇 图 3 波形图表多曲线分层显示 也可右键设置层叠显示,上面是分层显示 图 4 波形图表多曲线层叠显示

MATLAB在一张图上画出多条曲线

在matlab中,经常遇到画图问题,甚至,有时候需要把其他软件中的数据,导出来,用matlab处理. 此处给出,用matlab处理数据的一些简单方法. 参考资料: MATLAB多条曲画到一张图上 MATLAB plot画出多条不同颜色的曲线 原文地址:https://www.cnblogs.com/Aaron12/p/9938695.html