C#

C# 誤差範囲グラフを使ってみる(Chartコントロール)

Chartクラス(System.Windows.Forms.DataVisualization.Charting名前空間)のChartTypeには、SeriesChartType.ErrorBarというものがあります。
単語だけ見ると(Errorって・・・)あまりよい印象はないですが、これは「誤差範囲グラフ」という普通のグラフです。

 

誤差範囲グラフ

この「誤差範囲グラフ」の定義は、

「データの変動性の図形描写であり、誤差(エラー)あるいは報告された測定の不確かさを示すためにグラフにおいて使用される」

となっています。

 

以前からChartコントロールで使用しているサンプルコードでそのまま’SeriesChartType.ErrorBar’を指定してみました。

実行するとこのようなグラフになります。

 

下記がサンプルコードです。

private void frmMain_Load(object sender, EventArgs e)
{
    // フォームをロードした時の処理
    chart1.Series.Clear();  // ← 最初からSeriesが1つあるのでクリアします
    chart1.ChartAreas.Clear();

    // ChartにChartAreaを追加します
    string chart_area1 = "Area1";
    chart1.ChartAreas.Add(new ChartArea(chart_area1));
    // ChartにSeriesを追加します
    string legend1 = "Graph1";
    chart1.Series.Add(legend1);
    // グラフの種別を指定
    chart1.Series[legend1].ChartType = SeriesChartType.ErrorBar;    // 誤差範囲グラフを指定
    chart1.Series[legend1].MarkerStyle = MarkerStyle.Circle;        // マークスタイル(形状)を指定

    // データを用意します
    double[] x_values = new double[5] { 1.0, 0.8, 1.8, 0.2, 1.2 };
    double[] y_values = new double[5] { 1.0, 1.2, 0.8, 1.8, 0.2 };      // 平均値

    // データをシリーズにセットします
    for (int i = 0; i < y_values.Length; i++)
    {
        DataPoint dp = new DataPoint((double)x_values[i], y_values[i]);
        chart1.Series[legend1].Points.Add(dp);
    }
}

 

何かが足りない

点は出ているのに、Yがすべて0のところになっています。

MSDNの「誤差範囲グラフ」を見てみると

Y値のインデックス 説明
0 中央または平均のポイント値。
1 下限のエラー値
2 上限のエラー値

 

となっています。

 

まず上限と下限を、固定値(上限=2.0、下限=0.1)でコードを下記のようにして、再度実行してみます。

private void frmMain_Load(object sender, EventArgs e)
{
    // フォームをロードした時の処理
    chart1.Series.Clear();  // ← 最初からSeriesが1つあるのでクリアします
    chart1.ChartAreas.Clear();

    // ChartにChartAreaを追加します
    string chart_area1 = "Area1";
    chart1.ChartAreas.Add(new ChartArea(chart_area1));
    // ChartにSeriesを追加します
    string legend1 = "Graph1";
    chart1.Series.Add(legend1);
    // グラフの種別を指定
    chart1.Series[legend1].ChartType = SeriesChartType.ErrorBar;    // 誤差範囲グラフを指定
    chart1.Series[legend1].MarkerSize = 8;                          // マークサイズを指定
    chart1.Series[legend1].MarkerStyle = MarkerStyle.Circle;        // マークスタイル(形状)を指定
    chart1.Series[legend1].SetCustomProperty("ErrorBarCenterMarkerStyle", "Triangle");    // 

    // データを用意します
    double[] x_values = new double[5] { 1.0, 0.8, 1.8, 0.2, 1.2 };
    double[] y_values = new double[5] { 1.0, 1.2, 0.8, 1.8, 0.2 };      // 平均値

    // データをシリーズにセットします
    for (int i = 0; i < y_values.Length; i++)
    {
        //DataPoint dp = new DataPoint((double)x_values[i], y_values[i]);
        double[] y_vals = new double[3] { y_values[i], 0.1, 2.0 };
        DataPoint dp = new DataPoint((double)x_values[i], y_vals);
        chart1.Series[legend1].Points.Add(dp);
    }
}

 

実行するとこのような表示になりました。

 

上限と下限を平均値と同じにしてみると

//DataPoint dp = new DataPoint((double)x_values[i], y_values[i]);
double[] y_vals = new double[3] { y_values[i], y_values[i], y_values[i] };

 

このようになります。

 

普通のグラフになってしまいました。

 

上限・下限を個別に指定する

誤差範囲グラフの表示を見るために上限・下限を個別に指定してみます。

コードを下記のように変更します。

private void frmMain_Load(object sender, EventArgs e)
{
    // フォームをロードした時の処理
    chart1.Series.Clear();  // ← 最初からSeriesが1つあるのでクリアします
    chart1.ChartAreas.Clear();

    // ChartにChartAreaを追加します
    string chart_area1 = "Area1";
    chart1.ChartAreas.Add(new ChartArea(chart_area1));
    // ChartにSeriesを追加します
    string legend1 = "Graph1";
    chart1.Series.Add(legend1);
    // グラフの種別を指定
    chart1.Series[legend1].ChartType = SeriesChartType.ErrorBar;    // 誤差範囲グラフを指定
    chart1.Series[legend1].MarkerSize = 8;                          // マークサイズを指定
    chart1.Series[legend1].MarkerStyle = MarkerStyle.Circle;        // マークスタイル(形状)を指定
    chart1.Series[legend1].SetCustomProperty("ErrorBarCenterMarkerStyle", "Triangle");    // 

    // データを用意します
    double[] x_values = new double[5] { 1.0, 0.8, 1.8, 0.2, 1.2 };
    double[] y_values = new double[5] { 1.0, 1.2, 0.8, 1.8, 0.2 };      // 平均値
    double[] lower_values = new double[5] { 0.5, 0.7, 0.6, 1.0, 0.1 };  // 下限のエラー値
    double[] upper_values = new double[5] { 1.1, 1.4, 1.0, 2.2, 0.4 };  // 上限のエラー値

    // データをシリーズにセットします
    for (int i = 0; i < y_values.Length; i++)
    {
        //DataPoint dp = new DataPoint((double)x_values[i], y_values[i]);
        double[] y_vals = new double[3] { y_values[i], lower_values[i], upper_values[i] };
        DataPoint dp = new DataPoint((double)x_values[i], y_vals);
        chart1.Series[legend1].Points.Add(dp);
    }
}

 

実行するとこのような表示になります。

 

実際には、データに上限(Max)、下限(Min)、平均(Ave)を算出したものなどを使うと、誤差範囲をもっと視覚的に見ることができるようになります。

 

タイトルとURLをコピーしました