FlexChart for WinForms
サンバースト
WinForms のチャートタイプ > 特殊チャート > サンバースト

サンバーストは、複数レベル円グラフとも呼ばれ、同心円で表される複数の層から成る階層化データを可視化するために適しています。中心の円はルートノードを表し、さらにさまざまな階層レベルを表す輪で囲まれます。輪は、親セグメントとの関係に基づいて、均等に分割されるか、値に比例して分割されます。たとえば、サンバーストを活用して過去数年間の売上を表示したり、製品のメーカーや型式を表示することができます。

WinForms サンバーストチャート

WinForms サンバーストチャートの作成

FlexChart for WinForms は、Sunburst クラスによって表されるスタンドアロン Sunburst コントロールによってサンバーストチャートを提供します。フォームにドロップされたコントロールは、FlexPie クラスにある DataSource プロパティを使用して階層化データを提供されるまでは、円グラフとして表示されます。このクラスには、サンバーストセグメントの数値とラベルを設定するための Binding および BindingName プロパティも用意されています。また、StartAngle プロパティを設定して、指定した角度から時計回りにセグメントを描画し始めることもできます。FlexChart は、次のサンバーストチャートのバリエーションを作成するためのプロパティも提供します。

ドーナツサンバーストチャート

分割サンバーストチャート

反転サンバーストチャート

WinForms ドーナツサンバーストチャート WinForms 分割サンバーストチャート WinForms 反転サンバーストチャート

FlexChart を使用してサンバーストチャートを作成するには

設計時

  1. Sunburst コントロールをフォームにドラッグアンドドロップします。
  2. フォームで Sunburst コントロールを右クリックして[プロパティ]ウィンドウを開きます。
  3. DataSource プロパティを使用してデータソースを設定します。
  4. Binding および BindingName プロパティを設定して、チャートを構成します。
  5. ChildItemsPath プロパティに、子の項目を含むプロパティの名前を設定します。

コードの使用

WinForms サンバーストチャートをコードで作成するには、コントロールを初期化した後に、最初にデフォルトの系列をクリアします。DataSource プロパティを使用してデータソースを設定し、Binding および BindingName プロパティを設定してチャートを構成します。 また、ChildItemsPath プロパティを設定して、階層化データ内に子の項目を生成します。

// 円スライスの値を含むフィールドを指定します
sunburst1.Binding = "Value";

// 円スライスと凡例のラベルを含むフィールドを指定します
sunburst1.BindingName = "Year,Quarter,Month";

// 子円スライスの値を含むフィールドを指定します
sunburst1.ChildItemsPath = "Items";

// データラベルの位置を設定します
sunburst1.DataLabel.Position = PieLabelPosition.Center;

// データラベルの内容を設定します
sunburst1.DataLabel.Content = "{name}";

// ツールチップの内容を設定します
sunburst1.ToolTip.Content = "In {name} Sales : {value}\nShare : {P:0}%";

// データソースを指定します
sunburst1.DataSource = GetSunburstData();

// ヘッダーの内容を設定します
sunburst1.Header.Content = "Sales over the years";
' 円スライスの値を含むフィールドを指定します
sunburst1.Binding = "Value"

' 円スライスと凡例のラベルを含むフィールドを指定します
sunburst1.BindingName = "Year,Quarter,Month"

' 子円スライスの値を含むフィールドを指定します
sunburst1.ChildItemsPath = "Items"

' データラベルの位置を設定します
sunburst1.DataLabel.Position = PieLabelPosition.Center

' データラベルの内容を設定します
sunburst1.DataLabel.Content = "{name}"

' ツールチップの内容を設定します
sunburst1.ToolTip.Content = "In {name} Sales : {value}" & vbLf & "Share : {P:0}%"

' データソースを指定します
sunburst1.DataSource = GetSunburstData()

' ヘッダーの内容を設定します
sunburst1.Header.Content = "Sales over the years"

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

/// <summary>
/// SunburstChartのデータを作成するメソッド
/// </summary>
Random rnd = new Random();
public List<HierarchicalDataItem> GetSunburstData()
{
    List<string> years = new List<string>();
    List<List<string>> times = new List<List<string>>()
    {
        new List<string>() { "Jan", "Feb", "Mar"},
        new List<string>() { "Apr", "May", "June"},
        new List<string>() { "Jul", "Aug", "Sep"},
        new List<string>() { "Oct", "Nov", "Dec" }
    };

    List<HierarchicalDataItem> items = new List<HierarchicalDataItem>();
    var yearLen = Math.Max((int)Math.Round(Math.Abs(5 - rnd.NextDouble() * 10)), 3);
    int currentYear = DateTime.Now.Year;
    for (int i = yearLen; i > 0; i--)
    {
        years.Add((currentYear - i).ToString());
    }
    var quarterAdded = false;

    years.ForEach(y =>
    {
        var i = years.IndexOf(y);
        var addQuarter = rnd.NextDouble() > 0.5;
        if (!quarterAdded && i == years.Count - 1)
        {
            addQuarter = true;
        }
        var year = new HierarchicalDataItem() { Year = y };
        if (addQuarter)
        {
            quarterAdded = true;
            times.ForEach(q =>
            {
                var addMonth = rnd.NextDouble() > 0.5;
                int idx = times.IndexOf(q);
                var quar = "Q" + (idx + 1);
                var quarters = new HierarchicalDataItem() { Year = y, Quarter = quar };
                if (addMonth)
                {
                    q.ForEach(m =>
                    {
                        quarters.Items.Add(new HierarchicalDataItem()
                        {
                            Year = y,
                            Quarter = quar,
                            Month = m,
                            Value = rnd.Next(20, 30)
                        });
                    });
                }
                else
                {
                    quarters.Value = rnd.Next(80, 100);
                }
                year.Items.Add(quarters);
            });
        }
        else
        {
            year.Value = rnd.Next(80, 100);
        }
        items.Add(year);
    });

    return items;
}
''' <summary>
''' SunburstChartのデータを作成するメソッド
''' </summary>
Private rnd As New Random()
Public Function GetSunburstData() As List(Of HierarchicalDataItem)
    Dim years As New List(Of String)()
    Dim times As New List(Of List(Of String))() From {
        New List(Of String)() From {
            "Jan",
            "Feb",
            "Mar"
        },
        New List(Of String)() From {
            "Apr",
            "May",
            "June"
        },
        New List(Of String)() From {
            "Jul",
            "Aug",
            "Sep"
        },
        New List(Of String)() From {
            "Oct",
            "Nov",
            "Dec"
        }
    }

    Dim items As New List(Of HierarchicalDataItem)()
    Dim yearLen As Integer = Math.Max(CInt(Math.Truncate(Math.Round(Math.Abs(5 - rnd.NextDouble() * 10)))), 3)
    Dim currentYear As Integer = DateTime.Now.Year
    For i As Integer = yearLen To 1 Step -1
        years.Add((currentYear - i).ToString())
    Next
    Dim quarterAdded As Boolean = False

    years.ForEach(Function(y)
                      Dim i As Integer = years.IndexOf(y)
                      Dim addQuarter As Boolean = rnd.NextDouble() > 0.5
                      If Not quarterAdded AndAlso i = years.Count - 1 Then
                          addQuarter = True
                      End If
                      Dim year As HierarchicalDataItem = New HierarchicalDataItem() With {
        .Year = y
    }
                      If addQuarter Then
                          quarterAdded = True
                          times.ForEach(Function(q)
                                            Dim addMonth As Boolean = rnd.NextDouble() > 0.5
                                            Dim idx As Integer = times.IndexOf(q)
                                            Dim quar As String = "Q" & (idx + 1)
                                            Dim quarters As HierarchicalDataItem = New HierarchicalDataItem() With {
             .Year = y,
             .Quarter = quar
        }
                                            If addMonth Then
                                                q.ForEach(Function(m)
                                                              quarters.Items.Add(New HierarchicalDataItem() With {
             .Year = y,
                 .Quarter = quar,
                 .Month = m,
                 .Value = rnd.[Next](20, 30)
            })

                                                          End Function)
                                            Else
                                                quarters.Value = rnd.[Next](80, 100)
                                            End If
                                            year.Items.Add(quarters)

                                        End Function)
                      Else
                          year.Value = rnd.[Next](80, 100)
                      End If
                      items.Add(year)

                  End Function)

    Return items
End Function