ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [C#] C#으로 MS차트 작성하기
    취미생활/C# 2019. 6. 11. 16:09
    반응형

    안녕하세요.

     

    코딩하는남자 입니다

     

    이번 블로그 내용은 C#을 통해 차트를 작성할경우 보통 상용 API를 통해 구현하게 되는데요

     

     

     

    저희 같은 서민들은 그걸 구입할 돈이 없지요ㅋ

     

    그래서 열심히 인터넷 검색을 통해서 무료로 사용할 수 있는 차트가 있어서 소개해 드릴려고 합니다

     

    마도 MS Chart 인데요.

     

    비쥬얼스튜디오에서 개발하는 C#에서 사용하기 참 좋은 API라고 생각합니다

     

    혹시 자체 개발을 통해 어떠한 통계나 수치를 표현하고 싶으시면 한번 시도해 보시면 좋을거 같습니다

     

    C#으로 구현하기 위해 간단한 예제를 같이 올려 드리니 분석 해서 나만의 차트를 구현해 보시기 바랍니다

     

    [Souce Code]

     

    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.Windows.Forms.DataVisualization.Charting;
    using System.Diagnostics;
    
    
    
    namespace MSChart_Controls_Test{
         public partial class Form1 : Form
         {
             Chart chart = null;
    
            public Form1()
            {
                InitializeComponent();
    
                ChartDataInput();
             }
    
    
    
            private void ChartDataInput()
            {
                //x,y축에 사용될 값을 먼저 준비 한다
                //x축 값
                string[] xValues1 = { "Korea", "Frence", "Canada", "Germany", "Italy" };
    
                //y축 값
                double[] yValues1 = { 67.66, 89.57, 82.44, 85.24, 87.93 };
                double[] yValues2 = { 77.66, 89.57, 92.44, 95.24, 97.93 };
    
                //차트를 변수에 담아주고
                chart = this.chart1;
    
                //계열을 초기화 처음에 Series1이 기본으로 들어가기 때문에 삭제해 준다
                chart.Series.Clear();
    
                //계열을 새로 생성해서
                Series s1 = new Series("international");
                Series s2 = new Series("International2");
    
                //계열을 추가해 준다
               chart.Series.Add(s1);
               chart.Series.Add(s2);
    
              //추가된 계열에 값을 넣어준다
              //x축 값은 하나만 있으면 되기 때문에 처음부터 데이터를 하나만 준비한다
              //만약 s2애 x축값도 만들어서 DataBindXY로 값을 넣어도 x축은 변경되지 않는다
    
              //한번설정하면 Y축은 값이 변경되어도 X축은 값이 변경되지 않는다
              s1.Points.DataBindXY(xValues1, yValues1);
              s2.Points.DataBindY(yValues2);
    
              //차트타입을 막대로 한다
              s1.ChartType = SeriesChartType.Column;
    
             //범례를 보여준다 
             chart.Legends[0].Enabled = true;
    
             //테두리선굵기 (선종류로 해야 차이가 나타난다)
             s1.BorderWidth = 12;
    
            //색 변경
            s1.Color = Color.OrangeRed;
    
            //계열에 값표시
            s1.IsValueShownAsLabel = true;
    
            //계열에 그라데이션을 준다
            s1.BackGradientStyle = GradientStyle.VerticalCenter;
            s2.BackGradientStyle = GradientStyle.Center;
    
           //아래 두줄을 풀변 상하 이중축이되고
           //s1.XAxisType = AxisType.Primary; //기본축
           //s2.XAxisType = AxisType.Secondary; //보조축
    
          //아래 두줄을 풀면 좌우 이중축이된다
          //s1.YAxisType = AxisType.Primary;
         //s2.YAxisType = AxisType.Secondary;
    
         //차트의 테두리선을 붉은색의 연결된 선으로 그리는데 선의 넓이는 1이다
         chart.BorderlineColor = Color.Red;
         chart.BorderlineDashStyle = ChartDashStyle.Solid;
         chart.BorderlineWidth = 1;
    
         //차트의 내부 테두리 선을 파란색의 연결된 선으로 그리는데 선의 넓이는 1이다
         chart.ChartAreas[0].BorderColor = Color.Blue;
         chart.ChartAreas[0].BorderDashStyle = ChartDashStyle.Solid;
         chart.ChartAreas[0].BorderWidth = 1;
    
         //차트의 내부 테두리 선을 변경
         chart.ChartAreas[0].AxisX.LineColor = Color.Blue;
         chart.ChartAreas[0].AxisY.LineColor = Color.Blue;
         //chart.ChartAreas[0].AxisX.Enabled = AxisEnabled.False;
         //chart.ChartAreas[0].AxisY.Enabled = AxisEnabled.False;
    
         //차트의 배경 격자선을 변경
         chart.ChartAreas[0].AxisX.MajorGrid.LineColor = Color.Blue;
         chart.ChartAreas[0].AxisY.MajorGrid.LineColor = Color.Blue;
         chart.ChartAreas[0].AxisX.MajorGrid.Enabled = false;
         chart.ChartAreas[0].AxisY.MajorGrid.LineDashStyle = ChartDashStyle.Dash;
    
         //차트의 외부로 삐져나온 선을 변경
         chart.ChartAreas[0].AxisX.MajorTickMark.LineColor = Color.Red;
         chart.ChartAreas[0].AxisY.MajorTickMark.LineColor = Color.Red;
         chart.ChartAreas[0].AxisX.MajorTickMark.Enabled = false;
         chart.ChartAreas[0].AxisY.MajorTickMark.Enabled = false;
    
          //첫번재 계열의 네번째 그래프만 파란색으로 변경
         s1.Points[4].Color = Color.Blue;
       }
    
    private void ChartDataInput2()
        {
           //차트를 변수에 담아놓고
           chart = this.chart1;
    
           //계열도 변수에 담는다
           Series series1 = new Series("Test");
           Series series2 = new Series("Test2");
    
           //xValue를 준비
           string[] xValue = { "국어","영어","수학" };
    
           //계열을 초기화
           chart.Series.Clear();
    
           //계열을 추가
           chart.Series.Add(series1);
           chart.Series.Add(series2);
    
           //계열을 변수에 담지 않고 이렇게 바로 추가해도 된다
    
          //그러나 계열을 이렇게 선언하면 아래처럼 series1변수로 접근하지 못하고 chart.series[0] 또는
    
          //chart.series["Test"] 이렇게 접근해야 한다
           //chart.Series.Add("Test");
          //chart.Series.Add("Test2");
    
          //테두리선굵기 (선종류로 해야 차이가 나타난다)
          series1.BorderWidth = 12;
    
          //색 변경
          series1.Color = Color.OrangeRed;
    
          //차트 모양을 막대로 지정
          series1.ChartType = SeriesChartType.Column;
          series2.ChartType = SeriesChartType.Column;
    
          //테스트 계열에 값을 세개 추가
          series1.Points.AddY(21.7);
          series1.Points.AddY(20);
          series1.Points.AddY(18.5);
    
          //테스트2 계열에 값을 세개 추가
          series2.Points.AddY(22.4);
          series2.Points.AddY(19.2);
          series2.Points.AddY(23.8);
        }
    
         private void button1_Click(object sender, EventArgs e)
         {
    
            //차트를 변수에 담아놓고
           chart = this.chart1;
    
           //차트 모양을 꺽은선으로 변경
           if (chart.Series[0].ChartType == SeriesChartType.Column)
           {
               chart.Series[0].ChartType = SeriesChartType.FastLine;
               chart.Series[1].ChartType = SeriesChartType.FastLine;
            }
            else
            {
              chart.Series[0].ChartType = SeriesChartType.Column;
              chart.Series[1].ChartType = SeriesChartType.Column;
             }
         }
    
         private void button2_Click(object sender, EventArgs e)
         {
           //차트를 변수에 담아놓고
           chart = this.chart1;
    
            //원통형으로 변경
           chart.Series[1].CustomProperties = "DrawingStyle=Cylinder";
    
           //3D
           chart.ChartAreas[0].Area3DStyle.Enable3D = !(chart.ChartAreas[0].Area3DStyle.Enable3D);
         }
    
         private void button3_Click(object sender, EventArgs e)
         {
            //범례를 보여줬다가 안보여줬다가 한다
            this.chart1.Legends[0].Enabled = !(this.chart1.Legends[0].Enabled);
          }
    
          private void button4_Click(object sender, EventArgs e)
          {
            //첫번째 계열을 순환 하면서 가장 큰 계열의 색을 검은색으로 변경한다
            int point = 0;
            int yvalue = 0;
    
            for (int i = 0; i < this.chart1.Series[0].Points.Count; i++)
            {
                Debug.Print(this.chart1.Series[0].Points[i].YValues[0].ToString());
                if (yvalue < (int)this.chart1.Series[0].Points[i].YValues[0])
                {
                    point = i;
                    yvalue = (int)this.chart1.Series[0].Points[i].YValues[0];
                 }
              }
    
            this.chart1.Series[0].Points[point].Color = Color.Black;
          }
        }
    }

     

     

    붙여넣기를 햇더니 코드가 많이 엉망이 됐네요ㅎㅎ

     

    나중에 시간내서 정리하도록 하겠습니다~

     

    그럼 코딩하는남자 였습니다~!

     

     

    반응형
Designed by Tistory.