当前位置: 首页 > news >正文

【.NET全栈】ZedGraph图表库的介绍和应用

文章目录

  • 一、ZedGraph介绍
      • ZedGraph的特点
      • ZedGraph的缺点
      • 使用注意事项
  • 二、ZedGraph官网
  • 三、ZedGraph的应用
  • 四、ZedGraph的高端应用
  • 五、、总结


一、ZedGraph介绍

ZedGraph 是一个用于绘制图表和图形的开源.NET图表库。它提供了丰富的功能和灵活性,可以用于创建各种类型的图表,包括折线图、柱状图、饼图等。ZedGraph 支持多种数据源,包括数组、数据表和实时数据流,同时还提供了丰富的定制选项,使用户能够轻松地定制图表的外观和行为。这个库在.NET开发中被广泛应用于数据可视化和报表生成等领域。

在这里插入图片描述
ZedGraph.dll的源码库代码:
在这里插入图片描述

ZedGraph的特点

  • 可以先生成图片后再显示,这对一些多用户并发有点帮助。(RenderMode.ImageTag)
  • 可以动态生成,不用保存文件,可以减少IO的读写消耗。(RenderMode.RawImage)
  • 比较多的呈现方式,比如曲线图、柱状图、饼图等。

ZedGraph的缺点

  • 编码的时候,在设置属性不方便,一点注释都没有,不要说是中文的啦,就连英文都没有,太不方便了。
  • 图表的显示比较简陋,没有OpenFlashChar来得好看。

使用注意事项

  • dll文件当前的最新版本是5.1.5,我以前也使用过4.3.4的版本,这两个版本的差别很大,很多属性都已经不存在了,面向对象的感念可能加强了不少,也清晰了不少,因为现在的属性设置都是先实体,再属性了,而以前就比较混乱了。所以在使用不同的版本的时候要注意这点。
  • 在Windows Forms和 ASP.Net Web Form项目中使用是不同。

二、ZedGraph官网

https://sourceforge.net/projects/zedgraph/files/

官网中可以看到ZedGraph的介绍,在文件列可以下载dll文件和使用例子。都是.NET平台下C#语言的,可以在VisualStudio中查看代码,以及运行代码
在这里插入图片描述

三、ZedGraph的应用

1、新建WinForm项目。

在这里插入图片描述

2、在官网中下载ZedGraph.dll库文件,在项目中引用,并添加命名空间。

在这里插入图片描述
在这里插入图片描述

3、工具箱中添加ZedGraph控件。

在这里插入图片描述
在这里插入图片描述
4、在Form1中拖入一个ZedGraphControl控件,修改name属性为myZedgraph。

在这里插入图片描述
5、项目中的代码如下:

这是一个简单的 Windows 窗体应用程序,使用 ZedGraph 库来绘制速度随时间变化的曲线图。关键步骤如下:

1). 初始化图表控件 (InitZedGraph 方法):

  • InitZedGraph方法中,首先获取 GraphPane对象,然后设置图表的标题、X轴和Y轴的标题。
  • 接着使用 PointPairList对象 vlist存储时间和速度的数据点。
  • 使用 AddCurve方法创建一条红色的菱形样式曲线,并将数据点 vlist绑定到曲线上。
  • 设置了一些图表的显示样式,如网格线、刻度颜色、背景颜色等。
  • 最后调用 AxisChange 方法刷新轴。

2). 定时器刷新曲线 (ChartTimer_Tick 方法):

  • ChartTimer_Tick方法中,通过定时器每隔一定时间触发,模拟生成随机速度数据,并将新的数据点添加到 vlist 中。
  • 每次添加新数据后,更新时间 time 的值,并调用 AxisChange 方法和 Refresh方法刷新曲线。

3). Form1 构造函数:

  • 在构造函数中,初始化 ZedGraph 控件并启动定时器,每隔一定时间刷新曲线。

4). Form1_Load 方法:

  • 在 Form1_Load 方法中,弹出一个消息框显示 “Hello world!”。
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
using ZedGraph;namespace WindowsFormsApp1
{public partial class Form1 : Form{//定时器刷新曲线Timer ChartTimer;//时间int time = 30;//记录曲线值PointPairList vlist = new PointPairList();public Form1(){InitializeComponent();//初始化ZedGraphInitZedGraph();ChartTimer = new Timer(){Interval = 300,};ChartTimer.Tick += ChartTimer_Tick;ChartTimer.Start();}private void Form1_Load(object sender, EventArgs e){MessageBox.Show("Hello world!");}#region 初始化图表控件private void InitZedGraph(){GraphPane myPane = myZedGraph.GraphPane;myPane.IsAlignGrids = true;myPane.Title.Text = "测试速度";myPane.XAxis.Title.Text = "时间";myPane.YAxis.Title.Text = "速度";for (int i = 0; i < 30; i++){double time = (double)i;double acceleration = 2.0;double velocity = acceleration * time;vlist.Add(time, velocity);}//生成一条红色的菱形样式曲线,将曲线和值vlist绑定//生成速度图例LineItem myCurve = myPane.AddCurve("速度", vlist, Color.Red, SymbolType.Diamond);//填充白色myCurve.Symbol.Fill = new Fill(Color.White);//显示X的网格线myPane.XAxis.MajorGrid.IsVisible = true;//设置Y轴刻度为红色myPane.YAxis.Scale.FontSpec.FontColor = Color.Red;myPane.YAxis.Title.FontSpec.FontColor = Color.Red;//隐藏Y轴对面的刻度显示myPane.YAxis.MajorTic.IsOpposite = false;myPane.YAxis.MinorTic.IsOpposite = false;// 不显示Y轴的0刻度线myPane.YAxis.MajorGrid.IsZeroLine = false;myPane.YAxis.MajorGrid.IsVisible = true;myPane.YAxis.MajorGrid.Color = Color.Red;//设置刻度范围myPane.YAxis.Scale.Align = AlignP.Inside;myPane.YAxis.Scale.Max = 100;myPane.YAxis.Scale.MaxAuto = true;//设置chart的背景颜色myPane.Chart.Fill = new Fill(Color.White, Color.LightGoldenrodYellow, 45.0f);//刷新轴myZedGraph.AxisChange();}#endregion/// <summary>/// 刷新曲线/// </summary>/// <param name="sender"></param>/// <param name="e"></param>private void ChartTimer_Tick(object sender, EventArgs e){//随机数据模拟Random random = new Random();double v = random.Next(30, 60);//添加新的数据vlist.Add(time, v);time += 2;//曲线刷新myZedGraph.AxisChange();myZedGraph.Refresh();}}
}

运行结果,动态增加点:
在这里插入图片描述

数据点和线等属性可以调整:
在这里插入图片描述

6、需求升级
客户不想看到这么多数据,只想看到最新的前三十条数据怎么做呢?
方法1 判断数据是否超过30,大于30之后每添加新的数据就把最前面的一个数据移除掉
方法2 不需要移除数据,更新X轴的范围,让其只绘制前面30个数据。这个方法需要知道30个数据X轴的具体值是多少。

方法1:修改定时器刷新函数ChartTimer_Tick(object sender, EventArgs e)
1). 随机数据模拟:

  • 首先通过 Random 类生成一个随机速度值 v ,范围在 30 到 60 之间。

2). 添加新的数据:

  • 使用 vlist.Add(time, v) 将新的数据点添加到 vlist 中,其中 time 是时间值,每个点的时间间隔为 2。

3). 保留最新的 30 个数据:

  • 在 if (vlist.Count > 30) 的条件判断中,当数据点数量超过 30 个时,通过 vlist.RemoveAt(0) 移除最早的数据点,以保持数据点数量为最新的 30 个。

4). 曲线刷新:

  • 最后调用 AxisChange 方法和 Refresh 方法刷新曲线,确保新的数据点能够正确显示在图表中。

这段代码实现了在不断更新数据点的同时保留最新的 30 个数据点,确保图表中显示的数据点数量不会无限增长。这样可以有效管理数据点的数量,避免数据量过大导致图表显示效果不佳。

 /// <summary>/// 刷新曲线/// </summary>/// <param name="sender"></param>/// <param name="e"></param>private void ChartTimer_Tick(object sender, EventArgs e){//随机数据模拟Random random = new Random();double v = random.Next(30, 60);//添加新的数据vlist.Add(time, v);time += 2;#region 方法1if (vlist.Count > 30){// 保留最新的30个数据vlist.RemoveAt(0);}#endregion//曲线刷新myZedGraph.AxisChange();myZedGraph.Refresh();}

结果如下:可以看到数据量一直保持在30个,前面的数据会被移除掉。
在这里插入图片描述
方法2:
1). 随机数据模拟:

  • 首先通过 Random 类生成一个随机速度值 v ,范围在 30 到 60 之间。

2). 添加新的数据:

  • 使用 vlist.Add(time, v) 将新的数据点添加到 vlist 中,其中 time 是时间值,每个点的时间间隔为 2。

3). 更新数据点的时间间隔:

  • 每次添加新数据后,更新时间 time 的值,确保每个数据点的时间间隔为 2。

4). 方法1 (注释部分):

  • 这部分代码是一种方法来保留最新的 30 个数据点,当数据点数量超过 30 个时,移除最早的数据点。

5). 方法2:

  • 这部分代码是另一种方法来限制数据点数量为 30 个,并更新X轴的显示范围。
  • 当数据点数量达到或超过 30 个时,设置X轴的最大值为当前时间 time ,并根据每个点的时间间隔计算出X轴的最小值,以确保只显示最新的 30 个数据点。

6). 曲线刷新:

  • 最后调用 AxisChange 方法和 Refresh 方法刷新曲线,确保新的数据点能够正确显示在图表中。

这段代码实现了在不断更新数据点的同时限制数据点数量为最新的 30 个,并根据数据点的时间间隔更新X轴的显示范围。这样可以保持图表中显示的数据点为最新的数据,同时避免数据点数量过多导致图表混乱。

 /// <summary>/// 刷新曲线/// </summary>/// <param name="sender"></param>/// <param name="e"></param>private void ChartTimer_Tick(object sender, EventArgs e){//随机数据模拟Random random = new Random();double v = random.Next(30, 60);//添加新的数据vlist.Add(time, v);//每个点的时间间隔time += 2;#region 方法1//if (vlist.Count > 30)//{// 保留最新的30个数据//    vlist.RemoveAt(0);//}#endregion#region 方法2if (vlist.Count >= 30){//更新X轴的显示范围myZedGraph.GraphPane.XAxis.Scale.Max = time;//每个点的时间间隔myZedGraph.GraphPane.XAxis.Scale.Min = time - (30 * 2);}#endregion//曲线刷新myZedGraph.AxisChange();myZedGraph.Refresh();}

运行如下:这个效果就看着比较连续,没有太多空旷的地方
在这里插入图片描述

四、ZedGraph的高端应用

ZedGraph的图表种类、属性很多,可以搜索相关实际高端应用,学习一下这个控件的强大功能的使用场景。
在这里插入图片描述

五、、总结

这篇文章是关于 ZedGraph 图表库的介绍和应用指南。文章主要包括以下内容:

  1. ZedGraph介绍:介绍了 ZedGraph 是一个用于绘制图表和图形的开源.NET图表库,具有丰富的功能和灵活性,适用于各种类型的图表,如折线图、柱状图、饼图等。同时列出了 ZedGraph 的特点和缺点,并提到了在不同版本之间的差异。

  2. ZedGraph官网:提供了 ZedGraph 的官方网址,用户可以在该网站上找到库文件的下载和使用示例。

  3. ZedGraph的应用:详细介绍了如何在 WinForm 项目中使用 ZedGraph 库,包括下载库文件、引用和添加控件等步骤。同时给出了示例代码,展示了如何在 Windows 窗体应用程序中绘制速度随时间变化的曲线图。

  4. 需求升级:针对客户需求升级,只展示最新的前三十条数据,提供了两种方法来实现这一需求。方法一是保留最新的 30 个数据点,方法二是更新X轴的显示范围,只绘制前面 30 个数据点。提供了相应的代码和运行结果展示。

  5. 总结:文章对整个内容进行了总结,概括了 ZedGraph 的特点、官网地址、应用方法以及需求升级的实现方式。为读者提供了全面的了解和使用指导。

如果你喜欢我的文字,还有一个专门输出心情类文字的地方:(wx)搜索:llxxmev

相关文章:

【.NET全栈】ZedGraph图表库的介绍和应用

文章目录 一、ZedGraph介绍ZedGraph的特点ZedGraph的缺点使用注意事项 二、ZedGraph官网三、ZedGraph的应用四、ZedGraph的高端应用五、、总结 一、ZedGraph介绍 ZedGraph 是一个用于绘制图表和图形的开源.NET图表库。它提供了丰富的功能和灵活性&#xff0c;可以用于创建各种…...

vivado 设计调试

设计调试 对 FPGA 或 ACAP 设计进行调试是一个多步骤迭代式流程。与大多数复杂问题的处理方式一样 &#xff0c; 最好先将 FPGA 或 ACAP 设计调试流程细分为多个小部分 &#xff0c; 以便集中精力使设计中的每一小部分能逐一正常运行 &#xff0c; 而不是尝试一次性让整 个…...

Python3 replace()函数使用详解:字符串的艺术转换

博主猫头虎的技术世界 &#x1f31f; 欢迎来到猫头虎的博客 — 探索技术的无限可能&#xff01; 专栏链接&#xff1a; &#x1f517; 精选专栏&#xff1a; 《面试题大全》 — 面试准备的宝典&#xff01;《IDEA开发秘籍》 — 提升你的IDEA技能&#xff01;《100天精通鸿蒙》 …...

【C++】用红黑树封装map和set

我们之前学的map和set在stl源码中都是用红黑树封装实现的&#xff0c;当然&#xff0c;我们也可以模拟来实现一下。在实现之前&#xff0c;我们也可以看一下stl源码是如何实现的。我们上篇博客写的红黑树里面只是一个pair对象&#xff0c;这对于set来说显然是不合适的&#xff…...

一些好玩的东西

这里写目录标题 递归1.递归打印数组和链表?代码实现原理讲解二叉树的 前 中 后 序位置 参考文章 递归 1.递归打印数组和链表? 平常我们打印数组和链表都是 迭代 就好了今天学到一个新思路–>不仅可以轻松正着打印数组和链表 , 还能轻松倒着打印(用的是二叉树的前中后序遍…...

微电网优化:基于巨型犰狳优化算法(Giant Armadillo Optimization,GAO)的微电网优化(提供MATLAB代码)

一、微电网优化模型 微电网是一个相对独立的本地化电力单元&#xff0c;用户现场的分布式发电可以支持用电需求。为此&#xff0c;您的微电网将接入、监控、预测和控制您本地的分布式能源系统&#xff0c;同时强化供电系统的弹性&#xff0c;保障您的用电更经济。您可以在连接…...

java锁

乐观锁 乐观锁是一种乐观思想&#xff0c;即认为读多写少&#xff0c;遇到并发写的可能性低&#xff0c;每次去拿数据的时候都认为别人不会修改&#xff0c;所以不会上锁&#xff0c;但是在更新的时候会判断一下在此期间别人有没有去更新这个数据&#xff0c;采取在写时先读出…...

QA测试开发工程师面试题满分问答6: 如何判断接口功能正常?从QA的角度设计测试用例

判断接口功能是否正常的方法之一是设计并执行相关的测试用例。下面是从测试QA的角度设计接口测试用例的一些建议,包括功能、边界、异常、链路、上下游和并发等方面: 通过综合考虑这些测试维度,并设计相应的测试用例,可以更全面地评估接口的功能、性能、安全性、数据一致…...

vue 双向绑定

双向绑定&#xff1a;双方其中一方改变&#xff0c;另外一方也会跟着改变。 data() { return {inputValue: ,list: [],message: hello,checked: true,radio: ,select: [],options: [{text: A, value:{value: A}},{text: B, value:{value: B}},{text: C, value:{value: C}}], }…...

python--异常处理

异常处理 例一&#xff1a; try: #可能出现异常代码 except&#xff1a; #如果程序异常&#xff0c;则立刻进入这儿 [finally: #不管是否捕获异常&#xff0c;finally语法快必须要执行&#xff01;&#xff01;&#xff01; #资源关闭&#xff0c;等各种非常重要的操作&…...

element-ui result 组件源码分享

今日简单分享 result 组件的源码实现&#xff0c;主要从以下三个方面&#xff1a; 1、result 组件页面结构 2、result 组件属性 3、result 组件 slot 一、result 组件页面结构 二、result 组件属性 2.1 title 属性&#xff0c;标题&#xff0c;类型 string&#xff0c;无默…...

VRRP虚拟路由实验(思科)

一&#xff0c;技术简介 VRRP&#xff08;Virtual Router Redundancy Protocol&#xff09;是一种网络协议&#xff0c;用于实现路由器冗余&#xff0c;提高网络可靠性和容错能力。VRRP允许多台路由器共享一个虚拟IP地址&#xff0c;其中一台路由器被选为Master&#xff0c;负…...

SpringBoot通用模块--文件上传开发(阿里云OSS)

文件上传&#xff0c;是指将本地图片、视频、音频等文件上传到服务器上&#xff0c;可以供其他用户浏览或下载的过程。文件上传在项目中应用非常广泛&#xff0c;我们经常发抖音、发朋友圈都用到了文件上传功能。 实现文件上传服务&#xff0c;需要有存储的支持&#xff0c;那…...

Fecify 商品标签功能

关于商品标签 商品标签是指商家可以在展示商品时&#xff0c;自己创建一个自定义标签&#xff0c;可自定义某个关键词或短语。这样顾客在浏览商城时&#xff0c;只需要通过标签就能看到更直观的展示信息。 商品标签可以按照用户的属性、行为、偏好等进行分类&#xff0c;标签要…...

openstack中windows虚拟机时间显示异常问题处理

文章目录 一、问题描述二、元数据信息总结 一、问题描述 openstack创建出windows虚拟机的时候&#xff0c;发现时间和当前时间相差8小时&#xff0c;用起来很难受。 参考&#xff1a;https://www.cnblogs.com/hraa0101/p/11365238.html 二、元数据信息 通过设置镜像的元数据…...

很牛的一套仓库管理系统,免费复用【带源码】

今天给大家分享一套基于SpringbootVue的仓库管理系统源码&#xff0c;在实际项目中可以直接复用。(免费提供&#xff0c;文末自取) ​一、系统运行图&#xff08;设计报告和接口文档&#xff09; 1、登陆页面 2、物品信息管理 3、设计报告包含接口文档 二、系统搭建视频教程 …...

Spark 部署与应用程序交互简单使用说明

文章目录 前言步骤一&#xff1a;下载安装包Spark的目录和文件 步骤二&#xff1a;使用Scala或PySpark Shell本地 shell 运行 步骤3:理解Spark应用中的概念Spark Application and SparkSessionSpark JobsSpark StagesSpark Tasks 转换、立即执行操作和延迟求值窄变换和宽变换 S…...

【二分查找】Leetcode 点名

题目解析 LCR 173. 点名 算法讲解 1. 哈希表 class Solution { public:int takeAttendance(vector<int>& nums) {map<int, int> Hash;for(auto n : nums) Hash[n];for(int i 0; i < nums[nums.size() - 1]; i){if(Hash[i] 0)return i;}return nums.si…...

JS中的运算符

1.&& 逻辑与 &&会从左到右执行表达式&#xff0c;直到某个表达式的运行结果返回false,如果全部为true,则返回最后一个中表达式的执行结果 console.log(1 && 2) // 2 console.log(1&&10&&15) // 15 console.log(1&&0&&am…...

Webots常用的执行器(Python版)

文章目录 1. RotationalMotor2. LinearMotor3. Brake4. Propeller5. Pen6. LED 1. RotationalMotor # -*- coding: utf-8 -*- """motor_controller controller."""from controller import Robot# 实例化机器人 robot Robot()# 获取基本仿真步长…...

【python异步多线程】异步多线程爬虫代码示例

claude生成的python多线程、异步代码示例&#xff0c;模拟20个网页的爬取&#xff0c;每个网页假设要0.5-2秒完成。 代码 Python多线程爬虫教程 核心概念 多线程&#xff1a;允许程序同时执行多个任务&#xff0c;提高IO密集型任务&#xff08;如网络请求&#xff09;的效率…...

Java求职者面试指南:Spring、Spring Boot、MyBatis框架与计算机基础问题解析

Java求职者面试指南&#xff1a;Spring、Spring Boot、MyBatis框架与计算机基础问题解析 一、第一轮提问&#xff08;基础概念问题&#xff09; 1. 请解释Spring框架的核心容器是什么&#xff1f;它在Spring中起到什么作用&#xff1f; Spring框架的核心容器是IoC容器&#…...

脑机新手指南(七):OpenBCI_GUI:从环境搭建到数据可视化(上)

一、OpenBCI_GUI 项目概述 &#xff08;一&#xff09;项目背景与目标 OpenBCI 是一个开源的脑电信号采集硬件平台&#xff0c;其配套的 OpenBCI_GUI 则是专为该硬件设计的图形化界面工具。对于研究人员、开发者和学生而言&#xff0c;首次接触 OpenBCI 设备时&#xff0c;往…...

Cilium动手实验室: 精通之旅---13.Cilium LoadBalancer IPAM and L2 Service Announcement

Cilium动手实验室: 精通之旅---13.Cilium LoadBalancer IPAM and L2 Service Announcement 1. LAB环境2. L2公告策略2.1 部署Death Star2.2 访问服务2.3 部署L2公告策略2.4 服务宣告 3. 可视化 ARP 流量3.1 部署新服务3.2 准备可视化3.3 再次请求 4. 自动IPAM4.1 IPAM Pool4.2 …...

UE5 音效系统

一.音效管理 音乐一般都是WAV,创建一个背景音乐类SoudClass,一个音效类SoundClass。所有的音乐都分为这两个类。再创建一个总音乐类&#xff0c;将上述两个作为它的子类。 接着我们创建一个音乐混合类SoundMix&#xff0c;将上述三个类翻入其中&#xff0c;通过它管理每个音乐…...

StarRocks 全面向量化执行引擎深度解析

StarRocks 全面向量化执行引擎深度解析 StarRocks 的向量化执行引擎是其高性能的核心设计&#xff0c;相比传统行式处理引擎&#xff08;如MySQL&#xff09;&#xff0c;性能可提升 5-10倍。以下是分层拆解&#xff1a; 1. 向量化 vs 传统行式处理 维度行式处理向量化处理数…...

鸿蒙Navigation路由导航-基本使用介绍

1. Navigation介绍 Navigation组件是路由导航的根视图容器&#xff0c;一般作为Page页面的根容器使用&#xff0c;其内部默认包含了标题栏、内容区和工具栏&#xff0c;其中内容区默认首页显示导航内容&#xff08;Navigation的子组件&#xff09;或非首页显示&#xff08;Nav…...

Copilot for Xcode (iOS的 AI辅助编程)

Copilot for Xcode 简介Copilot下载与安装 体验环境要求下载最新的安装包安装登录系统权限设置 AI辅助编程生成注释代码补全简单需求代码生成辅助编程行间代码生成注释联想 代码生成 总结 简介 尝试使用了Copilot&#xff0c;它能根据上下文补全代码&#xff0c;快速生成常用…...

如何优雅地绕过限制调用海外AI-API?反向代理与API中转技术详解​

阅读时长​​ | 8分钟 ​​适用读者​​ | 需要跨境调用OpenAI等AI服务的开发者/企业 ​​一、问题背景&#xff1a;为什么需要代理&#xff1f;​​ 最近在技术社区看到这样的求助&#xff1a; "公司服务器在国内&#xff0c;但业务需要调用OpenAI接口&#xff0c;直接访…...

PySide6 GUI 学习笔记——常用类及控件使用方法(多行文本控件QTextEdit)

文章目录 PySide6.QtWidgets.QTextEdit 应用举例概述核心特性常用方法文本内容操作光标和选择操作格式和样式查找功能视图控制状态设置常用信号 代码示例示例说明1. 基本设置2. 文本格式化功能3. 功能按钮4. 信号处理 PySide6.QtWidgets.QTextEdit 应用举例 概述 QTextEdit 是…...