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

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

时间:2024-02-25 22:33:53浏览次数:24  
标签:控件 00 sender 缩放 AxisX Chart chart1 时间轴 ChartAreas

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

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);
        }

    }
}


上测试图:
img

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.运行试试看
img

最后附上带缩放控制的完整代码:
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;
                }

            }
        }
    }

}

转载:https://blog.csdn.net/YangZuo_Chester/article/details/89227628?utm_medium=distribute.pc_relevant_bbs_down.none-task--2allfirst_rank_v2rank_v29-2.nonecase&depth_1-utm_source=distribute.pc_relevant_bbs_down.none-task--2allfirst_rank_v2rank_v29-2.nonecase

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

相关文章

  • 视觉软件 VisionPro 与 C# 对接简单说明(包括常用控件)
    视觉软件VisionPro与C#对接简单说明(包括常用控件)C#和VisionPro对接:VisionPro的部分控件是可以直接在C#WinForm里调用的;算法文件在VisionPro平台里编辑好后保存下来也可以通过C#加载调用;下面我们主要说一下C#调用Vpp文件首先我们要先引用VisionPro平台的dll文件,在项目文件......
  • c#控件名称简写
    c#控件名称简写控件名称缩写介绍公共控件Buttonbtn按钮CheckBoxchk复选框CheckedListBoxckl显示一个项列表,其中每一项左侧都有一个复选框ComboBoxcmb下拉列表框DateTimePickerdtp时间控件Labellbl文本列表LinkLabelllb支持超链......
  • C# WinForm中 获得当前鼠标所在控件 或 将窗体中鼠标所在控件名显示在窗体标题上
    C#WinForm中获得当前鼠标所在控件或将窗体中鼠标所在控件名显示在窗体标题上原文地址:http://www.cnblogs.com/08shiyan/archive/2011/04/14/2015758.html/***********************课题:将窗体中鼠标所在控件名显示在窗体标题上*作者:ZAXX*QQ:94027486*本课题可......
  • Airtest结合Poco对控件实施精准截图
    1.前言最近在Q群内发现有个小伙伴提出了一个很有趣的脚本需求,想要实现“通过选择器获取到了控件,然后截图这个控件范围”,根据我们的Airtest的局部截图接口以及poco控件的属性查询接口是可以很快实现的~2.接口查找首先我们需要知道我们应该怎么实现用脚本去进行局部截图,我们可以通......
  • Excel窗体控件笔记
    工作表控件分成2种表单控件(图片上面)ActiveX控件(图片下面)一,表单控件这种如果只是使用代码其实和我们直接在工作表里插入一个图形是一样的效果可以把一些参数直接设置到单元格里,不需要代码辅助,配合公式等可以实现一些自动化效果但是,设置不了一些颜色样式等等,看上去比较素......
  • delphi10.3农历日历控件安装使用
    控件下载,链接: https://pan.baidu.com/s/1-ZJFRMT2z5_kti0LX7bHCw提取码:2anv  Delphi10.3在File菜单下,选择”OPEN…”打开ChnCalendars.dpk文件    打开自带DemoD:\迅雷下载\ChnCalendar3.0Beta20......
  • lazarus3.0 /fpc3.3.1编译某些控件会出现:Error: Forward declaration not solved xxx
    最近用lazarus3.0/fpc3.3.1时发现原来在lazarus2.2.6/fpc3.2.2能编译安装的控件出现类似下面的提示codebot.text.xml.pas(129,10)Error:Forwarddeclarationnotsolved"NewDocument:IDocument;"解决方法:本例子参照DocumentCreate:IDocument,在实现部分编写过程。{$i......
  • C# Winform 为控件添加鼠标悬浮时的提示消息
    https://www.cnblogs.com/whr2071/p/16453901.html 学习自C#鼠标悬浮时,提示信息_20180509很简单也很详细,可直接查看原贴。发在这里主要是记录一下,方便我自己查找。绑定你想要在其上悬浮显示的控件的鼠标悬浮事件在其中创建ToolTip,设置属性,并绑定到该控件---以下就是链接......
  • 文档控件DevExpress Office File API v23.2新版亮点 - 支持SVG
    DevExpressOfficeFileAPI是一个专为C#,VB.NET和ASP.NET等开发人员提供的非可视化.NET库。有了这个库,不用安装MicrosoftOffice,就可以完全自动处理Excel、Word等文档。开发人员使用一个非常易于操作的API就可以生成XLS,XLSx,DOC,DOCx,RTF,CSV和SnapReport等企业级文......
  • delphi7农历日历控件安装使用。
    链接:https://pan.baidu.com/s/1-ZJFRMT2z5_kti0LX7bHCw提取码:2anv  Delphi7在File菜单下,选择”OPEN…”打开ChnCalendars.dpk文件    ......