« パソコンが遅くなった OS:Windows7 <解決しました> | トップページ | PIC マイコンの I/O ピン動作実験 <スイッチで LED 点灯> »

2011年9月22日 (木)

C# Chart コントロールのサンプルプログラム <1.散布図 , 2.温度計もどき , 3.ロジアナもどき , 4.座標軸 >

C# のChartコントロールを使ってグラフを描画するサンプルプログラム。

バージョン:Visual C# 2010


■散布図 (XYプロット。scatter diagram
Photo

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

  private void plot() {
     Series series1 = new Series("y = x*x");
     Series series2 = new Series("y = 5*x+20");
     for (int x = 1; x < 10; x++)  {
         series1.Points.AddXY(x, x * x);
         series2.Points.AddXY(x, 5 * x + 20);
     }
     {
         series1.Color = Color.Red;
         series1.MarkerSize = 15;
         series1.MarkerStyle = System.Windows.Forms.DataVisualization.Charting.MarkerStyle.Diamond;
         series1.IsValueShownAsLabel = true;
         series1.LabelForeColor = Color.Blue;
         series1.ChartType = SeriesChartType.Line;
// グラフ形状
     }
     {
         series2.Color = Color.Blue;
         series2.MarkerColor = Color.Blue;
         series2.MarkerSize = 10;
         series2.MarkerStyle = System.Windows.Forms.DataVisualization.Charting.MarkerStyle.Circle;
         series2.ChartType = SeriesChartType.Line;
// グラフ形状
     }
     {
         chart1.Series.Clear();
         chart1.Series.Add(series1);
         chart1.Series.Add(series2);
         chart1.ChartAreas[0].BackColor = Color.LightCyan;
     }
     {
         Axis ax = chart1.ChartAreas[0].AxisX;
         ax.MajorGrid.LineColor = Color.LightGray;
         Axis ay = chart1.ChartAreas[0].AxisY;
         ay.MajorGrid.LineColor = Color.LightGray;
     }
  }
}


■温度計もどき
Chart

   public partial class test : UserControl
    {
        readonly Series mSeries = new Series("温度");
        public test() {
            InitializeComponent();

            initializeChart();
            setDummyData();
        }

        void initializeChart() {
            {
// Y軸の属性設定
                Axis ay = chart1.ChartAreas[0].AxisY;
                ay.Minimum = 0;                                 
// 最低     0℃
                ay.Maximum = 40;                               
// 最高    40℃
                ay.LabelStyle.Interval = 10;                  
// 温度数値の間隔
                ay.MajorGrid.Interval = ax.Maximum;
                ay.MinorGrid.Enabled = true;
                ay.MinorGrid.Interval = 5;                     
// 目盛線 の間隔
                ay.MinorGrid.LineColor = Color.FromArgb(230, 230, 230);
                ay.MajorTickMark.Enabled = false;
                ay.MinorTickMark.Enabled = false;
            }
            {
// X軸の属性設定
                Axis ax = chart1.ChartAreas[0].AxisX;
                ax.LabelStyle.Enabled = false;
                ax.MajorGrid.Interval = 2;
                ax.MajorTickMark.Enabled = false;
            }
            {
                mSeries.Points.Add(0);                           
// 初期温度 0℃
                mSeries.Color = Color.LightSalmon;          
// 棒グラフの色
                mSeries["MinPixelPointWidth"] = "15";      
// 棒グラフの幅の最小値
                mSeries.IsValueShownAsLabel = true;
                mSeries.LabelForeColor = Color.Red;
            }
            {
                chart1.Series.Add(mSeries);
                chart1.BackColor = SystemColors.Control;                     
// グラフ外側の色
                chart1.ChartAreas[0].BackColor = SystemColors.Control;
// 背景色 グラフ内部
                chart1.Legends.Clear();                                              
// 凡例を非表示にする
            }
        }

        private void setDummyData()  {
            Task.Factory.StartNew(delegate  {
                for (int i = 0; i < 35; i+=2) {
                    if (InvokeRequired) {
                        Invoke((Action)delegate() { mSeries.Points.Clear(); mSeries.Points.Add(i % 40); });
                        System.Threading.Thread.Sleep(500);
                    }
                }

            });
        }
    }


■ロジック波形 / デジタル波形 / StepLine

"START"ボタンで"3 input"波形が動きます。

Stepline_2

using System;
using System.Drawing;
using System.Windows.Forms;
using System.Windows.Forms.DataVisualization.Charting;
using System.Threading.Tasks;

 

namespace test {
    public partial class Form1 : Form {

        public Boolean[] CSB { private get; set; }  // chip select
        public Boolean[] SCK { private get; set; }  // serial clock
        public Boolean[] OUT { private get; set; } // output
        public Boolean[] IN { private get; set; }     // input
        Series mSeriesInputdata;                       // 入力データのSeries値
         const int mDataLength = 45;                  // データ数
        Series mCursor = new Series("cursor");  // タイムカーソル
        Boolean mCheckFirst = true;

 

        public Form1() {
            InitializeComponent();
            myInitialize();
        }
        void myInitialize() {
            {
// chartのXY座標軸設定
                Axis ax = chart1.ChartAreas[0].AxisX;
                ax.Minimum = 0;
                ax.Maximum = mDataLength;
                ax.Interval = 4;
                ax.MajorGrid.LineColor = Color.LightGray;

 

                Axis ay = chart1.ChartAreas[0].AxisY;
                ay.MajorGrid.Enabled = false;
                ay.MajorTickMark.Interval = 100;
                ay.LabelStyle.Enabled = false;
                ay.Minimum = -.5;
            }
            {
// プロットするデータ
                CSB = new Boolean[mDataLength];
                SCK = new Boolean[mDataLength];
                OUT = new Boolean[mDataLength];
                IN = new Boolean[mDataLength];
                Random random = new
System.Random();
                for (int i = 0; i < mDataLength; i++) {

                    CSB[i] = (i < 4 || mDataLength - 6 < i);
                    SCK[i] = i % 2 != 0 & !CSB[i];
                    OUT[i] = i % 4 != 0 & !CSB[i];
                    IN[i] = 5 < r
andom.Next(0, 10) & !CSB[i];
                }
            }
            plot();                                              
// chart 表示
        }

        //
        // ボタンを押すと入力データを表示
        //

        private void
button1_Click(object sender, EventArgs e) {
            Task.Factory.StartNew(() => { myStart(); });
        }

        public void myStart() {
            Invoke((Action)delegate() { mSeriesInputdata.Points.Clear(); });
            for (int i = 0; i < IN.Length; i++) {
                printInputdata(i);                           
// ダミー入力値表示
                printCursor(i);                                // カーソル表示
                System.Threading.Thread.Sleep(200);
            }
        }

        //
        // データをchartにプロット
        //

        public void plot() {
            if (InvokeRequired) {
                Invoke((Action)delegate() { plot(); });
                return;
            }
            chart1.Series.Clear();
            {
// 出力
                Series s0 = booleanArrayToSeries(CSB,
"0 chip select", Color.SkyBlue, 3);
                Series s1 = booleanArrayToSeries(SCK,
"1 serial clock", Color.Green, 2);
                Series s2 = booleanArrayToSeries(OUT,
"2 output"      , Color.Red, 1);
                chart1.Series.Add(s0);
                chart1.Series.Add(s1);
                chart1.Series.Add(s2);
            }
            {
// 入力
                mSeriesInputdata = booleanArrayToSeries(IN, "3 input", Color.Blue, 0);
                mSeriesInputdata.Points.Clear();
                chart1.Series.Add(mSeriesInputdata);
            }
        }

        //
        // Boolean配列データを Chart 用の Series に変換
        //

        Series booleanArrayToSeries(Boolean[] data, string name, Color color, int position) {
            Series serie = new Series(name);
            serie.Color = color;
            serie.ChartType =
SeriesChartType.StepLine // グラフ形状
            for (int i = 0; i < data.Length; i++) {                  
// プロットデータ
                int x = i;
                int y = (data[x] ? 1 : 0) + 2 * position;
                serie.Points.AddXY(x, y);
            }
            return serie;
        }

        //
        // タイムカーソル
        //

        void printCursor(int x) {
            if (InvokeRequired) {
                Invoke((Action)delegate() { printCursor(x); });
                return;
            }
            mCursor.Points.Clear();
            mCursor.Points.AddXY(x, -1);
            mCursor.Points.AddXY(x, 7.5);
            if (mCheckFirst) {
                mCursor.ChartType = SeriesChartType.Line;
                mCursor.BorderWidth = 2;                           
// 線の太さ
                mCursor.Color = Color.BlueViolet;
                chart1.Series.Add(mCursor);
                mCheckFirst = false;
            }
        }
       //
        // 入力値表示
        //

        void printInputdata(int i) {
            if (InvokeRequired) {
                Invoke((Action)delegate() { printInputdata(i); });
                return;
            }
            mSeriesInputdata.Points.AddXY(i, (IN[i] ? 1 : 0) + 0);
        }
    }
}

・関連記事:気圧センサーSPC1000を使用した気圧測定


■座標軸 / 目盛り
Chartparts_3

サンプルコード

           Series serie = new Series("abc");
            {
// データ
                for (int i = 0; i < 20; i++)  {
                    serie.Points.AddXY(i, i*i);
                }
                chart1.Series.Clear();
                chart1.Series.Add(serie);
                serie.Color = Color.Blue;
                serie.ChartType = SeriesChartType.Line;
// グラフ形状
            }
            {
                chart1.BackColor = Color.LightYellow;
               
// chart1.ChartAreas[0].BackColor = SystemColors.Control; // 背景色 グラフ内部
         
}
            { 
// X軸
                Axis ax = chart1.ChartAreas[0].AxisX;
                ax.LabelStyle.ForeColor = Color.LightGreen;

                ax.LineColor = Color.Purple;
                ax.Interval = 20;
                ax.LineWidth = 2;
                ax.Minimum = 0;
                ax.Maximum = 20;

                ax.Minimum = 0;
                ax.MajorGrid.LineColor = Color.Blue;
                ax.MajorGrid.LineWidth = 2;
                ax.MajorGrid.Interval = 10;

                ax.MinorGrid.LineColor = Color.LightSkyBlue;
                ax.MinorGrid.Enabled = true;
                ax.MinorGrid.LineWidth = 10;
                ax.MinorGrid.Interval = 5;

                ax.MajorTickMark.LineColor = Color.Red;
                ax.MajorTickMark.Interval = 6;
                ax.MajorTickMark.LineWidth = 5;
                ax.MajorTickMark.TickMarkStyle = TickMarkStyle.InsideArea;

                ax.MinorTickMark.LineColor = Color.Pink;
                ax.MinorTickMark.Interval = 3;
                ax.MinorTickMark.Enabled = true;
                ax.MinorTickMark.LineWidth = 12;
                ax.MinorTickMark.TickMarkStyle = TickMarkStyle.InsideArea;
            }
            { 
// Y軸
                Axis ay = chart1.ChartAreas[0].AxisY;
                ay.LabelStyle.Enabled = false;
                ay.MajorGrid.Enabled = false;
            }


■リンク
・madn > グラフの種類 (グラフ コントロール)
@IT総合トップ > @IT CORE > Insider.NET > .NET TIPS > [ASP.NET]チャート・コントロールで円グラフ/ドーナツ・グラフを作成するに

« パソコンが遅くなった OS:Windows7 <解決しました> | トップページ | PIC マイコンの I/O ピン動作実験 <スイッチで LED 点灯> »

パソコン・インターネット」カテゴリの記事