wpf 使用Oxyplot 库制作图表示例
方法:
InitTable 方法:负责初始化图表模型,包括设置图表的样式、坐标轴、系列和注释。这个方法包括多个 Init 方法的调用,表示图表的初始化过程可以分步骤进行。
InitGoalPoint 方法:当前未实现,但预留了子类进行重写。
InitX 和 InitY 方法:分别初始化 X 和 Y 轴。
AddPoint 方法:向图表中添加点,并更新 Y 轴的最大值。
ClearPoint 方法:清空图表中的点并重新绘制。
字段和属性:
使用了 protected 修饰符来保护图表的各个部分(如 X 轴、Y 轴、系列等),允许子类访问和修改。
DataSrc 是一个公开的字典,用于存储数据源。
ChartModel 是公开的,只读属性,返回当前的图表模型。
GoalLines 也是公开的,只读属性,返回目标线的集合。
[AddINotifyPropertyChangedInterface]public abstract class ChartBase<T>{public ChartBase(){InitTable();}protected virtual string ChartName { get; set; } = "";protected virtual string ChartXName { get; set; } = "";protected virtual string ChartYName { get; set; } = "";protected virtual double ChartXMin { get; set; } = double.NaN;protected virtual double ChartXMax { get; set; } = double.NaN;protected virtual double ChartXStep { get; set; } = double.NaN;protected virtual double ChartYMin { get; set; } = double.NaN;protected virtual double ChartYMax { get; set; } = double.NaN;protected virtual double ChartYStep { get; set; } = double.NaN;protected virtual void InitTable(){DataSrc = new();chartModel = new PlotModel(){Title = ChartName,IsLegendVisible = true,LegendMargin = 5,LegendPlacement = LegendPlacement.Outside,LegendOrientation = LegendOrientation.Horizontal,LegendPosition = LegendPosition.TopLeft,LegendFontSize = 15,PlotAreaBorderThickness = new OxyThickness(1, 0, 0, 1),TextColor = foreground,TitleColor = foreground,PlotAreaBorderColor = foreground,};InitX();InitY();InitGoalLine();InitGoalPoint();if(chart_X != null){ChartModel.Axes.Add(chart_X);}if (chart_Y != null){ChartModel.Axes.Add(chart_Y);}if(chart_X != null && chart_Y != null){lineSeries = new LineSeries(){//IsVisible = isShowAcResistance,//Title = "奈奎斯特图",MarkerType = MarkerType.Circle,MarkerFill = OxyColors.Transparent,MarkerStroke = OxyColors.DarkSeaGreen,MarkerStrokeThickness = 1,//StrokeThickness = seriesStrokeThickness,Color = OxyColors.CadetBlue,TextColor = foreground,XAxisKey = "Chart_X",YAxisKey = "Chart_Y",};ChartModel.Series.Add(lineSeries);}if(goalPoints!=null){ChartModel.Series.Add(goalPoints);}if(goalLines!=null){goalLines.ForEach(x => ChartModel.Annotations.Add(x));}}protected virtual void InitGoalPoint(){}OxyColor foreground = OxyColors.White;protected virtual void InitGoalLine(){//goalLines = new List<LineAnnotation>();//goalLines.Add(new LineAnnotation()//{// Type = LineAnnotationType.Horizontal,// Y = 20,// LineStyle = LineStyle.Dash,// StrokeThickness = 2,// Color = OxyColors.DeepPink,// TextColor = OxyColors.DeepPink,// Text = "20",//});}protected virtual void InitY(){chart_Y = new LinearAxis(){Position = AxisPosition.Left,Title = ChartYName,TitlePosition = 0.5,Minimum = ChartYMin,Maximum = ChartYMax,MajorStep = ChartYStep,TextColor = foreground,TitleColor = foreground,TicklineColor = foreground,MinorTicklineColor = foreground,IsZoomEnabled = true,IsPanEnabled = true,Key = "Chart_Y",};}protected virtual void InitX(){chart_X = new LinearAxis(){Position = AxisPosition.Bottom,Title = ChartXName,Minimum = ChartXMin,Maximum = ChartXMax,MajorStep = ChartXStep,TextColor = foreground,TitleColor = foreground,TicklineColor = foreground,MinorTicklineColor = foreground,IsZoomEnabled = true,IsPanEnabled = true,Key = "Chart_X",};}public virtual void AddPoint(double x,double y){lineSeries.Points.Add(new(x,y));if(y > ChartModel.Axes[1].Maximum){ChartModel.Axes[1].Maximum = y + 2;}chartModel.InvalidatePlot(true);}public virtual void ClearPoint(){lineSeries.Points.Clear();if(goalPoints!=null){goalPoints.Points.Clear();}chartModel.InvalidatePlot(true);}//public void SetGoalLine1(double goal)//{// goalLines[0].Y = goal;// goalLines[0].Text = goal.ToString();// chartModel.InvalidatePlot(true);//}//public void SetGoalPoint(double x, double y)//{// goalPoints.Points.Add(new ScatterPoint(x, y));// chartModel.InvalidatePlot(true);//}protected LinearAxis chart_X = null;protected LinearAxis chart_Y = null;protected LineSeries lineSeries = null;protected List<LineAnnotation> goalLines = null;protected ScatterSeries goalPoints = null;protected PlotModel chartModel;public Dictionary<int, T> DataSrc;public PlotModel ChartModel { get => chartModel; }public List<LineAnnotation> GoalLines { get => goalLines; }}
相关文章:
wpf 使用Oxyplot 库制作图表示例
方法: InitTable 方法:负责初始化图表模型,包括设置图表的样式、坐标轴、系列和注释。这个方法包括多个 Init 方法的调用,表示图表的初始化过程可以分步骤进行。 InitGoalPoint 方法:当前未实现,但预留了子…...
CSS3中的@media查询
CSS3的media查询是一种强大的功能,允许我们根据不同的媒体类型和设备特性来应用不同的样式规则。这使得我们能够创建响应式设计,确保网站或应用在各种设备和屏幕尺寸上都能提供良好的用户体验。本文将详细探讨media查询的定义、语法、使用场景及常见问题…...
fly专享
要逐步熟悉实验中的各个步骤,下面是详细的说明,包括如何下载软件以及相关操作步骤。 1. 熟悉VMware 15虚拟机的使用 步骤说明: 下载VMware Workstation 15: 打开浏览器,访问VMware官方网站:VMware Workst…...
初识Linux · 进程(3)
目录 前言: 进程的创建 前言: 继上文介绍了着重介绍了进程的内部属性,以及在操作系统层面进程如何被组织起来的,如何调用系统接口,有关task_struct,进程的部分理解等,今天,我们就…...
【spring】spring bean对象生命周期,spring容器如何管理bean,spring容器的名称是叫什么
【spring】spring bean对象生命周期,spring容器如何管理bean,spring容器的名称是叫什么 DefaultListableBeanFactory开始 spring 容器 DefaultListableBeanFactory DefaultListableBeanFactory是Spring的核心BeanFactory实现,它负责Bean的创…...
基于51单片机的电饭锅控制系统proteus仿真
地址: https://pan.baidu.com/s/1CGyg6uPhFI0MeaBWwe_HAg 提取码:1234 仿真图: 芯片/模块的特点: AT89C52/AT89C51简介: AT89C52/AT89C51是一款经典的8位单片机,是意法半导体(STMicroelectro…...
创建dataSource错误
说明:记录一次启动项目时的异常,如下: Error starting ApplicationContext. To display the conditions report re-run your application with debug enabled. 2024-09-14 23:27:27.338 ERROR 42260 --- [ main] o.s.boot.SpringA…...
为解决bypy大文件上传报错—获取百度云文件直链并使用Aria2上传文件至服务器
问题描述 一方面组内的服务器的带宽比较小,另一方面使用bypy方式进行大文件(大于15G)上传时会报错(虽然有时可以成功上传,但是不稳定): 解决方式 总体思路: 获得云盘需要下载文件的直链复制直链到服务器中使用自带…...
53.9k star 提升命令行效率的模糊搜索神器--fzf
fzf简介 作为Linux/Unix命令行的重度用户,你是否还在使用繁琐的管道命令与复杂选项组合来过滤文件和数据?其实我们有一个更简单高效的选择 - fzf。 fzf是一个开源的通用模糊搜索工具,可以大幅度提升命令行的使用体验。它的查询运行速度极快,支持预览选中的文件内容,还能与各…...
项目需求 | MySQL增量备份与恢复的完整操作指南
目录 一、MySql数据库增量备份的工作原理 1、全量备份与增量备份 2、增量备份原理 二、进行增量备份 步骤1:启用二进制日志 使用 SHOW VARIABLES 命令查看二进制日志状态 步骤2:执行增量备份脚本 三、使用增量备份恢复损坏的数据库 步骤1&#…...
判断当前环境是否为docker容器下
判断当前环境是否为docker容器下 webshell后或登录到系统后台,判断是否为docker容器可使用如下方法: 方式一:使用ls -alh命令查看是否存在.dockerenv来判断是否在docker容器环境内 ls -alh /.dockerenv如下图无.dockerenv文件,所…...
深入理解FastAPI中的root_path:提升API部署灵活性的关键配置
在Web开发领域,FastAPI因其高性能、易于使用和类型提示功能而备受开发者喜爱。然而,当涉及到在生产环境中部署FastAPI应用程序时,我们常常需要面对一些挑战,比如如何正确处理代理服务器添加的路径前缀。这时,root_path…...
QLORA:高效微调量化大型语言模型
人工智能咨询培训老师叶梓 转载标明出处 传统的16位精度微调需要超过780GB的GPU内存,对于参数量极大的模型,如65B(即650亿参数)的模型,在资源有限的情况下大模型的微调几乎是不可能的。华盛顿大学的研究者团队提出了一…...
CesiumJS+SuperMap3D.js混用实现可视域分析 S3M图层加载 裁剪区域绘制
版本简介: cesium:1.99;Supermap3D:SuperMap iClient JavaScript 11i(2023); 官方下载文档链家:SuperMap技术资源中心|为您提供全面的在线技术服务 示例参考:support.supermap.com.cn:8090/w…...
Fish-Speech 部署安装指南
Fish Speech 是由 Fish Audio 团队开发的一款开源文本转语音(TTS)模型,它在多语言支持和性能方面取得了显著的突破。根据证据显示,Fish Speech 最新版本为 1.4 版本,该版本不仅提升了对多种语言的支持,还大…...
Excel 国产化替换新方案
前言 在当前数字化转型和信创(信息技术应用创新)战略背景下,企业对于安全性、自主可控性和高效办公工具的需求日益增加。作为一款国产自主研发的高性能表格控件,SpreadJS 正成为替换 Excel 的最佳选择。它不仅全面支持国产化认证…...
在职研生活学习--20240908
文章目录 九月八日清晨,我们在鸟鸣声中醒来,精神饱满地迎接大汇演的挑战。上午,我们被分成舞龙队、旗手队、拳队、鼓队四个特色团队进行练习。阳光下,我们挥汗如雨,却乐此不疲。鼓声隆隆,龙舞飞扬ÿ…...
chattr:修改文件的特殊属性
chattr 命令用于改变文件的特殊属性,也称为"chattr 属性"。这些属性可以提供额外的安全性和控制,如设置文件为不可修改、只允许在文件末尾添加数据等。 一、Linux 文件属性 文件属性是指与文件相关联的元数据,这些属性决…...
vue-router 在新的标签页打开链接/路由
前言 vue-router 在新的标签页打开链接/路由,由于官方没有提供对链接target属性的配置,要实现这个需求,需要自行实现,这里提供几个方案供参考。 调用 API vue-router 的路由实例除了常见的 push, replace, go 等接口࿰…...
Ansys HFSS的边界条件与激励端口
本文将介绍HFSS边界条件、激励端口,然后重点介绍连接器信号完整性仿真应用最多的波端口(wave port)及其尺寸设置要点。 HFSS (电磁仿真)边界条件 HFSS中所谓的边界并非真正意义上的边界,边界条件是指定问题区域和对象边缘的场行为接口。在HFSS的背景下,边界的存在主要有两个…...
Leetcode 3576. Transform Array to All Equal Elements
Leetcode 3576. Transform Array to All Equal Elements 1. 解题思路2. 代码实现 题目链接:3576. Transform Array to All Equal Elements 1. 解题思路 这一题思路上就是分别考察一下是否能将其转化为全1或者全-1数组即可。 至于每一种情况是否可以达到…...
【OSG学习笔记】Day 18: 碰撞检测与物理交互
物理引擎(Physics Engine) 物理引擎 是一种通过计算机模拟物理规律(如力学、碰撞、重力、流体动力学等)的软件工具或库。 它的核心目标是在虚拟环境中逼真地模拟物体的运动和交互,广泛应用于 游戏开发、动画制作、虚…...
相机Camera日志实例分析之二:相机Camx【专业模式开启直方图拍照】单帧流程日志详解
【关注我,后续持续新增专题博文,谢谢!!!】 上一篇我们讲了: 这一篇我们开始讲: 目录 一、场景操作步骤 二、日志基础关键字分级如下 三、场景日志如下: 一、场景操作步骤 操作步…...
大语言模型如何处理长文本?常用文本分割技术详解
为什么需要文本分割? 引言:为什么需要文本分割?一、基础文本分割方法1. 按段落分割(Paragraph Splitting)2. 按句子分割(Sentence Splitting)二、高级文本分割策略3. 重叠分割(Sliding Window)4. 递归分割(Recursive Splitting)三、生产级工具推荐5. 使用LangChain的…...
Vue2 第一节_Vue2上手_插值表达式{{}}_访问数据和修改数据_Vue开发者工具
文章目录 1.Vue2上手-如何创建一个Vue实例,进行初始化渲染2. 插值表达式{{}}3. 访问数据和修改数据4. vue响应式5. Vue开发者工具--方便调试 1.Vue2上手-如何创建一个Vue实例,进行初始化渲染 准备容器引包创建Vue实例 new Vue()指定配置项 ->渲染数据 准备一个容器,例如: …...
leetcodeSQL解题:3564. 季节性销售分析
leetcodeSQL解题:3564. 季节性销售分析 题目: 表:sales ---------------------- | Column Name | Type | ---------------------- | sale_id | int | | product_id | int | | sale_date | date | | quantity | int | | price | decimal | -…...
聊一聊接口测试的意义有哪些?
目录 一、隔离性 & 早期测试 二、保障系统集成质量 三、验证业务逻辑的核心层 四、提升测试效率与覆盖度 五、系统稳定性的守护者 六、驱动团队协作与契约管理 七、性能与扩展性的前置评估 八、持续交付的核心支撑 接口测试的意义可以从四个维度展开,首…...
全志A40i android7.1 调试信息打印串口由uart0改为uart3
一,概述 1. 目的 将调试信息打印串口由uart0改为uart3。 2. 版本信息 Uboot版本:2014.07; Kernel版本:Linux-3.10; 二,Uboot 1. sys_config.fex改动 使能uart3(TX:PH00 RX:PH01),并让boo…...
使用 SymPy 进行向量和矩阵的高级操作
在科学计算和工程领域,向量和矩阵操作是解决问题的核心技能之一。Python 的 SymPy 库提供了强大的符号计算功能,能够高效地处理向量和矩阵的各种操作。本文将深入探讨如何使用 SymPy 进行向量和矩阵的创建、合并以及维度拓展等操作,并通过具体…...
【VLNs篇】07:NavRL—在动态环境中学习安全飞行
项目内容论文标题NavRL: 在动态环境中学习安全飞行 (NavRL: Learning Safe Flight in Dynamic Environments)核心问题解决无人机在包含静态和动态障碍物的复杂环境中进行安全、高效自主导航的挑战,克服传统方法和现有强化学习方法的局限性。核心算法基于近端策略优化…...
