C# のChartコントロールを使ってグラフを描画するサンプルプログラム。
バージョン:Visual C# 2010
■散布図 (XYプロット。scatter diagram)
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; } } } |
|
■温度計もどき
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"波形が動きます。
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 < random.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を使用した気圧測定
■座標軸 / 目盛り
サンプルコード
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 点灯> »