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

news2025/3/12 1:05:54

文章目录

  • 一、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();

            //初始化ZedGraph
            InitZedGraph();

            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 方法1
            if (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 方法2
            if (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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1569071.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

计算机网络:数据链路层 - 可靠传输协议

计算机网络&#xff1a;数据链路层 - 可靠传输协议 可靠传输概念停止-等待协议 SW回退N帧协议 GBN选择重传协议 SR 可靠传输概念 如下所示&#xff0c;帧在传输过程中受到干扰&#xff0c;产生了误码。接收方的数据链路层&#xff0c;通过真伪中的真检验序列 FCS 字段的值&…

在ArcGIS Pro中优雅的制作荧光图

最近在网上看到了荧光图&#xff0c;觉得挺帅气&#xff0c;去网上查询了怎么制作荧光图&#xff0c;发现大部分都是QGIS的教程&#xff0c;作为ArcGIS的死忠用户&#xff0c;决定在ArcGIS Pro中实现&#xff0c;其实挺简单的。 1、软件&#xff1a;ArcGIS Pro3.0 2、点数据&a…

【RISC-V 指令集】RISC-V 向量V扩展指令集介绍(五)- 向量加载和存储

1. 引言 以下是《riscv-v-spec-1.0.pdf》文档的关键内容&#xff1a; 这是一份关于向量扩展的详细技术文档&#xff0c;内容覆盖了向量指令集的多个关键方面&#xff0c;如向量寄存器状态映射、向量指令格式、向量加载和存储操作、向量内存对齐约束、向量内存一致性模型、向量…

8.list容器的使用

文章目录 list容器1.构造函数代码工程运行结果 2.赋值和交换代码工程运行结果 3.大小操作代码工程运行结果 4.插入和删除代码工程运行结果 5.数据存取工程代码运行结果 6.反转和排序代码工程运行结果 list容器 1.构造函数 /*1.默认构造-无参构造*/ /*2.通过区间的方式进行构造…

如何从 Android 和 iPhone 中的 SIM 卡恢复已删除的联系人 [新]

在手机上&#xff0c;我们经常添加联系人&#xff0c;而很少关心联系人是存储在SIM卡中还是手机中。当我们错误删除SIM卡联系人&#xff0c;或者不当取出插入的SIM卡插入新手机时&#xff0c;那些因业务需要而添加的联系人就会消失。这可能会令人沮丧和困惑。因此&#xff0c;您…

基于springboot实现墙绘产品展示交易平台管理系统项目【项目源码+论文说明】计算机毕业设计

基于springboot实现墙绘产品展示交易平台管理系统演示 摘要 现代经济快节奏发展以及不断完善升级的信息化技术&#xff0c;让传统数据信息的管理升级为软件存储&#xff0c;归纳&#xff0c;集中处理数据信息的管理方式。本墙绘产品展示交易平台就是在这样的大环境下诞生&…

macbook向日葵忘记密码

macbook向日葵忘记密码 问题&#xff1a;1、切换到下面的目录&#xff1a;2、找到配置文件3、删除该配置文件4、然后就正常了 问题&#xff1a; 向日葵忘记密码的话&#xff0c;即使是卸载了重装也需要输入密码&#xff0c;界面一直如下&#xff1a; 1、切换到下面的目录&am…

浅谈TCP(2):流量控制与拥塞控制

上文浅谈TCP&#xff08;1&#xff09;&#xff1a;状态机与重传机制介绍了TCP的状态机与重传机制。本文介绍流量控制&#xff08;Flow Control&#xff0c;简称流控&#xff09;与拥塞控制&#xff08;Congestion Control&#xff09;。TCP依此保障网络的QOS&#xff08;Quali…

sparksql执行流程

1. SparkSQL的自动优化 我们前面的文章已经说过spark RDD定义好后&#xff0c;执行经过DAG sechduler划分号内存管道、逻辑任务&#xff0c;然后经由task scheduler来分配到具体worker来管理运行&#xff0c;RDD的运行会完全按照开发者的代码执行 如果开发者水平有限&#xff…

Transformers in Vision:A Survey 阅读笔记

ACM上的一篇综述&#xff0c;讨论Transformer在CV上的应用。 摘要&#xff1a; Among their salient benefits,Transformers enable modeling long dependencies between inputsequence elements and support parallel processing of sequence as compared to recurrent networ…

MFC通用静态库制作与使用

开发环境VS2013 1、新建工程&#xff0c;选择Win32 Project&#xff0c;命名&#xff0c;选择路径等 2、选择Static library &#xff0c;勾选MFC 3、点击完成。在工程中添加相应的头文件、源文件等通用功能函数或者类。 4、在其他工程引入使用。在使用的工程项目设置中Linker…

C语言-----数据在内存中的存储(1)

1.整数在内存中的存储 我们之前就了解过整数的二进制写法分别有3种&#xff0c;分别为原码&#xff0c;反码&#xff0c;补码。整型在内存中存储的是补码。 原码&#xff0c;反码&#xff0c;补码都有自己的符号位和数值位&#xff0c;符号位为1时&#xff0c;则表示负数&…

AI绘画:使用Stable Diffusion ComfyUI进行换脸:IPAdapter FaceID全面教程

在数字艺术和媒体编辑领域&#xff0c;换脸技术已经成为一种流行且强大的工具。它允许创作者将一个人物的面部特征无缝地转移到另一个人物上&#xff0c;创造出令人信服的视觉作品。Stable Diffusion ComfyUI提供了一个高效的平台&#xff0c;让用户能够轻松地实现换脸。本文将…

python和pip中常见命令和方法

玩python的同学想必没有不用pip的吧&#xff0c;pip是python包管理工具&#xff0c;和Nodejs的npm、Java的maven类似&#xff0c;这些依靠开源力量建立起的庞大软件库极大提高了开发的效率&#xff0c;下面是整理和总结pip中的常见命令和方法。 pip更新版本 python -m pip inst…

图像分割-综述篇

文章目录 图像分割算法类型全卷积FCNSegNetUNetDeeplab v1PSPNetDeeplab v2Deeplab v3Deeplab v3 基于候选区Mask RCNNMS RNN 基于GAN基于RNNReSegViTSwin TransformerSAM(Segment Anything Model) 图像分割算法类型 正如我在目标检测系列中提到的&#xff0c;图像分割&#x…

flutter官方案例context_menus【搭建与效果查看】【省时】

案例地址 https://github.com/flutter/samples/tree/main/context_menus 1&#xff1a;运行查看有什么可以快捷使用的&#xff0c;更新了些什么&#xff0c;可不可以直接复制粘贴 主要内容&#xff1a;在web端中模拟手机类型的点击长按操作&#xff0c;不能直接运行在安卓与io…

代码随想录Day27:回溯算法Part3

Leetcode 39. 组合总和 讲解前&#xff1a; 这道题其实在掌握了之前的组合问题之后再看并不是那么难&#xff0c;其关键就在于我们这道题中没有一个特定需要的组合大小&#xff0c;并且列表中的元素是可以重复使用的&#xff0c;那么比如说给的例子中的 输入: candidates [2…

使用Python获取红某书笔记详情并批量无水印下载

根据红某手最新版 请求接口必须要携带x-s x-s-c x-t,而调用官方接口又必须携带cookie,缺一不可,获取笔记详情可以通过爬取网页的形式获取&#xff0c;虽然也是无水印&#xff0c;但是一些详情信息只能获取大概&#xff0c;并不是详细的数值&#xff0c;因此既不想自己破解x-s x…

【chrome扩展】简 Tab (SimpTab)‘每日一句名言’样式

背景&#xff1a;最初参考“每日诗词”发现总是那几句&#xff0c;可以更换API接口完成“每日一句名言” 声明&#xff1a;本人不会ajax及ccs样式&#xff0c;非专业人士&#xff0c;借助CHATGPT代码生成完成。请友善交流。 每一句名言API: "https://api.xygeng.cn/open…

【MATLAB第102期】基于MATLAB的BRT增强回归树多输入单输出回归预测模型

【MATLAB第102期】基于MATLAB的BRT增强回归树多输入单输出回归预测模型 BRT&#xff0c;即Boosted Regression Trees&#xff08;增强回归树&#xff09;&#xff0c;是一种用于回归问题的集成学习方法。它结合了多个决策树模型&#xff0c;通过逐步改进的方式来提高整体模型的…