본문 바로가기
개발언어/C#

[C#] 실시간 라인 차트(그래프) 만들기 2

by 창용이랑 2023. 3. 27.
728x90

[C#]실시간차트

 
//chart 컨트롤
//chart의 series : fast line
//타이머 컨트롤 
//타이머 컨트롤의 interval : 10ms
 
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.Collections;
using System.Windows.Forms.DataVisualization.Charting;


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

        //Y축 값을 무작위로 변환 하기 위해 램덤 클래스 사용 
        private Random random = new Random();
        //private int pointIndex = 0;
        //private int pointIndex2 = 0;
        private long count = 0;

        //시스템 타이머 선언
        //그러나 일반 타이머를 사용해도 차이가 없음
        //이 프로그램에서는 컨트롤 타이머 사용
        System.Timers.Timer timer;

        //폼 로드시 타이머 설정
        private void Form1_Load(object sender, EventArgs e)
        {
            //시스템 타이머 객체 생성
            timer = new System.Timers.Timer();
            //타이머 간격 10ms
            timer.Interval = 10;
            //타이머 동작 설정
            timer.Elapsed += new System.Timers.ElapsedEventHandler(timer_Elapsed);
        }


        //컨트롤 타이머 사용시의 동작
        private void timer1_Tick(object sender, EventArgs e)
        {

            //Chart에 값을 하나 출력
            //X좌표는 0, Y좌표는 2000에서 5000사이의 램덤값
            //옆으로 밀려나가면서 실시간 그래프를 구현
            chart1.Series[0].Points.AddXY(0, random.Next(2000, 5000));
            chart1.Series[1].Points.AddXY(0, random.Next(2000, 5000));


            //X축의 최대값인 1000에 도달하면 0번값을 하나씩 지움
            if (chart1.Series[0].Points.Count > 1000)
            {
                chart1.Series[0].Points.RemoveAt(0);
                chart1.Series[1].Points.RemoveAt(0);

            }

         
            //차트의 X축간격 100, Y축간격 1000
            chart1.ChartAreas[0].AxisX.Interval = 100;
            chart1.ChartAreas[0].AxisY.Interval = 1000;

            //차트의 X축 최소값과 최대값, Y축 최소값과 최대값
            chart1.ChartAreas[0].AxisX.Minimum = 0;
            chart1.ChartAreas[0].AxisX.Maximum = 1000;
            chart1.ChartAreas[0].AxisY.Minimum = 0;
            chart1.ChartAreas[0].AxisY.Maximum = 7000;


            //########################################################################################
            //scrollbar
            //########################################################################################
            //AxisX
            // Set scrollbar enable
            chart1.ChartAreas[0].AxisX.ScrollBar.Enabled = true;
            // Set scrollbar size
            //스크롤 막대 크기는 5픽셀에서 20픽셀 사이여야 합니다.
            chart1.ChartAreas[0].AxisX.ScrollBar.Size = 20;

            // Show small scroll buttons only
            chart1.ChartAreas[0].AxisX.ScrollBar.ButtonStyle = System.Windows.Forms.DataVisualization.Charting.ScrollBarButtonStyles.All;

            // Scrollbars position
            chart1.ChartAreas[0].AxisX.ScrollBar.IsPositionedInside = true;

            // Change scrollbar colors
            chart1.ChartAreas[0].AxisX.ScrollBar.BackColor = Color.LightGray;
            chart1.ChartAreas[0].AxisX.ScrollBar.ButtonColor = Color.Gray;
            chart1.ChartAreas[0].AxisX.ScrollBar.LineColor = Color.Black;

            //AxisY
            // Set scrollbar enable
            chart1.ChartAreas[0].AxisY.ScrollBar.Enabled = true;
            // Set scrollbar size
            //스크롤 막대 크기는 5픽셀에서 20픽셀 사이여야 합니다.
            chart1.ChartAreas[0].AxisY.ScrollBar.Size = 20;

            // Show small scroll buttons only
            chart1.ChartAreas[0].AxisY.ScrollBar.ButtonStyle = System.Windows.Forms.DataVisualization.Charting.ScrollBarButtonStyles.All;

            // Scrollbars position
            chart1.ChartAreas[0].AxisY.ScrollBar.IsPositionedInside = true;

            // Change scrollbar colors
            chart1.ChartAreas[0].AxisY.ScrollBar.BackColor = Color.LightGray;
            chart1.ChartAreas[0].AxisY.ScrollBar.ButtonColor = Color.Gray;
            chart1.ChartAreas[0].AxisY.ScrollBar.LineColor = Color.Black;


        }

        private void _start_Click(object sender, EventArgs e)
        {
            //컨트롤 타이머 시작
            timer1.Start();
            //시스템 타이머 시작
            //timer.Start();
        }

        private void _stop_Click(object sender, EventArgs e)
        {
            //컨트롤 타이머 중지
            timer1.Stop();
            //시스템 타이머 중지
            //timer.Stop();
        }

        #region 시스템 타이머 사용
        //델리게이트 사용
        delegate void TimerEventFiredDelegate();

        void timer_Elapsed(object sender, System.Timers.ElapsedEventArgs e)
        {
            BeginInvoke(new TimerEventFiredDelegate(Work));
        }

        //시스템 타이머 사용시의 동작
        private void Work()
        {

            //수행해야할 작업(UI Thread 핸들링 가능)

            //Chart에 값을 하나 출력
            //X좌표는 0, Y좌표는 2000에서 3000사이의 램덤값
            //옆으로 밀려나가면서 실시간 그래프를 구현
            chart1.Series[0].Points.AddXY(0, random.Next(2000, 3000));
            chart1.Series[1].Points.AddXY(0, random.Next(2000, 3000));



            //X축의 최대값인 1000에 도달하면 0번값을 하나씩 지움
            if (chart1.Series[0].Points.Count > 1000)
            {
                chart1.Series[0].Points.RemoveAt(0);
                chart1.Series[1].Points.RemoveAt(0);
            }

            //차트의 X축간격 100, Y축간격 1000
            chart1.ChartAreas[0].AxisX.Interval = 100;
            chart1.ChartAreas[0].AxisY.Interval = 1000;

            //차트의 X축 최소값과 최대값, Y축 최소값과 최대값
            chart1.ChartAreas[0].AxisX.Minimum = 0;
            chart1.ChartAreas[0].AxisX.Maximum = 1000;
            chart1.ChartAreas[0].AxisY.Minimum = 0;
            chart1.ChartAreas[0].AxisY.Maximum = 7000;


            //########################################################################################
            //scrollbar
            //########################################################################################
            //AxisX
            // Set scrollbar enable
            chart1.ChartAreas[0].AxisX.ScrollBar.Enabled = true;
            // Set scrollbar size
            chart1.ChartAreas[0].AxisX.ScrollBar.Size = 10;

            // Show small scroll buttons only
            chart1.ChartAreas[0].AxisX.ScrollBar.ButtonStyle = System.Windows.Forms.DataVisualization.Charting.ScrollBarButtonStyles.All;

            // Scrollbars position
            chart1.ChartAreas[0].AxisX.ScrollBar.IsPositionedInside = true;

            // Change scrollbar colors
            chart1.ChartAreas[0].AxisX.ScrollBar.BackColor = Color.LightGray;
            chart1.ChartAreas[0].AxisX.ScrollBar.ButtonColor = Color.Gray;
            chart1.ChartAreas[0].AxisX.ScrollBar.LineColor = Color.Black;

            //AxisY
            // Set scrollbar enable
            chart1.ChartAreas[0].AxisY.ScrollBar.Enabled = true;
            // Set scrollbar size
            chart1.ChartAreas[0].AxisY.ScrollBar.Size = 10;

            // Show small scroll buttons only
            chart1.ChartAreas[0].AxisY.ScrollBar.ButtonStyle = System.Windows.Forms.DataVisualization.Charting.ScrollBarButtonStyles.All;

            // Scrollbars position
            chart1.ChartAreas[0].AxisY.ScrollBar.IsPositionedInside = true;

            // Change scrollbar colors
            chart1.ChartAreas[0].AxisY.ScrollBar.BackColor = Color.LightGray;
            chart1.ChartAreas[0].AxisY.ScrollBar.ButtonColor = Color.Gray;
            chart1.ChartAreas[0].AxisY.ScrollBar.LineColor = Color.Black;
        }
        #endregion

        private void _zoominX_Click(object sender, EventArgs e)
        {
            //X축 확대
            chart1.ChartAreas[0].AxisX.ScaleView.Zoom(40, 60);
        }

        private void _zoominY_Click(object sender, EventArgs e)
        {
            //Y축 확대
            chart1.ChartAreas[0].AxisY.ScaleView.Zoom(40, 60);
        }
    }
}
 
 
 
 

출처 : https://m.blog.naver.com/PostView.naver?isHttpsRedirect=true&blogId=madosa3000&logNo=220654353939