FlexChart for WinForms
WinForms 範囲付きヒストグラム
WinForms のチャートタイプ > 統計チャート > WinForms 範囲付きヒストグラム

範囲付きヒストグラムは、新しい Excel 形式のヒストグラムで、範囲付き X 軸に対する Y 軸の度数分布を視覚化するために役立ちます。ヒストグラムチャートタイプと同様に、ビンは、生データ値を重複のない連続した区間に分割することによって作成されます。 特定のビンまたはカテゴリに入る値の数に基づき、X 軸に沿った長方形の柱として度数がプロットされます。 FlexChart では、X 軸に何を表示するかにより、非カテゴリモードまたはカテゴリモードで範囲付きヒストグラムをレンダリングできます。

非カテゴリモードの範囲付きヒストグラム

カテゴリモードの範囲付きヒストグラム

WinForms 非カテゴリ範囲付きヒストグラム WinForms カテゴリ範囲付きヒストグラム

非カテゴリモード

非カテゴリモードでは、元のデータポイントがいくつかの区間または範囲に分類されます。たとえば、複数の範囲に分割された年齢に対してプロットされた母集団の年齢分布は、非カテゴリモードのヒストグラムの代表的な例です。

FlexChart を使用すると、WinForms 範囲付きヒストグラムを非カテゴリモードで作成できます。それには、ChartType プロパティを RangedHistogram に設定し、チャートに RangedHistogram 系列を追加します。データが提供されると、FlexChart は自動的にビンを計算してデータをグループ化し、範囲付きヒストグラムを作成します。ただし、ビン幅とビン数を指定してチャートをレンダリングするかどうかも選択できます。その場合は HistogramBinning 列挙に含まれる値を受け取る BinMode プロパティを設定します。さらに、BinWidth、NumberOfBins、UnderflowBin、OverflowBin を設定できるほか、範囲付きヒストグラムで ShowUnderflowBin および ShowOverflowBin を行うかどうかも指定できます。

// 系列をクリアします
flexChart1.Series.Clear();


// ChartTypeをRangedHistogramに設定します
flexChart1.ChartType = ChartType.RangedHistogram;

// RangedHistogramタイプの系列を作成して追加します
_rangedHistoSeries = new C1.Win.Chart.RangedHistogram();
_rangedHistoSeries.BindingX = "";
_rangedHistoSeries.Binding = "Age";

flexChart1.Series.Add(_rangedHistoSeries);

// データソースを指定します
this.flexChart1.DataSource = GetAgeData();

// 軸のタイトルを設定します
this.flexChart1.AxisX.Title = "Age Groups";
this.flexChart1.AxisY.Title = "Number Of Persons";
' 系列をクリアします
flexChart1.Series.Clear()

' ChartTypeをRangedHistogramに設定します
flexChart1.ChartType = ChartType.RangedHistogram

' RangedHistogramタイプの系列を作成して追加します
_rangedHistoSeries = New C1.Win.Chart.RangedHistogram()
_rangedHistoSeries.BindingX = ""
_rangedHistoSeries.Binding = "age"

flexChart1.Series.Add(_rangedHistoSeries)

' データソースを指定します
Me.flexChart1.DataSource = GetAgeData()

' 軸のタイトルを設定します
Me.flexChart1.AxisX.Title = "Age Groups"
Me.flexChart1.AxisY.Title = "Number Of Persons"

カテゴリモード

カテゴリモードでは、度数データが元のデータに基づいて提供されるいくつかのカテゴリに排他的にグループ化され(X 軸にプロット)、対応するカテゴリの累積的度数が Y 軸に描画されます。たとえば、上の図で示すように、母集団の年齢分布のデータをいくかの年齢層に分割してプロットすることもできます。

FlexChart では、ChartType プロパティを RangedHistogram に設定し、RangedHistogram 系列をチャートに追加し、BindingX プロパティを設定することで、カテゴリモードを有効にします。これ以降、BinMode、BinWidth、NumberOfBins、OverflowBin、UnderflowBin などのプロパティは無視されます。

// 系列をクリアします
flexChart1.Series.Clear();

// ChartTypeをRangedHistogramに設定します
flexChart1.ChartType = ChartType.RangedHistogram;

// RangedHistogramタイプの系列を作成して追加します
_rangedHistoSeries = new C1.Win.Chart.RangedHistogram();
_rangedHistoSeries.BindingX = "AgeGroup";
_rangedHistoSeries.Binding = "Count";

flexChart1.Series.Add(_rangedHistoSeries);

// データソースを指定します
this.flexChart1.DataSource = GetAgeData();

// 軸のタイトルを設定します
this.flexChart1.AxisX.Title = "Age Groups";
this.flexChart1.AxisY.Title = "Number Of Persons";
' 系列をクリアします
flexChart1.Series.Clear()

' ChartTypeをRangedHistogramに設定します
flexChart1.ChartType = ChartType.RangedHistogram

' RangedHistogramタイプの系列を作成して追加します
_rangedHistoSeries = New C1.Win.Chart.RangedHistogram()
_rangedHistoSeries.BindingX = "AgeGroup"
_rangedHistoSeries.Binding = "Count"

flexChart1.Series.Add(_rangedHistoSeries)

' データソースを指定します
Me.flexChart1.DataSource = GetAgeData()

' 軸のタイトルを設定します
Me.flexChart1.AxisX.Title = "Age Groups"
Me.flexChart1.AxisY.Title = "Number Of Persons"

上記のサンプルコードは、GetAgeData という名前のカスタムメソッドを使用してチャートにデータを提供しています。要件に基づいてデータソースを設定できます。

/// <summary>
/// FlexChartのデータを作成するメソッド
/// </summary>
Random rnd = new Random();
public List<Object> GetAgeData()
{
    var data = new List<Object>();
    for (int i = 0; i < 500; i++)
    {
        var age = rnd.NextDouble() < 0.6 ? rnd.Next(1, 45) : (rnd.NextDouble() < 0.7 ? rnd.Next(46, 65) : rnd.Next(66, 100));
        data.Add(new
        {
            AgeGroup = GetAgeGroups(age),
            Age = age,
            Count = 1,
        });
    }
    return data.OrderBy((dynamic x) => x.Age).ToList();
}
private static string GetAgeGroups(int age)
{
    if (age < 13)
        return "Children";
    else if (age >= 13 && age < 20)
        return "Youth";
    else if (age >= 20 && age < 25)
        return "Young Adults";
    else if (age >= 25 && age < 40)
        return "Adults";
    else if (age >= 40 && age < 65)
        return "Middle Aged";
    else
        return "Older";
}
''' <summary>
''' FlexChartのデータを作成するメソッド
''' </summary>
Private rnd As New Random()
Public Function GetAgeData() As List(Of [Object])
    Dim data As List(Of Object) = New List(Of [Object])()
    For i As Integer = 0 To 499
        Dim age As Integer = If(rnd.NextDouble() < 0.6, rnd.[Next](1, 45), (If(rnd.NextDouble() < 0.7, rnd.[Next](46, 65), rnd.[Next](66, 100))))
        data.Add(New With {
             .AgeGroup = GetAgeGroups(age),
             age,
             .Count = 1
        })
    Next
    Return data.OrderBy(Function(x) x.age).ToList()
End Function
Private Shared Function GetAgeGroups(age As Integer) As String
    If age < 13 Then
        Return "Children"
    ElseIf age >= 13 AndAlso age < 20 Then
        Return "Youth"
    ElseIf age >= 20 AndAlso age < 25 Then
        Return "Young Adults"
    ElseIf age >= 25 AndAlso age < 40 Then
        Return "Adults"
    ElseIf age >= 40 AndAlso age < 65 Then
        Return "Middle Aged"
    Else
        Return "Older"
    End If
End Function
関連トピック