バージョン

多次元データ (OLAP データ) と使用した時にシリーズをカスタマイズ

トピックの概要

目的

このトピックでは、XamDataChart™ コントロールで 1 つのチャートに複数のシリーズ タイプを表示する、または多次元データ (OnLine Analytical Processing (OLAP) データ) で作業する時に積層シリーズを使用する方法について説明します。

前提条件

以下の表は、このトピックを理解するための前提条件として必要なトピックを示しています。

トピック 目的

このトピックでは、コード例とともに、XamDataChart コントロールで多次元データ (OLAP) データ) を表示する方法について説明します。

このトピックでは、XamDataChart コントロール シリーズの概要を説明します。

OLAP データを使用する時にシリーズ タイプを構成

OLAP データ サマリーを使用する時にシリーズ タイプを構成

データを表示するために XamDataChart コントロールを使用する時、通常は描画したい軸とシリーズを選択します。これによって表示されるシリーズを完全に制御できます。他方では、OlapXAxis を使用すると、数値の Y 軸の使用に制限され、デフォルトで表示できる定義済みのシリーズのセットから選択できます。シリーズ タイプは、データの現在のスライスのすべての行または列に対して何が生成されるのかを指定する DefaultSeries プロパティによって管理されます。

単一シリーズを表示するには、 DefaultSeries プロパティを事前に定義したシリーズ タイプに設定します。プロパティが設定されていない場合、柱状シリーズが使用されます。OlapXAxis は x 軸であるため、バー シリーズなどのいかなる種類の垂直シリーズを使用できません。ただし、事前に定義したシリーズと異なるシリーズを使用する方法がいくつかあります。複数のシリーズ タイプを表示したい場合、または積層シリーズ (OlapXAxisDefaultSeries 列挙体に含まれない) を使用したい場合は、 SeriesInitializing および SeriesCreating イベントを使用する必要があります。

複数のシリーズ タイプを表示

概要

多次元データを使用する時、柱状、線、点シリーズを表示するために手順ごとに手順を説明します。

プレビュー

以下のスクリーンショットは最終結果のプレビューです。

xamDataChart Customizing Series When Used With Multi Dimensional Data 01.png

要件

この手順を実行するには、以下が必要です。

概要

以下はプロセスの概念的概要です。

1.必須のイベントにサブスクライブします。

2.必要なヘルパー変数を追加します。

3.シリーズ作成イベントを使用してデフォルトのシリーズを置き換えます。

手順

1.必須のイベントにサブスクライブします。

生成されたシリーズがデータ チャートに追加される前に毎回 SeriesCreating イベントが発生します。このイベントのイベント ハンドラーは選択したシリーズでデフォルトのシリーズを置き換える場所です。すべてのシリーズの作成が開始する前に SeriesInitializing イベントが発生します。これは、たとえばユーザーが軸ラベルを展開する時、または新しい階層がデータ ソースに追加される時です。その後で、必要なシリーズの数によって異なりますが、シリーズごとに SeriesCreating イベントが複数回発生します。

2.必要なヘルパー変数を追加します。

シリーズの現在の数を保持するために整数の変数を追加します。

この手順のこの例では、現在作成されているシリーズの数を保持するために整数の変数が使用されます。これは SeriesCreating イベントの異なる発生を識別できるようにするために必要です。SeriesInitializing イベントが発生する場合、この変数をゼロに設定し、SeriesCreating で増分します。このフィールドの値に基づいて、異なるタイプのシリーズを作成します。

この手法は簡単であるため使用されますが、使用すべきシリーズのタイプを選択するためにより洗練されたロジック (たとえばシリーズが対応するデータ ソースでどのメジャーを使用するのかに基づく) を実装できます。

3.シリーズ作成イベントを使用してデフォルトのシリーズを置き換えます。

希望するタイプのシリーズを表示するには、新しいシリーズを作成して、 SeriesCreatingEventArgsSeries プロパティの値として このシリーズを設定する必要があります 。使用されるシリーズが SeriesCreating イベントへの引数として提供されます。また、これらの引数には、新しいシリーズを作成するために必要なすべての情報を持つ OlapSeriesInfo オブジェクトが含まれます。

新しいシリーズを作成して必要なプロパティを割り当てるには:

1.シリーズの ItemsSourceSeriesInfo によって提供される ItemsSource に設定します 。

2.ValueMemberPath プロパティを設定します。

データ ソースは OlapAxisCell オブジェクトのリストです。バインドしなければならない値は OlapAxisCell オブジェクトと関連付けられた CellValue プロパティにあります。

これは ValueMemberPath"Cell.Value" でなければならないことを意味します。

3.Name プロパティをシリーズ情報と提供される名前に設定します。

  1. Title をシリーズ情報からの 1 つに設定します。

コード

以下はこの手順の完全なコードです。

XAML の場合:

<UserControl
…
      xmlns:ig="http://schemas.infragistics.com/xaml"
      xmlns:models="clr-namespace:Infragistics.Samples.Data.Models"
      xmlns:olap="http://schemas.infragistics.com/olap">
<UserControl.Resources>
        <ResourceDictionary>
            <models:SalesDataSample x:Key="DataSample"/>
            <olap:FlatDataSource
                x:Key="DataSource"
                Columns="[Date].[Date]"
                Measures="AmountOfSale, NumberOfUnits"
                MeasureListLocation="Rows"
                ItemsSource="{StaticResource DataSample}" />
        </ResourceDictionary>
    </UserControl.Resources>
    <Grid x:Name="LayoutRoot" Background="White">
        <Grid.ColumnDefinitions>
            <ColumnDefinition />
            <ColumnDefinition Width="Auto"/>
        </Grid.ColumnDefinitions>
        <ig:XamDataChart x:Name="DataChart" HorizontalZoomable="True" VerticalZoomable="True" Width="700" >
            <ig:XamDataChart.Axes>
                <ig:NumericYAxis x:Name="YAxis" MinimumValue="0"/>
                <ig:OlapXAxis
                    YAxis="{Binding ElementName=YAxis}"
                    DataSource="{StaticResource DataSource}"
                    OlapAxisSource="Columns"
                    DefaultSeries="ColumnSeries"
                    SeriesInitializing="OlapXAxis_SeriesInitializing"
                    SeriesCreating="OlapXAxis_SeriesCreating"/>
            </ig:XamDataChart.Axes>
        </ig:XamDataChart>
    </Grid>
</UserControl>

C# の場合:

…
public partial class MainPage : UserControl
    {
        int seriesIndex = 0;
        public MainPage()
        {
            InitializeComponent();
        }
        private void OlapXAxis_SeriesCreating(object sender, Infragistics.Controls.Charts.SeriesCreatingEventArgs e)
        {
            switch (seriesIndex)
            {
                case 0:
                    e.Series = new ColumnSeries()
                    {
                        ItemsSource = e.SeriesInfo.ItemsSource,
                        ValueMemberPath = "Cell.Value",
                        Title = e.SeriesInfo.Title,
                        Name = e.SeriesInfo.Name
                    };
                    break;
                case 1:
                    e.Series = new LineSeries()
                    {
                        ItemsSource = e.SeriesInfo.ItemsSource,
                        ValueMemberPath = "Cell.Value",
                        Title = e.SeriesInfo.Title,
                        Name = e.SeriesInfo.Name
                    };
                    break;
                case 2:
                    e.Series = new PointSeries()
                    {
                        ItemsSource = e.SeriesInfo.ItemsSource,
                        ValueMemberPath = "Cell.Value",
                        Title = e.SeriesInfo.Title,
                        Name = e.SeriesInfo.Name
                    };
                    break;
            }
            seriesIndex++;
        }
        private void OlapXAxis_SeriesInitializing(object sender, Infragistics.Controls.Charts.SeriesInitializingEventArgs e)
        {
            seriesIndex = 0;
        }

Visual Basic の場合:

Imports Infragistics.Controls.Charts
Partial Public Class MainPage
    Inherits UserControl
    Private seriesIndex As Integer
    Public Sub New()
        InitializeComponent()
    End Sub
    Private Sub OlapXAxis_SeriesInitializing(sender As System.Object, e As SeriesInitializingEventArgs)
        seriesIndex = 0
    End Sub
    Private Sub OlapXAxis_SeriesCreating(sender As System.Object, e As SeriesCreatingEventArgs)
        Select Case seriesIndex
            Case 0
                e.Series = New ColumnSeries() With { _
                 .ItemsSource = e.SeriesInfo.ItemsSource, _
                 .ValueMemberPath = "Cell.Value", _
                 .Title = e.SeriesInfo.Title, _
                 .Name = e.SeriesInfo.Name _
                }
                Exit Select
            Case 1
                e.Series = New LineSeries() With { _
                 .ItemsSource = e.SeriesInfo.ItemsSource, _
                 .ValueMemberPath = "Cell.Value", _
                 .Title = e.SeriesInfo.Title, _
                 .Name = e.SeriesInfo.Name _
                }
                Exit Select
            Case 2
                e.Series = New PointSeries() With { _
                 .ItemsSource = e.SeriesInfo.ItemsSource, _
                 .ValueMemberPath = "Cell.Value", _
                 .Title = e.SeriesInfo.Title, _
                 .Name = e.SeriesInfo.Name _
                }
                Exit Select
        End Select
        seriesIndex += 1
    End Sub
End Class

OlapXAxis と積層シリーズを使用

概要

積層シリーズを使用する場合、積層のピースとして表示したいすべての値を持つオブジェクトを含むデータ ソースが必要です。ただし、各シリーズに提供されるデータ ソースには 1 つのシリーズの値だけが含まれます。したがって、シリーズを表示するために必要とされる値を保存するにはカスタム クラスを作成する必要があります。このように 1 つの積層シリーズをチャートに追加して、共通のデータ ソースを持つ複数の StackedFragmentedSeriesSeries コレクションを生成します。

プレビュー

以下のスクリーンショットは最終結果のプレビューです。

xamDataChart Customizing Series When Used With Multi Dimensional Data 02.png

要件

この手順を実行するには、以下が必要です。

概要

このトピックは、StackedColumnSeries で OlapXAxis と使用されるデフォルト シリーズを置き換える手順を説明します。以下はプロセスの概念的概要です。

1.必須のイベントにサブスクライブします。 2.必要なヘルパー変数を追加します。 3. シリーズのデータを保管するためのヘルパー クラスを追加します。 4.イベントを使用してデフォルトのシリーズを置き換えます。

手順

1.必須のイベントにサブスクライブします。

生成されたシリーズがデータ チャートに追加される前に毎回 SeriesCreating イベントが発生します。すべてのシリーズの作成が開始する前に SeriesInitializing イベントが発生します。これは、たとえばユーザーが軸ラベルを展開する時、または新しい階層がデータ ソースに追加される時です。その後で、必要なシリーズの数だけ SeriesCreating イベントが発生します。

2.必要なヘルパー変数を追加します。

1.シリーズの現在の数を保持するために整数の変数を追加します。

たとえばこの手順で、作成された StackedFragmentedSeries の現在の数を保存するために整数の変数が使用されます。これは SeriesCreating イベントの異なる発生を識別するために必要とされます。 * SeriesInitializing *イベントが発生する場合、 この変数を 0 に設定し、 SeriesCreating増分します

2.チャートで使用するために StackedColumnSeries 変数を追加します。

整数フィールドに加えて、データ チャートで使用される積層型柱状シリーズへの参照を保管するために StackedColumnSeries フィールドが必要です。希望する場合には、これを HorizontalStackedSeriesBase から派生する任意の種類の積層シリーズで置き換えることができます。残りのコードは実質的には同じになります。

3.シリーズのデータを保管するためのヘルパー クラスを追加します。

積層シリーズに共通のデータ ソースを作成できるようにするには、 double 値のリストを含むクラスを追加します。 このリストの目的は、シリーズのデータ ソースそれぞれの設定を保管することです。シリーズのすべてのデータ ソースがリストに追加される時は、 StackedColumnSeriesItemsSource として使用されます。

C# の場合:

private class StackedSeriesData
{
    public StackedSeriesData()
    {
        Data = new List<double>();
    }
    public List<double> Data { get; set; }
}

Visual Basic の場合:

 Private Class StackedSeriesData
        Public Property Data As List(Of Double)
        Public Sub New()
            Data = New List(Of Double)
        End Sub
    End Class

4.イベントを使用してデフォルトのシリーズを置き換えます。

1. SeriesInitializing イベント ハンドラーで、シリーズを初期化してカウンターを 0 に設定します。

これは手順 2 の StackedColumnSeries の新しいインスタンスで追加されたシリーズ変数を割り当てることを意味します。このように、SeriesCreating が発生するたびに、積層シリーズで自動的に生成されたシリーズを置き換えることができます。

C# の場合:

private void OlapXAxis_SeriesInitializing(object sender, Infragistics.Controls.Charts.SeriesInitializingEventArgs e)
{
    series = new StackedColumnSeries();
    seriesIndex = 0;
}

Visual Basic の場合:

Private Sub OlapXAxis_SeriesInitializing(sender As Object, e As Infragistics.Controls.Charts.SeriesInitializingEventArgs)
      series = New StackedColumnSeries()
      seriesIndex = 0
End Sub

2.SeriesCreating が初めて発生する時に共通のデータ ソースを作成します。

SeriesCreating イベント ハンドラーで、シリーズ カウンターが 0 かどうかをチェックします。0 である場合、これはこれがデータ ソースの現在の状態に対してイベントが発生したのが初めてであり、すべての積層型の断片化されたシリーズに共通する新しいデータ ソースを作成する必要があることを意味します。

C# の場合:

private void OlapXAxis_SeriesCreating(object sender, Infragistics.Controls.Charts.SeriesCreatingEventArgs e)
{
    if (seriesIndex == 0)
    {
        series.ItemsSource = Enumerable.Range(0, e.SeriesInfo.ItemsSource.Count).Select(i => new StackedSeriesData()).ToList();
    }
…

Visual Basic の場合:

Private Sub OlapXAxis_SeriesCreating(sender As System.Object, e As SeriesCreatingEventArgs)
    If seriesIndex = 0 Then
        series.ItemsSource = Enumerable.Range(0, e.SeriesInfo.ItemsSource.Count).[Select](Function(i) New StackedSeriesData()).ToList()
    End If

3.共通のデータ ソースを生成して StackedFragmentedSeries を積層シリーズに追加します。

SeriesCreating が初めて発生する時に StackedColumnSeriesItemsSource を生成した後で、現在の SeriesInfo.ItemsSource で提供される項目を共通のデータ ソースに追加する必要があります。

C# の場合:

…
for (int i = 0; i < e.SeriesInfo.ItemsSource.Count; i++)
{
    ((List<StackedSeriesData>)series.ItemsSource)[i].Data.Add(Convert.ToDouble(e.SeriesInfo.ItemsSource[i].Cell.Value));
}
…

Visual Basic の場合:

…
For i = 0 To e.SeriesInfo.ItemsSource.Count - 1
    DirectCast(series.ItemsSource, List(Of StackedSeriesData))(i).Data.Add(Convert.ToDouble(e.SeriesInfo.ItemsSource(i).Cell.Value))
Next
…

4. StackedFragmentedSeries を作成して構成します。

  1. StackedFragmentedSeries を作成して、 それらを StackedColumnSeries に追加します。

  2. シリーズ カウンターを増分します。

  3. StackedColumnSeries をイベント引数の Series プロパティの値として設定します。

C# の場合:

…
    series.Series.Add(new StackedFragmentSeries() { ValueMemberPath = string.Format("Data[{0}]", seriesIndex), Title = e.SeriesInfo.Title });
    e.Series = series;
    seriesIndex++;
}

Visual Basic の場合:

…
    series.Series.Add(New StackedFragmentSeries() With { _
     .ValueMemberPath = String.Format("Data[{0}]", seriesIndex), _
    .Title = e.SeriesInfo.Title
    })
    e.Series = series
    seriesIndex = seriesIndex + 1
End Sub
Note
注:

SeriesCreating イベントが発生するたびに手順 4.3 と 4.4 が実行されます。

コード

以下はこの手順の完全な C# および VB.NET コードです。XAML コードでは、複数シリーズ タイプの表示Code ブロックにリストされるコード スニペットを使用します。

C# の場合:

…
public partial class MainPage : UserControl
    {
        int seriesIndex = 0;
        StackedColumnSeries series;
        public MainPage()
        {
            InitializeComponent();
        }
        private class StackedSeriesData
        {
            public StackedSeriesData()
            {
                Data = new List<double>();
            }
            public List<double> Data { get; set; }
        }
        private void OlapXAxis_SeriesCreating(object sender, Infragistics.Controls.Charts.SeriesCreatingEventArgs e)
        {
            if (seriesIndex == 0)
            {
                series.ItemsSource = Enumerable.Range(0, e.SeriesInfo.ItemsSource.Count).Select(i => new StackedSeriesData()).ToList();
            }
            for (int i = 0; i < e.SeriesInfo.ItemsSource.Count; i++)
            {
                ((List<StackedSeriesData>)series.ItemsSource)[i].Data.Add(Convert.ToDouble(e.SeriesInfo.ItemsSource[i].Cell.Value));
            }
            series.Series.Add(new StackedFragmentSeries() { ValueMemberPath = string.Format("Data[{0}]", seriesIndex), Title = e.SeriesInfo.Title });
            e.Series = series;
            seriesIndex++;
        }
        private void OlapXAxis_SeriesInitializing(object sender, Infragistics.Controls.Charts.SeriesInitializingEventArgs e)
        {
            series = new StackedColumnSeries();
            seriesIndex = 0;
        }
}

Visual Basic の場合:

Imports Infragistics.Controls.Charts
Partial Public Class MainPage
    Inherits UserControl
    Private Class StackedSeriesData
        Public Property Data As List(Of Double)
        Public Sub New()
            Data = New List(Of Double)
        End Sub
    End Class
    Private series As StackedColumnSeries
    Private seriesIndex As Integer
    Public Sub New()
        InitializeComponent()
    End Sub
    Private Sub OlapXAxis_SeriesInitializing(sender As System.Object, e As SeriesInitializingEventArgs)
        series = New StackedColumnSeries()
        seriesIndex = 0
    End Sub
    Private Sub OlapXAxis_SeriesCreating(sender As System.Object, e As SeriesCreatingEventArgs)
        If seriesIndex = 0 Then
            series.ItemsSource = Enumerable.Range(0, e.SeriesInfo.ItemsSource.Count).[Select](Function(f) New StackedSeriesData()).ToList()
        End If
        For i = 0 To e.SeriesInfo.ItemsSource.Count - 1
            DirectCast(series.ItemsSource, List(Of StackedSeriesData))(i).Data.Add(Convert.ToDouble(e.SeriesInfo.ItemsSource(i).Cell.Value))
        Next
        series.Series.Add(New StackedFragmentSeries() With { _
         .ValueMemberPath = String.Format("Data[{0}]", seriesIndex), _
        .Title = e.SeriesInfo.Title
        })
        e.Series = series
        seriesIndex += 1
    End Sub
End Class

関連コンテンツ

このトピックの追加情報については、以下のトピックも合わせてご参照ください。

トピック 目的

このトピックは、 xamPivotGrid™ コントロールと XamDataChart コントロールの間のインタラクションの構築方法を説明します。