본문 바로가기

코딩정보/C#

[C#] C#으로 MS차트 작성하기

반응형

안녕하세요.

 

코딩하는남자 입니다

 

이번 블로그 내용은 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;
      }
    }
}

 

 

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

 

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

 

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

 

 

반응형