やる気駆動型エンジニアの備忘録

WPF(XAML+C#)の話題を中心に.NET/Android/CI やたまに趣味に関するブログです

Windows Forms のChart を使う~SeriesChartType:グラフ系列種別~

最近Windows FormsのChartを使用する機会があったので、備忘録として使い方を残します。

まず今回はChartにどんな種類のグラフが使用できるのか見ていきます。
Chartの系列は"Series"プロパティでアクセスすることができます。
この系列の種類を変えるには、ChartType プロパティを変更すればOKです。
ChartTypeプロパティは、列挙体のSeriesChartType 型ですが、これは以下の種別が定義されています。
なので、ここに定義されているグラフの種類=Chartで表現できる種類 ということです。

  • SeriesChartType定義一覧
種別名 内容
Point ポイント グラフ
FastPoint FastPoint グラフ
Bubble バブル チャート
Line 折れ線グラフ
Spline スプライン グラフ
StepLine StepLine グラフ
FastLine FastLine グラフ
Bar 横棒グラフ
StackedBar 積み上げ横棒グラフ
StackedBar100 100% 積み上げ横棒グラフ
Column 縦棒グラフ
StackedColumn 積み上げ縦棒グラフ
StackedColumn100 100% 積み上げ縦棒グラフ
Area 面グラフ
SplineArea スプライン面グラフ
StackedArea 積み上げ面グラフ
StackedArea100 100% 積み上げ面グラフ
Pie 円グラフ
Doughnut ドーナツ グラフ
Stock 株価チャート
Candlestick ローソク足チャート
Range 範囲グラフ
SplineRange スプライン範囲グラフ
RangeBar RangeBar グラフ
RangeColumn 範囲縦棒グラフ
Radar レーダー チャート
Polar 極座標グラフ
ErrorBar 誤差範囲グラフ
BoxPlot ボックス プロット グラフ
Renko 練行足チャート
ThreeLineBreak ThreeLineBreak グラフ
Kagi かぎ足チャート
PointAndFigure PointAndFigure グラフ
Funnel じょうごグラフ
Pyramid ピラミッド グラフ

グラフの種類がわかったところで、試しに使用してみます。
開発環境は以下の通り。

<ChartData.cs>
こちらは、グラフに表示するためのデータクラスです。

namespace Chart01Sample
{
    public class ChartData
    {
        public int X { get; set; }

        public int Y { get; set; }
    }
}

<Form1.cs>
グラフを表示するフォームです。

namespace Chart01Sample
{
    using System;
    using System.Collections.Generic;
    using System.Drawing;
    using System.Windows.Forms;
    using System.Windows.Forms.DataVisualization.Charting;

    public partial class Form1 : Form
    {
        //
        // 選択できるSeriesChartTypeを分けているのは、SeriesChartTypeを切り替えた場合にInvalidOperationExceptionがスローされるため。
        // あるグラフ系列種別から別の系列種別へ切り替えると上記の例外がスローされる。
        // 以下の2つのリストはその例外がスローされない種類で分けている。
        //

        private readonly List<SeriesChartType> _chartTypes1
                = new List<SeriesChartType>
                      {
                          SeriesChartType.Point,
                          SeriesChartType.FastPoint,
                          SeriesChartType.Bubble,
                          SeriesChartType.Line,
                          SeriesChartType.Spline,
                          SeriesChartType.StepLine,
                          SeriesChartType.FastLine,
                          SeriesChartType.Column,
                          SeriesChartType.StackedColumn,
                          SeriesChartType.StackedColumn100,
                          SeriesChartType.Area,
                          SeriesChartType.SplineArea,
                          SeriesChartType.StackedArea,
                          SeriesChartType.StackedArea100,
                          SeriesChartType.Stock,
                          SeriesChartType.Candlestick,
                          SeriesChartType.ErrorBar,
                          SeriesChartType.BoxPlot
                      };

        private readonly List<SeriesChartType> _chartTypes2
                = new List<SeriesChartType>
                      {
                          SeriesChartType.Bar,
                          SeriesChartType.StackedBar,
                          SeriesChartType.StackedBar100,
                          SeriesChartType.Pie,
                          SeriesChartType.Range,
                          SeriesChartType.SplineRange,
                          SeriesChartType.RangeBar,
                          SeriesChartType.RangeColumn,
                          SeriesChartType.Doughnut,
                          SeriesChartType.Radar,
                          SeriesChartType.Polar,
                          SeriesChartType.ThreeLineBreak,
                          SeriesChartType.Kagi,
                          SeriesChartType.Renko,
                          SeriesChartType.PointAndFigure,
                          SeriesChartType.Funnel,
                          SeriesChartType.Pyramid
                      };
        
        public Form1()
        {
            InitializeComponent();

            // Chartには、最初からSeriesが設定されているので削除しておく。
            chart1.Series.Clear();
            chart2.Series.Clear();

            List<ChartData> data = new List<ChartData>
                                       {
                                           new ChartData {X = 0, Y = 3},
                                           new ChartData {X = 1, Y = 4},
                                           new ChartData {X = 2, Y = 8},
                                           new ChartData {X = 3, Y = 6},
                                           new ChartData {X = 4, Y = 7},
                                           new ChartData {X = 5, Y = 3},
                                           new ChartData {X = 6, Y = 1},
                                           new ChartData {X = 7, Y = 0},
                                           new ChartData {X = 8, Y = 5},
                                           new ChartData {X = 9, Y = 2}
                                       };

            chart1.DataSource = data;
            Series series = chart1.Series.Add("Sample");
            series.XValueMember = "X";
            series.YValueMembers = "Y";
            series.Color = Color.Blue;

            chart2.DataSource = data;
            Series series2 = chart2.Series.Add("Sample");
            series2.XValueMember = "X";
            series2.YValueMembers = "Y";
            series2.Color = Color.Blue;
        }
        
        private void comboBox1_SelectedIndexChanged(object sender, EventArgs e)
        {
            if (comboBox1.SelectedItem != null)
            {
                chart1.Series["Sample"].ChartType = (SeriesChartType) comboBox1.SelectedItem;
            }
        }

        private void comboBox2_SelectedIndexChanged(object sender, EventArgs e)
        {
            if (comboBox2.SelectedItem != null)
            {
                chart2.Series["Sample"].ChartType = (SeriesChartType) comboBox2.SelectedItem;
            }
        }

        private void Form1_Load(object sender, EventArgs e)
        {
            comboBox1.DataSource = _chartTypes1;
            comboBox2.DataSource = _chartTypes2;
        }
    }
}

実行結果はこんな感じです。
ComboBoxの選択項目を変更すると、ぐりぐりグラフの種類が切り替わります。
f:id:iyemon018:20170310182646j:plain

今回使用したサンプルはこちら↓↓↓
github.com