首页 > 编程语言 >C#:winform使用chart控件绘制折线图,时间轴可缩放

C#:winform使用chart控件绘制折线图,时间轴可缩放

时间:2024-07-26 16:51:16浏览次数:12  
标签:控件 00 sender 缩放 AxisX Chart chart1 时间轴 ChartAreas

Chart坐标轴横轴为时间,纵轴是数值
如果只是一次性绘图,那么遍历一遍数据即可
如果想连续绘制(比如按照时间更新绘制),就需要一个Timer控件来更新绘图的数据。

以下为项目代码:
GUI界面添加一个Chart和一个timer即可

 

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 chartForTest
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }

        private void Form1_Load(object sender, EventArgs e)
        {
            Init_Chart();//初始化chart组件有关属性
            timer1.Interval = 1000;//timer1用来更新图像,每秒增加一个点
            timer1.Start();//窗口初始化完成即开始绘制
        }
        private void Init_Chart()
        {
            #region chart1  
            chart1.Series[0].IsValueShownAsLabel = true;//让点集0在图像上显示数值
            chart1.Series[0].SmartLabelStyle.Enabled = true;
            chart1.Series[0].XValueType = ChartValueType.DateTime;//坐标轴type改为时间

            //去掉滚动条的按钮
            chart1.ChartAreas[0].AxisX.ScrollBar.ButtonStyle = ScrollBarButtonStyles.None;
            chart1.ChartAreas[0].AxisX.ScrollBar.IsPositionedInside = false;
            chart1.ChartAreas[0].AxisX.ScrollBar.Size = 20;
            chart1.ChartAreas[0].AxisX.ScaleView.MinSizeType = DateTimeIntervalType.Seconds;
            chart1.ChartAreas[0].AxisX.ScaleView.SizeType = DateTimeIntervalType.Seconds;
            chart1.ChartAreas[0].AxisX.ScaleView.Size = 20;
            chart1.ChartAreas[0].AxisX.ScaleView.MinSize = 15;
            chart1.ChartAreas[0].AxisX.ScaleView.SmallScrollMinSize = 1;
            chart1.ChartAreas[0].AxisX.ScaleView.SmallScrollMinSizeType = DateTimeIntervalType.Seconds;
            chart1.ChartAreas[0].AxisX.IntervalType = DateTimeIntervalType.Seconds;
            //这个interval可以用来修改显示间隔
            chart1.ChartAreas[0].AxisX.Interval = DateTime.Parse("00:00:01").Second;
            chart1.ChartAreas[0].AxisX.TitleAlignment = StringAlignment.Near;
            chart1.ChartAreas[0].AxisX.MajorGrid.Enabled = true;
            chart1.ChartAreas[0].AxisX.MajorGrid.LineWidth = 1;
            chart1.ChartAreas[0].AxisX.MajorGrid.LineColor = Color.LightGray;
            //显示格式为时:分:秒
            chart1.ChartAreas[0].AxisX.LabelStyle.Format = "HH:mm:ss";
            chart1.ChartAreas[0].AxisY.IntervalAutoMode = IntervalAutoMode.VariableCount;
            chart1.ChartAreas[0].AxisY.MajorGrid.LineColor = Color.LightGray;
            #endregion
        }


        private void timer1_Tick(object sender, EventArgs e)
        {
            //让滚动条滚动到最新位置
            this.chart1.ChartAreas[0].AxisX.ScaleView.Scroll(ScrollType.Last);
            string now = DateTime.Now.ToLongTimeString();
            //转换time的格式用于输出
            DateTime time = DateTime.Parse(now);
            //在点集0(serials[0])中加入新的点XY
            //TIP:如果你使用数组存放要绘制的点,每次绘图从上一次绘制结束的位置开始即可
            //不需要每次画图都从第一个点开始绘制
            this.chart1.Series[0].Points.AddXY(time, DateTime.Now.Second);
        }

    }
}

 

测试图:

PLUS:如果你还想让Chart实现时间坐标轴的缩放怎么做?

方便起见,我这里使用滚轮上下滑动

1.需要一个修改坐标轴间隔的事件

		//记录当前的缩放位置,便于控制范围
        private int IntervalNow = 0;
        //可以使用代码控制,也可以像我这样使用固定的数组(其实这样更方便)
        private string[] deltas = new string[] {"00:00:01",
                                                "00:00:10",
                                                "00:00:30",
                                                "00:01:00",
                                                "00:05:00",
                                                "00:10:00",
                                                "00:30:00",
                                                "00:45:00",
                                                "01:00:00"};
		void myMouseWheel(object sender, MouseEventArgs e)
        {
            //if(sender == ch)
            if (e.Delta > 0)
            {//放大
            	//由于之前项目有不止一个Chart,所以我这里使用了(Chart)(sender)来获取触发事件的chart对象,省去判断,你们也可以把它直接换成chart1
                if (((Chart)(sender)).ChartAreas[0].AxisX.ScaleView.Size >= 0.5)
                    ((Chart)(sender)).ChartAreas[0].AxisX.ScaleView.Size = ((Chart)(sender)).ChartAreas[0].AxisX.ScaleView.Size * 0.5;

                if (Convert.ToInt32(((Chart)(sender)).ChartAreas[0].AxisX.ScaleView.Size) >= 20)
                {
                    --IntervalNow;
                    if (IntervalNow < 0)
                        IntervalNow = 0;

                    ((Chart)(sender)).ChartAreas[0].AxisX.Interval = DateTime.Parse(deltas[IntervalNow]).Second;

                }
                else
                {
                    IntervalNow = 0;
                    ((Chart)(sender)).ChartAreas[0].AxisX.Interval = DateTime.Parse(deltas[IntervalNow]).Second;
                }

            }
            else
            {
                if (((Chart)(sender)).ChartAreas[0].AxisX.ScaleView.Size <= 100000)
                    ((Chart)(sender)).ChartAreas[0].AxisX.ScaleView.Size = ((Chart)(sender)).ChartAreas[0].AxisX.ScaleView.Size * 2;

                if (((Chart)(sender)).ChartAreas[0].AxisX.ScaleView.Size >= 20)
                {
                    ++IntervalNow;
                    if (IntervalNow >= 9)
                        IntervalNow = 8;

                    ((Chart)(sender)).ChartAreas[0].AxisX.Interval = DateTime.Parse(deltas[IntervalNow]).Second;
                }
                else
                {
                    IntervalNow = 0;
                    ((Chart)(sender)).ChartAreas[0].AxisX.Interval = DateTime.Parse(deltas[IntervalNow]).Second;
                }
            }
        }

2.将Chart与缩放事件关联起来

chart1.MouseWheel += new MouseEventHandler(myMouseWheel);

3.运行试试看

最后附上带缩放控制的完整代码:

GUI界面需要的仍只是添加一个Chart和Timer即可(name分别为chart1和timer1)

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 chartForTest
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }

        private void Form1_Load(object sender, EventArgs e)
        {
            Init_Chart();//初始化chart组件有关属性
            timer1.Interval = 1000;//timer1用来更新图像,每秒增加一个点
            timer1.Start();//窗口初始化完成即开始绘制
            chart1.MouseWheel += new MouseEventHandler(myMouseWheel);
        }
        private void Init_Chart()
        {
            #region chart1  
            chart1.Series[0].IsValueShownAsLabel = true;//让点集0在图像上显示数值
            chart1.Series[0].SmartLabelStyle.Enabled = true;
            chart1.Series[0].XValueType = ChartValueType.DateTime;//坐标轴type改为时间

            //去掉滚动条的按钮
            chart1.ChartAreas[0].AxisX.ScrollBar.ButtonStyle = ScrollBarButtonStyles.None;
            chart1.ChartAreas[0].AxisX.ScrollBar.IsPositionedInside = false;
            chart1.ChartAreas[0].AxisX.ScrollBar.Size = 20;
            chart1.ChartAreas[0].AxisX.ScaleView.MinSizeType = DateTimeIntervalType.Seconds;
            chart1.ChartAreas[0].AxisX.ScaleView.SizeType = DateTimeIntervalType.Seconds;
            chart1.ChartAreas[0].AxisX.ScaleView.Size = 20;
            chart1.ChartAreas[0].AxisX.ScaleView.MinSize = 15;
            chart1.ChartAreas[0].AxisX.ScaleView.SmallScrollMinSize = 1;
            chart1.ChartAreas[0].AxisX.ScaleView.SmallScrollMinSizeType = DateTimeIntervalType.Seconds;
            chart1.ChartAreas[0].AxisX.IntervalType = DateTimeIntervalType.Seconds;
            //这个interval可以用来修改显示间隔
            chart1.ChartAreas[0].AxisX.Interval = DateTime.Parse("00:00:01").Second;
            chart1.ChartAreas[0].AxisX.TitleAlignment = StringAlignment.Near;
            chart1.ChartAreas[0].AxisX.MajorGrid.Enabled = true;
            chart1.ChartAreas[0].AxisX.MajorGrid.LineWidth = 1;
            chart1.ChartAreas[0].AxisX.MajorGrid.LineColor = Color.LightGray;
            //显示格式为时:分:秒
            chart1.ChartAreas[0].AxisX.LabelStyle.Format = "HH:mm:ss";
            chart1.ChartAreas[0].AxisY.IntervalAutoMode = IntervalAutoMode.VariableCount;
            chart1.ChartAreas[0].AxisY.MajorGrid.LineColor = Color.LightGray;
            #endregion
        }


        private void timer1_Tick(object sender, EventArgs e)
        {
            //让滚动条滚动到最新位置
            this.chart1.ChartAreas[0].AxisX.ScaleView.Scroll(ScrollType.Last);
            string now = DateTime.Now.ToLongTimeString();
            //转换time的格式用于输出
            DateTime time = DateTime.Parse(now);
            //在点集0(serials[0])中加入新的点XY
            //TIP:如果你使用数组存放要绘制的点,每次绘图从上一次绘制结束的位置开始即可
            //不需要每次画图都从第一个点开始绘制
            this.chart1.Series[0].Points.AddXY(time, DateTime.Now.Second);
        }

        //记录当前的缩放位置,便于控制范围
        private int IntervalNow = 0;
        //可以使用代码控制,也可以像我这样使用固定的数组(其实这样更方便)
        private string[] deltas = new string[] {"00:00:01",
                                                "00:00:10",
                                                "00:00:30",
                                                "00:01:00",
                                                "00:05:00",
                                                "00:10:00",
                                                "00:30:00",
                                                "00:45:00",
                                                "01:00:00"};
        void myMouseWheel(object sender, MouseEventArgs e)
        {
            if (e.Delta > 0)
            {//放大
                if (((Chart)(sender)).ChartAreas[0].AxisX.ScaleView.Size >= 0.5)
                    ((Chart)(sender)).ChartAreas[0].AxisX.ScaleView.Size = ((Chart)(sender)).ChartAreas[0].AxisX.ScaleView.Size * 0.5;

                if (Convert.ToInt32(((Chart)(sender)).ChartAreas[0].AxisX.ScaleView.Size) >= 20)
                {
                    --IntervalNow;
                    if (IntervalNow < 0)
                        IntervalNow = 0;

                    ((Chart)(sender)).ChartAreas[0].AxisX.Interval = DateTime.Parse(deltas[IntervalNow]).Second;

                }
                else
                {
                    IntervalNow = 0;
                    ((Chart)(sender)).ChartAreas[0].AxisX.Interval = DateTime.Parse(deltas[IntervalNow]).Second;
                }

            }
            else
            {
                if (((Chart)(sender)).ChartAreas[0].AxisX.ScaleView.Size <= 100000)
                    ((Chart)(sender)).ChartAreas[0].AxisX.ScaleView.Size = ((Chart)(sender)).ChartAreas[0].AxisX.ScaleView.Size * 2;

                if (((Chart)(sender)).ChartAreas[0].AxisX.ScaleView.Size >= 20)
                {
                    ++IntervalNow;
                    if (IntervalNow >= 9)
                        IntervalNow = 8;

                    ((Chart)(sender)).ChartAreas[0].AxisX.Interval = DateTime.Parse(deltas[IntervalNow]).Second;
                }
                else
                {
                    IntervalNow = 0;
                    ((Chart)(sender)).ChartAreas[0].AxisX.Interval = DateTime.Parse(deltas[IntervalNow]).Second;
                }

            }
        }
    }

}

 

标签:控件,00,sender,缩放,AxisX,Chart,chart1,时间轴,ChartAreas
From: https://www.cnblogs.com/dzjl/p/18325721

相关文章

  • 如何解决“必须首先将控件添加到页面”的问题。机队错误?
    我正在尝试使用flet制作janggi(国际象棋变体)游戏。由于我必须在多个地方使用该板,因此我创建了一个名为janggiBoard的类,它继承自ft.Stack。我想对片段使用拖放操作,因此我按照flet文档中的Solitaire教程进行操作。当我尝试执行“move_on_top”部分时出现问题。在Solitaire......
  • 《最新出炉》系列入门篇-Python+Playwright自动化测试-54- 上传文件(input控件) - 上篇
    1.简介在实际工作中,我们进行web自动化的时候,文件上传是很常见的操作,例如上传用户头像,上传身份证信息等。所以宏哥打算按上传文件的分类对其进行一下讲解和分享。2.上传文件的API(input控件)Playwright是一个现代化的自动化测试工具,它支持多种浏览器和操作系统,可以帮助开发人员和......
  • 界面控件Telerik UI for WPF 2024 Q2亮点 - 全新的AIPrompt组件
    TelerikUIforWPF拥有超过100个控件来创建美观、高性能的桌面应用程序,同时还能快速构建企业级办公WPF应用程序。UIforWPF支持MVVM、触摸等,创建的应用程序可靠且结构良好,非常容易维护,其直观的API将无缝地集成VisualStudio工具箱中。本文将介绍界面组件TelerikUIforWPF在今......
  • Camstar中Grid控件怎么用代码去删除选中的行 并且清掉勾选框
    if(Page.EventArgument=="FloatingFrameSubmitParentPostBackArgument"){if(Page.DataContract.GetValueByName("IsRefresh")==null){//从这里开始ListallRows=newList();//将guid_one中的所有数据存储到allRows集合中if(guid_one.DataisDataTable......
  • Avalonia-实现控件出现时上升效果(简单)
    Avalonia实践-实现控件出现时上升效果最近在学习Avalonia,看到WinUI里有个经典的出现时上升样式,拿来练练手同时学习Style和Animation目标效果是下面这样Demo使用版本:Avalonia(11.0.10)CommunityToolkit.Mvvm(8.2.1)简单用CommunityToolKit.MVVM写了一下代码MainW......
  • 界面控件开发包DevExpress v24.1.4全新发布
    DevExpress Universal拥有.NET开发需要的所有平台控件,包含600多个UI控件、报表平台、DevExpressDashboardeXpressApp框架、适用于VisualStudio的CodeRush等一系列辅助工具。屡获大奖的软件开发平台DevExpress近期重要版本v24.1已正式发布,该版本拥有众多新产品和数十个具有......
  • winform--分页控件
    新建一个用户组件,直接上代码:/**作者:pengyanzhang*邮箱:[email protected]*博客:https://www.cnblogs.com/zpy1993-09*时间:2024-04-1218:36*/publicpartialclassCPPageComponent:FlowLayoutPanel{#region事件......
  • Android笔试面试题AI答之控件Views(3)
    答案仅供参考,来自文心一言目录1.如何在ListView间添加分割线?方法1:在XML布局文件中设置方法2:在Java代码中设置注意事项2.如何实现ListView的逐行显示?1.使用`Handler`和`postDelayed()`方法2.监听滚动事件3.自定义Adapter4.使用`RecyclerView`代替`ListVie......
  • C# 基础控件
    一、设置窗体清晰度择当前项目,单击鼠标右键,选择【添加】——【类】;选择【应用程序清单文件】;打开刚才建立的清单文件app.manifest,解开<applicationxmlns="urn:schemas-microsoft-com:asm.v3">的注释;   二、DataGridViewRowHeadersVisible:false隐藏第一个空白列......
  • 分辨率 缩放比
     win系统调整显示器缩放比与浏览器缩放比对webPC端项目的影响https://juejin.cn/post/7325647896048730153?searchId=202407212053040F1493DC6D415F8F770B 悟空和大王2024-01-201,048阅读5分钟 专栏: js/ts/css相关 win用户为什么会手动调整显示器缩放比......