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

先看展示效果

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

 public class LineChannel
{
public LineChannel(int id,int number,string name,string type,bool selected,Color lineColor,int lineWidth)
{
this.id = id;
this.number = number;
this.name = name;
this.type = type;
this.selected = selected;
this.lineColor = lineColor;
this.lineWidth = lineWidth;
} private int id;
private int number;
private string name;
private string type;
private bool selected;
private Color lineColor;
private int lineWidth; public int ID
{
get { return this.id; }
//set { this.id = value; }
} public int Number
{
get { return this.number; }
} public string Name
{
get { return this.name; }
//set { this.name = value; }
} public string Type
{
get { return this.type; }
//set { this.type = value; }
}
public bool Selected
{
get { return this.selected; }
set { this.selected = value; }
}
public Color LineColor
{
get { return this.lineColor; }
set { this.lineColor = value; }
}
public int LineWidth
{
get { return this.lineWidth; }
set { this.lineWidth = value; }
} }

2.初始化控件增加曲线

全局曲线和其实时间保存

   private List<LineChannel> lines;   //所有的曲线
private int tickStart = ; // 起始时间以毫秒为单位

初始化曲线

   //加载创建曲线数据
LineChannel lineChannel1 = new LineChannel(, , "曲线 1", "温度", true, Color.Red, );
LineChannel lineChannel2 = new LineChannel(, , "曲线 2", "温度", true, Color.Green, );
LineChannel lineChannel3 = new LineChannel(, , "曲线 3", "温度", true, Color.Gray, );
LineChannel lineChannel4 = new LineChannel(, , "曲线 4", "温度", true, Color.Black, ); this.lines.Add(lineChannel1);
this.lines.Add(lineChannel2);
this.lines.Add(lineChannel3);
this.lines.Add(lineChannel4); //获取引用
GraphPane myPane = zedGraphControl1.GraphPane;
//设置标题
myPane.Title.Text = "实时曲线";
//设置X轴说明文字
myPane.XAxis.Title.Text = "时间";
//设置Y轴说明文字
myPane.YAxis.Title.Text = "温度"; //添加曲线
foreach (LineChannel channel in this.lines)
{
RollingPointPairList list = new RollingPointPairList();
LineItem curve = myPane.AddCurve(channel.Name, list, channel.LineColor, SymbolType.None);
} int increment = ;//单位s myPane.XAxis.Scale.Min = ; //X轴最小值0
myPane.XAxis.Scale.Max = ; //X轴最大30
myPane.XAxis.Scale.MinorStep = ;//X轴小步长1,也就是小间隔
myPane.XAxis.Scale.MajorStep = ;//X轴大步长为5,也就是显示文字的大间隔 //改变轴的刻度
zedGraphControl1.AxisChange();
this.zedGraphControl1.Invalidate();
this.dataGridViewLines.DataSource = this.lines;
this.dataGridViewLines.ClearSelection();

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

   //保存开始时间
tickStart = Environment.TickCount;
stop = false;
BackgroundWorker worker = sender as BackgroundWorker; isSampling = true;
List<LineChannel> channels = this.lines;
//DoWork
LineData lineData;
while (isSampling)
{
lineData = new LineData(); //获取数据
double time = (Environment.TickCount - tickStart) / 1000.0;
double data = Math.Sin(2.0 * Math.PI * time / 3.0);
double data2 = data - 0.4;
double data3 = data - 0.8;
double data4 = data - 1.2; //添加数据
lineData.Add(channels[], time, data);
lineData.Add(channels[], time, data2);
lineData.Add(channels[], time, data3);
lineData.Add(channels[], time, data4); //上报数据处理
worker.ReportProgress(, lineData); Thread.Sleep();
}

4.数据接受更新曲线

//接收上报的数据LineData 数据处理如下
1 LineData lineData = e.Data; double time = , data = ; foreach (LineChannel channel in lineData.Channels)
{
if (e.Data.GetData(channel, out time, out data))
{
LineItem curve = null; foreach (var item in zedGraphControl1.GraphPane.CurveList)
{
if (item.Label.Text == channel.Name)
curve = item as LineItem;
} if (curve != null)
{
IPointListEdit list = curve.Points as IPointListEdit;
list.Add(time, data);
} curve.IsVisible = channel.Selected;
curve.Line.Width = channel.LineWidth;
curve.Line.Color = channel.LineColor; } } Scale xScale = zedGraphControl1.GraphPane.XAxis.Scale;
if (time > xScale.Max - xScale.MajorStep)
{
xScale.Max = time + xScale.MajorStep;
xScale.Min = xScale.Max - 30.0;
} //if (time > xScale.Max)
//{
// xScale.Max = time;
// xScale.Min = xScale.Max - 30;
//} //第三步:调用ZedGraphControl.AxisChange()方法更新X和Y轴的范围
zedGraphControl1.AxisChange(); //第四步:调用Form.Invalidate()方法更新图表
zedGraphControl1.Invalidate();

程序运行效果

初始化曲线

更换曲线颜色

开始采集

程序源代码工程下载

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

本程序参考

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

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

  1. ZedGraph怎样在生成曲线时随机生成不一样的颜色

    场景 在使用ZedGraph生成多条曲线时为了能区分曲线颜色,要求随机设置曲线颜色. 首先从System.Drawing.Color中获取所有颜色的对象的数组,然后将其顺序打乱随机排序,然后在生成曲线 ...

  2. Winform中在ZedGraph中最多可以添加多少条曲线

    场景 Winforn中设置ZedGraph曲线图的属性.坐标轴属性.刻度属性: https://blog.csdn.net/BADAO_LIUMANG_QIZHI/article/details/10 ...

  3. Winform中设置ZedGraph多条Y轴时与多条曲线一一对应

    场景 Winform中实现ZedGraph的多条Y轴(附源码下载): https://blog.csdn.net/BADAO_LIUMANG_QIZHI/article/details/1001322 ...

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

    网上已经有很多Web进度条的例子,但是很多都是估算时间,不能正真反应任务的真实进度.我自己结合多线程和ShowModalDialog制做了 一个实时进度条,原理很简单:使用线程开始长时间的任务,定义一 ...

  5. ggplot2在一幅图上画两条曲线

    ggplot2在一幅图上画两条曲线 print(data)后的结果是 C BROWN.P MI.P 0 0.9216 0.9282 30 0.9240 0.9282 100 0.9255 0.9282 ...

  6. C# Charts绘制多条曲线

    一.创建winform工程 拖拽控件Chart 二.比如要绘制俩条曲线,设置Chart控件的属性Series 三.chart的属性根据自己的业务需求设计,我这里只设置了图标类型 代码: using S ...

  7. ZedGraph实时曲线实例

    2010-10-17 11:23:58| 分类: ASP.NET |举报|字号 订阅public partial class FrmMain : Form { // 起始时间以毫秒为单位 int ti ...

  8. ActiveMQ消息队列和SignalR之日志实时监控及警报小实例

    主要技术: log4net-生成日志. ActiveMQ-生成日志的时候发送消息,并实时监控日志. SignalR-将ActiveMQ监控的日志实时显示到浏览器上,而不用刷新浏览器. 小实例介绍: 左 ...

  9. Java web实时进度条整个系统共用(如java上传进度条、导入excel进度条等)

    先上图: 这上文件上传的: 这是数据实时处理的: 1:先说说什么是进度条:进度条即计算机在处理任务时,实时的,以图片形式显示处理任务的速度,完成度,剩余未完成任务量的大小,和可能需要处理时间,显示方式 ...

随机推荐

  1. kubernetes haproxy+keepalive实现master集群高可用

    前言 master的HA,实际是apiserver的HA.Master的其他组件controller-manager.scheduler都是可以通过etcd做选举(--leader-elect),而A ...

  2. ASP.NET webform总结

    一.asp.net中的内置对象1.Page对象属性:isPostBack 回传 返回bool类型通过url访问就是首次加载,通过控件事件访问页面就是回传.二.页面的执行过程 a.每次访问页面,或访问页 ...

  3. django简单密码加密和效验

    通过django自带的类库,来加密解密很方便,下面来简单介绍下: 导入包: from django.contrib.auth.hashers import make_password, check_p ...

  4. 原生PHP网页导出和导入excel文件实例

    原生PHP实现的网页导出和导入excel文件实例,包括上传也是用的原生.还可在exportExcel方法里设置字体等表格样式. 导出和导入表单代码: <p style="margin: ...

  5. Oracle merge into的优势

    简介 Oracle merge into命令,顾名思义就是“有则更新,无则插入”,这个也是merge into 命令的核心思想,在实际开发过程中,我们会经常遇到这种通过两表互相关联匹配更新其中一个表的 ...

  6. netcore3.0使用Session

    首先需要明确一点,netcore使用session不能直接使用,必须引用nuget包并做注册之后才能使用. 例如下面的例子,若未注册session服务会报 HttpContext.Session.Se ...

  7. Docker-核心笔记(含Dockerfile,Compose)

    Docker-核心笔记(含Dockerfile,Compose) 2017/03 Chenxin 参考 https://yeasy.gitbooks.io/docker_practice Docker ...

  8. Zookeeper学习(一)

    shell角度 API角度 Zookeeper可单节点,可分布式 作用: distributed coordination(分布式协调) 同一时间只有一个对外提供服务,另外的就是standy. 当ac ...

  9. SSH的本地、远程、动态端口转发实验笔记

    SSH端口转发 SSH 会自动加密和解密所有 SSH 客户端与服务端之间的网络数据.但是,SSH 还能够将其他 TCP 端口的网络数据通过 SSH 链接来转发,并且自动提供了相应的加密及解密服务.这一 ...

  10. springmvc的文件上传和JWT图形验证码

    相关pom依赖 <dependency> <groupId>commons-fileupload</groupId> <artifactId>commo ...