jingil 2020-07-28 09:48 采纳率: 100%
浏览 1830
已采纳

C# Chart工具绘制时间动态曲线

如图所示,本人初学c#原想做一个随时间动态更新,画面不断左移的折线图:
图片说明
目前的情况:每当x轴坐标挤到原点时,y轴被挤压缩短;因为x轴最值长度是坐标间距的整数倍,当x轴坐标挤到原点时,x轴多显示1个坐标,x轴被挤压缩短。经过原点后,x、y轴又被拉伸到原尺寸。
图片说明

请问:如何在不取消显示x轴坐标的情况下,使得折线图不会因为x轴坐标的左移过程被挤压变形?

//初始load部分
            chart1.ChartAreas[0].AxisX.LabelStyle.Format = "hh:mm:ss.ff";
            chart1.ChartAreas[0].AxisX.IntervalType = DateTimeIntervalType.Milliseconds;
            chart1.ChartAreas[0].AxisX.MajorGrid.IntervalType = DateTimeIntervalType.Milliseconds;
//Timer部分
            chart1.ChartAreas[0].AxisX.Minimum = DateTime.Now.AddSeconds(-5).ToOADate();
            chart1.ChartAreas[0].AxisX.Maximum = DateTime.Now.ToOADate();
            chart1.ChartAreas[0].AxisX.Interval = 500;
                        chart1.Series[0].Points.AddXY(DateTime.Now.ToOADate(), Convert.ToDouble(Temperature));

提前谢谢!

  • 写回答

4条回答 默认 最新

  • threenewbee 2020-07-28 14:37
    关注

    结合定时器就可以,类似如下代码

    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Windows.Forms;
    using System.Windows.Forms.DataVisualization.Charting;
    
    namespace DynamicGraph
    {
        public partial class Form1 : Form
        {
            DateTime dt_begin;
            DateTime dt_now;
            public Form1()
            {
                InitializeComponent();
                InitChart();
                dt_begin = System.DateTime.Now;
            }
            Queue<int> Q1 = new Queue<int>();
            public void InitChart()
            {
    
                Series series = chart1.Series[0];
                // 画样条曲线(Spline)
                series.ChartType = SeriesChartType.Spline;
                // 线宽2个像素
                series.BorderWidth = 2;
                // 线的颜色:红色
                series.Color = System.Drawing.Color.Red;
                // 图示上的文字            
                series.IsVisibleInLegend = false;   //隐藏图示上的文字          
                // 设置显示范围
                ChartArea chartArea = chart1.ChartAreas[0];
                chartArea.AxisX.Minimum = 1;
                chartArea.AxisX.Maximum = 100;
                chartArea.AxisY.Minimum = 0d;
                chartArea.AxisY.Maximum = 100d;
            }
            Random r = new Random();
            int temp;
            public void Draw()
            {
                this.chart1.Series[0].Points.Clear();
                temp = r.Next(0, 100);
                Q1.Enqueue(temp);
                if (Q1.Count > 100)
                    Q1.Dequeue();
                for (int i = 0; i < Q1.Count; i++)
                {
                    chart1.Series[0].Points.AddY(Q1.ElementAt(i));
                }
            }
            private void button1_Click(object sender, EventArgs e)
            {
                timer1.Enabled = true;
            }
            TimeSpan ts;
            private void timer1_Tick(object sender, EventArgs e)
            {
                Draw();
                dt_now = System.DateTime.Now;
                ts = (dt_now - dt_begin);
                label2.Text = "系统运行时长:" + ts.Days + " 天 " + 
                    ts.Hours + " 小时 " + ts.Minutes + " 分钟 " + ts.Seconds + " 秒";
                label1.Text = dt_now.ToString();
            }
        }
    }
    
    

    https://download.csdn.net/download/weixin_43074474/12270566

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(3条)

报告相同问题?

问题事件

  • 已采纳回答 10月11日

悬赏问题

  • ¥15 用visualstudio2022创建vue项目后无法启动
  • ¥15 x趋于0时tanx-sinx极限可以拆开算吗
  • ¥500 把面具戴到人脸上,请大家贡献智慧
  • ¥15 任意一个散点图自己下载其js脚本文件并做成独立的案例页面,不要作在线的,要离线状态。
  • ¥15 各位 帮我看看如何写代码,打出来的图形要和如下图呈现的一样,急
  • ¥30 c#打开word开启修订并实时显示批注
  • ¥15 如何解决ldsc的这条报错/index error
  • ¥15 VS2022+WDK驱动开发环境
  • ¥30 关于#java#的问题,请各位专家解答!
  • ¥30 vue+element根据数据循环生成多个table,如何实现最后一列 平均分合并