Oxyplot实时绘图学习笔记(上)
(本项目来源于嵌入式系统实践课程项目)
目标
作为嵌入式系统的考核项目之一,我们小组选择项目是“基于串行通信的智能传感器和数据采集”,我们拟开发的项目是“基于智能传感器的户外健身环境及体征监测系统”。
本人负责的其中一个模块是对于workstation收集到的多个传感器数据,在图形界面上采用实时绘图的形式显示出来,达成“实时监控”的效果。经过收集资料以及综合平台(WPF)考虑,我最后选择的是使用C#中的Oxyplot绘图工具作为实时图表的实现工具。
需求
- 在同一窗口内显示多个实时数据图表 ,形式类似于Win10的任务管理器
- 对于每一个图表,以曲线图的形式实时反应数值变化
- 调整绘图设置以符合每个传感器数值的变化水平 ,对于简要监视部分,重点在于坐标轴的设置,可以直观看出当前数值;对于重点监视部分,可以容纳更多的数据,并且曲线和绘图区域参照线要足够醒目
- 为“模拟”,“切换监视”等功能的实现设计代码控制
同时绘制多个实时曲线图
因为是第一次接触C#编程,大作业时间也很紧,所以我选择了对现成的项目的代码进行修改,缩短开发时间。什么叫Ctrlc-Ctrlv速成C#啊(后仰
(初始源码来源:https://blog.csdn.net/weixin_42930928/article/details/89143908)
(截图来自最后完成的工程项目,源码链接:https://gitee.com/soheavyrain/group_11_homework)
方式选择
原项目使用了两种不同的方式来绘制实时曲线图:
第一种方式,布局文件相对简单,大量代码都需要在ViewModel类中进行处理
第二种方式,布局文件相对复杂,但是在ViewModel类中的代码量相对较少
我选择的是第二种方式,不想把太多代码放到当时看不懂的Xaml文件里,这种方式将图表的属性在类内直接定义完整,在布局文件中只需要引用相应的model即可。
同时显示多个实时图表
首先去掉了第一个方案创建的图表相关的代码,然后在类内新建了多个新的PlotModel对象,对应要同时显示的多个数据图表。
(图片为“温度”对象的相关设置,其中还包括坐标轴等的配置,下一篇再说)
然后需要在布局文件中为图表设置位置和大小等属性,这里小小修改了一下上一位同学的设计的布局文件,然后在留白的相应位置使用PlotView和binding将图表展示出来。
布局文件中图表的数据来源(?
原项目中有一个“ViewModelLocator.cs”文件,这个文件的代码实现的功能是让布局文件中只需要使用关键词,就可以使图表绑定在MainViewModel类内的名字相同的对应对象上(原理暂且不明),但是用起来相当方便。
(这两段代码分别来自ViewModelLocator.cs和布局文件)
重点监视窗口的数据来源设置
在重点监控窗口中,图表的数据来源并不是固定来自某个传感器,而是随着用户的选择而改变监视的对象,所以需要对于数据来源进行相关的设置。
才疏学浅,我只能想到两个方式:
1.在布局文件中让重点监视窗口的图表控件随着用户的选择而改变绑定的对象
然而,布局文件中并不能同时出现多个PlotView绑定在同一个对象上的情况。
我随后搜索了对象克隆等方式,但是由于ViewModelLocator的存在,绘图的控件对象都被定义在同一个类内,并且这些绘图控件的类由Oxyplot已经设置好了,并没有设计“复制相同的绘图控件”这种功能。
随后尝试使用序列化,逆序列化的方式强行克隆对象,但是似乎由于对象设置过于复杂,无法进行序列化。
(序列化方法来源:https://www.cnblogs.com/DebugLZQ/archive/2013/05/06/3062409.html)
2.创建并一个新的对象,随着用户的选择改变,这个对象改变绘图画点的数据来源
没办法,我只能尝试这种方法,在用户切换观测对象的时候,还需要将之前的数据清空,才能接受新的数据,否则会导致前后不同数据来源的数据差距过大,对绘图产生影响。
对于该控件数据来源的选择,我使用了上一个同学定义的含有全局变量的Common类(如何定义全局变量:https://blog.csdn.net/weixin_40486955/article/details/96559596)
这样可以实现简单粗暴的按按钮→修改全局变量→监测变量值的改变→清空图表数据→根据新的全局变量的值调整数据来源。
总之,因为不太理解ViewModelLocator的工作原理(期末时间真得太紧了),虽然代码写的比较奇形怪状,但是好在经过调试后是可以正常运行的,效果还不错。
Oxyplot实时绘图学习笔记(上)相关推荐
- Oxyplot实时绘图学习笔记(下)
(接上帖) 绘图控件的相关设置 简略监测区域图表 原项目使用的实时绘图逻辑是"当绘制完十个点后,其后每画一个新点,就将第一个点删除"从而达成实时绘图的效果. 但是这个逻辑很显然会导 ...
- nodejs学习笔记(上)
nodejs学习笔记 (上) 通过学习需要做到的是 了解 前后端是如何进行交互的 nodejs也是使用javaScript进行编写的 javaScript在不同的运行环境中有不同的作用 在浏览器内核中 ...
- 学海灯塔新增学习笔记上传功能
又经过一天的努力,学海灯塔学习笔记上传功能实现.欢迎访问我们的学海灯塔 学习笔记这一模块的功能和课程文件类似,由同学们上传自己的学习笔记,用户可以下载,并且可以对笔记进行打分,后期将增加文件讨论功能. ...
- .NET 大数据实时计算--学习笔记
摘要 纯 .Net 自研大数据实时计算平台,在中通快递服务数百亿包裹,处理数据万亿计!将分享大数据如何落地以及设计思路,技术重难点. 目录 背景介绍 计算平台架构 项目实战 背景介绍 计算平台架构 分 ...
- Python课程学习笔记 上
笔记目录 学前准备 Python解释器安装包 下载 安装 Pycharm 下载 常用的快捷键 Python程序执行机制 语法基础 注释和中文乱码 变量 数据类型 运算符 数值运算符 复合运算符 比较运 ...
- MATLAB初级绘图学习笔记
少年易老学难成,一寸光阴不可轻. 视频来自B站<MATLAB教程_台大郭彦甫(14课)原视频补档> 学习笔记如下: 需要的可以作为参考. %怎么告诉电脑我要画图 %其实电脑看不到funct ...
- origin8.0 绘图学习笔记
今天是第一次学习使用origin8.0来绘图和进行数据分析,现将学习过程中的点滴纪录在此,以便后续回顾学习. --------------------------------------------- ...
- 【AI绘图学习笔记】深度前馈网络(二)
有关深度前馈网络的部分知识,我们已经在吴恩达的机器学习课程中有过了解了,本章主要是对<深度学习>花书中第六章:深度前馈网络的总结笔记.我希望你在看到这一章的时候,能回忆起机器学习课程中的一 ...
- 【AI绘图学习笔记】变分自编码器VAE
无监督学习之VAE--变分自编码器详解 机器学习方法-优雅的模型(一):变分自编码器(VAE) 无需多言,看这两篇文章即可.本文主要是总结一下我在看这篇文章和其他视频时没能看懂的部分解读. 文章目录 ...
最新文章
- 「摸鱼」神器来了,Python 实现人脸监测制作神器
- 使用KNN模型进行多输出分类实战(Multioutput Classification)
- 变形版汉诺塔:LeetCode:70爬楼梯
- 《天涯明月刀》窦德斌:美术需要突破自我的局限
- (13)python 字典 2 分钟速解
- Activiti工作流6.0表结构介绍
- 017——数组(十七) asort ksort rsort arsort krsort
- 深入理解Java虚拟机(第三版)-13.Java内存模型与线程
- LightOJ 1096 - nth Term 矩阵快速幂
- 要写related_name的两种情况
- android中自定义的dialog中的EditText无法弹出输入法解决方案
- python udp通信_Python网络编程(三)
- Android 音视频采集那些事
- 上行带宽和下行带宽是什么意思?各有什么作用?
- 视频号怎么添加商品带货扩展链接规则
- IDEA项目can not reconnect错误
- 用支付宝和微信可以直接跳转拉起支付,API搭建比较方便第三方支付接口首选杉德比较靠谱,
- flowable 多实例流程
- Win10多版本CUDA和CUDNN安装
- Dancing Link --- 模板题 HUST 1017 - Exact cover