草庐IT

C# chart实时曲线

浪店河畔 2023-04-19 原文

主要介绍使用C#的winform如何进行实时数据的动态加载的实例,并通过设置参考线来显示数据曲线的分布

文章目录


前言

通过C#的winForm开发的一款实时曲线,动态显示数据,能够设置参考线

 

一、运行效果

二、代码

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 System.Windows.Forms.DataVisualization.Charting;

namespace ChartControl
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }

        private void Form1_Load(object sender, EventArgs e)
        {
            InitChart();
            timer1.Interval = 1000;
        }

        /// 

        /// 图表对象
        /// 

        Series series;
        /// 

        /// x轴最大点数
        /// 

        int xValue = 60;
        /// 

        /// 开始时间
        /// 

        DateTime sDate;

        Random rand = new Random();

        /*增加队列*/
        Queue<double> thinkness = new Queue<double>(30) ;
        Queue<double> recordTime = new Queue<double>(30);

        private void InitChart()
        {
            series = chart1.Series[0];
            //清空原来数据缓存
            series.Points.Clear();

            //定义图表大小尺寸
            chart1.Width = Width - 90;
            chart1.Height = Height - 110;

            //以下按照先绘制chartArea、然后再绘制Series的步骤画图
            //chartArea背景颜色
            chart1.BackColor = Color.Azure;

            //X轴设置
            //chart1.ChartAreas[0].AxisX.Title = "时间";
            chart1.ChartAreas[0].AxisX.TitleAlignment = StringAlignment.Near;
            chart1.ChartAreas[0].AxisX.MajorGrid.Enabled = false;//不显示竖着的分割线

          
            chart1.ChartAreas[0].AxisX.LabelStyle.Format = "HH:mm:ss"; //X轴显示的时间格式,HH为大写时是24小时制,hh小写时是12小时制

            chart1.ChartAreas[0].AxisX.IntervalType = DateTimeIntervalType.Seconds;//如果是时间类型的数据,间隔方式可以是秒、分、时
            //chart1.ChartAreas[0].AxisX.Interval = DateTime.Parse("00:05:00").Millisecond;//间隔为5分钟
            chart1.ChartAreas[0].AxisX.Interval = DateTime.Parse("00:00:02").Second;//TODO 测试--间隔为5秒
            //SetAxisX(2);
            //SetAxisXReal();
            //Y轴设置
            //chart1.ChartAreas[0].AxisY.Title = "数据点";
            chart1.ChartAreas[0].AxisY.TitleAlignment = StringAlignment.Center;
            chart1.ChartAreas[0].AxisY.MajorGrid.Enabled = true;//显示横着的分割线
            chart1.ChartAreas[0].AxisY.Minimum = 0;
            chart1.ChartAreas[0].AxisY.Maximum = 90;
            chart1.ChartAreas[0].AxisY.Interval = 20;

            //Series绘制
            //chart1.Series[0].LegendText = "瞬时速度";
            series.ChartType = SeriesChartType.Spline;
            
            series.XValueType = ChartValueType.DateTime;
            series.IsValueShownAsLabel = true;//显示数据点的值
            series.MarkerStyle = MarkerStyle.Diamond;//显示标记,菱形
        }

 private void button1_Click(object sender, EventArgs e)
        {
             timer1.Start();
        }

        private void timer1_Tick(object sender, EventArgs e)
        {
            //获取实时数据最近的60个数据
            UpdateChartData();
            //重新绘制曲折线图
            this.chart1.Series[0].Points.Clear();
            this.chart1.Series[0].Points.DataBindXY(recordTime, thinkness);
            //for (int i = 0; i < thinkness.Count; i++)
            //{
            //    this.chart1.Series[0].Points.AddXY(recordTime.ElementAt(i), thinkness.ElementAt(i));

            //}

        }

        private void button2_Click(object sender, EventArgs e)
        {
            timer1.Stop();
        }

        private void UpdateChartData()
        {
            if (thinkness.Count > 60)
            {
                for (int i = 0; i < 2; i++)
                {
                    thinkness.Dequeue();
                    recordTime.Dequeue();
                }

            }
            else
            {
                thinkness.Enqueue(rand.Next(20, 70));
                recordTime.Enqueue(DateTime.Now.ToOADate());
            }

        }

        private void ReferenceLine(double refernceValue,Chart charContor)
        {
            /* 绘制参考线*/
            double max = refernceValue;
            StripLine stripMax = new StripLine();
            stripMax.Text = string.Format("最大:{0:F}", max);//展示文本
            stripMax.BackColor = Color.Yellow;//背景色
            stripMax.Interval = 0;//间隔
            stripMax.IntervalOffset = max;//偏移量
            stripMax.StripWidth = 0.001;//线宽
            stripMax.ForeColor = Color.White;//前景色
            stripMax.TextAlignment = StringAlignment.Near;//文本对齐方式
            charContor.ChartAreas[0].AxisY.StripLines.Add(stripMax);//添加到ChartAreas中
        }

        private void button3_Click(object sender, EventArgs e)
        {
            ReferenceLine(Convert.ToDouble(textBox1.Text.Trim()), chart1);
        }
    }
}
 

改项目主要有两个重点,一、是队列的生成。二、队列绑定到chart的X轴和Y轴

有关C# chart实时曲线的更多相关文章

  1. (附源码)vue3.0+.NET6实现聊天室(实时聊天SignalR) - 2

    参考文章搭建文章gitte源码在线体验可以注册两个号来测试演示图:一.整体介绍  介绍SignalR一种通讯模型Hub(中心模型,或者叫集线器模型),调用这个模型写好的方法,去发送消息。  内容有:    ①:Hub模型的方法介绍    ②:服务器端代码介绍    ③:前端vue3安装并调用后端方法    ④:聊天室样例整体流程:1、进入网站->调用连接SignalR的方法2、与好友发送消息->调用SignalR的自定义方法 前端通过,signalR内置方法.invoke()  去请求接口3、监听接受方法(渲染消息)通过new signalR.HubConnectionBuilder().on

  2. ruby-on-rails - 在 Rails 应用程序的前端获取实时日志 - 2

    在Rails3.x应用程序中,我正在使用net::ssh并向远程pc运行一些命令。我想向用户的浏览器显示实时日志。比如,如果两个命令在net中运行::ssh执行即echo"Hello",echo"Bye"被传递然后"Hello"应该在执行后立即显示在浏览器中。这是代码我在ruby​​onrails应用程序中使用ssh连接和运行命令Net::SSH.start(@servers['local'],@machine_name,:password=>@machine_pwd,:timeout=>30)do|ssh|ssh.open_channeldo|channel|channel.requ

  3. ruby-on-rails - Rails 如何为 Google Charts 构建数据结构 - 2

    我想使用googlecharts创建一个如下所示的图表:GoogleChart.pie_400x200('TacoBell'=>0,'Mediterranean'=>2,'Shivas'=>5)给定一个对象Results(name,count)。如何为GoogleCharts的结构创建一个对象,如上所示?谢谢 最佳答案 从您在评论中列为@results的结果对象开始,以下应该有效:GoogleChart.pie_400x200(@results.map{|r|{r[:title]=>r[:percentage]}})

  4. ruby-on-rails - Ruby on Rails 3 - 公共(public)实时聊天 - 2

    我想使用Rails3创建一个公共(public)实时聊天应用程序。我在rails2上找到了一些例子。任何人都可以告诉你一个很好的例子/教程来使用rails3开发一个实时聊天应用程序。 最佳答案 当我试图在我的Rails3应用程序中实现一个公共(public)和私有(private)聊天系统时,我遇到了几个障碍。我查看了faye、juggernaut、node.js等。最终在尝试了几种方法之后,我能够实现一个运行良好的系统:1)我开始关注Railscast260中的faye消息传递视频指南。正如DevinM所提到的,我能够快速设置一个

  5. Ruby 曲线拟合(对数回归)包 - 2

    我正在寻找进行对数回归(对数方程的曲线拟合)的Rubygem或库。我试过statsample(http://ruby-statsample.rubyforge.org/),但它似乎没有我要找的东西。有人有什么建议吗? 最佳答案 尝试使用“statsample”gem。您可以使用类似的方法执行指数、对数、幂、正弦或任何其他变换。我希望这有帮助。require'statsample'#IndependentVariablex_data=[Math.exp(1),Math.exp(2),Math.exp(3),Math.exp(4),Ma

  6. Ruby/openssl:将椭圆曲线点八位字节字符串转换为 OpenSSL::PKey::EC::Point - 2

    我正在尝试编写Ruby代码来检查我发现的特定消息上的椭圆曲线数字签名算法(ECDSA)签名here.问题是我不知道如何将公钥的八位字节字符串转换为OpenSSL::PKey::EC::Point目的。如果我用C写这个,我会把八位字节字符串传递给OpenSSL的o2i_ECPublicKey,它做的事情接近我想要的,实际上被referenceimplementation使用.但是,我搜索了sourcecodeofRuby(MRI)而且它不包含对o2i_ECPublicKey的调用,所以我不知道如何在不编写C扩展的情况下使用Ruby中的该函数。这是十六进制的八位字节字符串。它只是一个0x0

  7. ubuntu18.04部署DXSLAM,CNN+VSLAM,CPU实时运行 - 2

    一、下载源代码打开终端,输入命令克隆仓库gitclonehttps://github.com/raulmur/DXSLAM.gitDXSLAM二、配置环境WehavetestedthelibraryinUbuntu16.04andUbuntu18.04,butitshouldbeeasytocompileinotherplatforms.C++11orC++0xCompilerPangolinOpenCVEigen3Dbow、Fbowandg2o(IncludedinThirdpartyfolder)tensorflow(1.12)作者提供了一个脚本build.sh来编译Thirdparty目

  8. ruby-on-rails - ruby rails : What Reporting and/or Charting Tools Are Available? - 2

    关闭。这个问题不符合StackOverflowguidelines.它目前不接受答案。我们不允许提问寻求书籍、工具、软件库等的推荐。您可以编辑问题,以便用事实和引用来回答。关闭8年前。Improvethisquestion我刚开始使用Ruby/Rails,想知道Rails开发人员使用什么在Rails站点上提供报告和/或图表。在ASP.NET中,我使用DevExpress中的工具,但我对Rails生态系统的了解还不够,无法知道哪些工具可用。任何见解将不胜感激。

  9. javascript - Chart.js - 在不使用工具提示的情况下向气泡图元素添加文本/标签? - 2

    问题有没有什么方法可以在不始终显示工具提示的情况下为Chart.js气泡图中的单个气泡添加标签?背景图表数据用于可视化我们的项目积压工作。有关每个项目的其他详细信息,即项目名称,都在一个表中。我们之前使用的是谷歌图表,只是在气泡上包含了表格中的行号,这样您就可以进行匹配。使用Chart.js,我只能得到气泡和工具提示。我已经查看了以下相关问题,但他们建议的解决方案需要始终显示工具提示。我在工具提示中获得了更多信息,并且一直显示它们会使图表变得非常困惑。Canindividualbubblesinachartjsbubblecharthavelabels?Howtoshowtooltip

  10. javascript - 我可以使用 Webpack 将 Google Charts 注入(inject)我的项目吗? - 2

    有什么方法可以在React应用程序中使用GoogleCharts吗?我找到了react-google-charts我已经开始工作了,但它似乎缺少很多GoogleCharts的API,或者至少没有记录。我也有点害羞地在生产中使用NPM统计数据显示在过去一天只有~400次下载的东西。但是,我无法在NPM上单独找到GoogleCharts,也无法像我最初预期的那样简单地从“google-charts”导入图表。我的下一个想法是看看是否有办法将库作为全局变量导入。1)我该怎么做2)如果可能的话,我如何将它包含在像import{Line}from'???'这样的react组件中

随机推荐