このトピックは、XamDataChart™ コントロールのカスタム軸スケーリング機能を紹介し、コード例を示して、カスタム軸スケーラーの作成方法を説明します。
表 1 - カスタム軸スケーリング機能をサポートする軸タイプのリスト
カスタム軸スケーラの例は、XamDataChart コントロールの値 0%~100% で Y 軸に沿ってプロットされる値をスケールする ProbabilityVerticalScaler です。
図 1 - Y 軸に適用される ProbabilityVerticalScaler のある XamDataChart コントロールのプレビュー。
カスタム軸スケーラを実装するには、NumericScaler 基本クラスから継承するクラスを作成し、基本クラスの以下の中小メソッドをオーバーライドする必要があります。
以下のコード スニペットは、NumericScaler クラスから継承し、y-軸の実際の範囲を 0-100 % に設定してデータ値を拡張/縮小するコードで、上記メソッドをオーバーライドしてカスタム ProbabilityVerticalScaler を作成する方法を示します。
Visual Basic の場合:
Imports Infragistics.Controls.Charts
Namespace Infragistics.Samples.Common
''' <summary>
''' 垂直数値軸の確率スケーラを示します
''' </summary>
Public Class ProbabilityVerticalScaler
Inherits NumericScaler
''' <summary>
''' 数値軸上の絶対最小確率値
''' </summary>
Public Const AbsoluteProbabiltyMinimumValue As Double = 0.0
''' <summary>
''' 数値軸上の絶対最大確率値
''' </summary>
Public Const AbsoluteProbabiltyMaximumValue As Double = 100.0
Protected Mu As Double = 0.5
Protected Sigma As Double = 0.075
''' <summary>
''' 軸スケールの実際の最小値および実際の最大値を計算します
''' </summary>
Public Overrides Sub CalculateRange(target As NumericAxisBase, minimumValue As Double, maximumValue As Double, ByRef actualMinimumValue As Double, ByRef actualMaximumValue As Double)
' このスケーラの場合、実際の軸範囲は常に 0~100% です
actualMinimumValue = AbsoluteProbabiltyMinimumValue
actualMaximumValue = AbsoluteProbabiltyMaximumValue
End Sub
''' <summary>
''' 軸上の数値に対応する表示 (ピクセル) 位置を返します
''' </summary>
Public Overrides Function GetScaledValue(unscaledValue As Double, p As ScalerParams) As Double
Dim scaledValue As Double = (unscaledValue - ActualMinimumValue) / (ActualMaximumValue - ActualMinimumValue)
If Not p.IsInverted Then
scaledValue = 1.0 - scaledValue
End If
scaledValue = Me.Mu + Me.Sigma * System.Math.Tan(System.Math.PI * (scaledValue - 0.5))
Return p.ViewportRect.Top + p.ViewportRect.Height * (scaledValue - p.WindowRect.Top) / p.WindowRect.Height
End Function
''' <summary>
''' 軸上の表示または「ピクセル」位置に対応する数値を返します
''' </summary>
Public Overrides Function GetUnscaledValue(scaledValue As Double, p As ScalerParams) As Double
Dim unscaledValue As Double = p.WindowRect.Top + p.WindowRect.Height * (scaledValue - p.ViewportRect.Top) / p.ViewportRect.Height
If Not p.IsInverted Then
unscaledValue = 1.0 - unscaledValue
End If
unscaledValue = 0.5 + 0.318309886183791 * System.Math.Atan2(unscaledValue - Me.Mu, Me.Sigma)
Return ActualMinimumValue + unscaledValue * (ActualMaximumValue - ActualMinimumValue)
End Function
End Class
End Namespace
C# の場合:
using Infragistics.Controls.Charts;
namespace Infragistics.Samples.Common
{
/// <summary>
/// 垂直数値軸の確率スケーラを示します
/// </summary>
public class ProbabilityVerticalScaler : NumericScaler
{
/// <summary>
/// 数値軸上の絶対最小確率値
/// </summary>
public const double AbsoluteProbabiltyMinimumValue = 0.0;
/// <summary>
/// 数値軸上の絶対最大確率値
/// </summary>
public const double AbsoluteProbabiltyMaximumValue = 100.0;
protected double Mu = 0.5;
protected double Sigma = 0.075;
/// <summary>
/// 軸スケールの実際の最小値および実際の最大値を計算します
/// </summary>
public override void CalculateRange(NumericAxisBase target, double minimumValue, double maximumValue,
out double actualMinimumValue,
out double actualMaximumValue)
{
// このスケーラの場合、実際の軸範囲は常に 0~100% です
actualMinimumValue = AbsoluteProbabiltyMinimumValue;
actualMaximumValue = AbsoluteProbabiltyMaximumValue;
}
/// <summary>
/// 軸上の数値に対応する表示 (ピクセル) 位置を返します
/// </summary>
public override double GetScaledValue(double unscaledValue, ScalerParams p)
{
double scaledValue = (unscaledValue - ActualMinimumValue)/(ActualMaximumValue - ActualMinimumValue);
if (!p.IsInverted)
{
scaledValue = 1.0 - scaledValue;
}
scaledValue = this.Mu + this.Sigma * System.Math.Tan(System.Math.PI * (scaledValue - 0.5));
return p.ViewportRect.Top + p.ViewportRect.Height * (scaledValue - p.WindowRect.Top) / p.WindowRect.Height;
}
/// <summary>
/// 軸上の表示または「ピクセル」位置に対応する数値を返します
/// </summary>
public override double GetUnscaledValue(double scaledValue, ScalerParams p)
{
double unscaledValue = p.WindowRect.Top + p.WindowRect.Height * (scaledValue - p.ViewportRect.Top) / p.ViewportRect.Height;
if (!p.IsInverted)
{
unscaledValue = 1.0 - unscaledValue;
}
unscaledValue = 0.5 + 0.318309886183790671 * System.Math.Atan2(unscaledValue - this.Mu, this.Sigma);
return ActualMinimumValue + unscaledValue * (ActualMaximumValue - ActualMinimumValue);
}
}
}
任意で、カスタム目盛値は、以下のコードで示されるように ProbabilityVerticalScaler 用に実装できます。
Visual Basic の場合:
Imports System.Collections.Generic
Imports System.Linq
Imports Infragistics.Controls.Charts
Namespace Infragistics.Samples.Common
Public Class ProbabilityTickmarkValues
Inherits TickmarkValues
Public Sub New()
' 確率目盛値を定義します。
Me.ProbabilityValues = New DoubleCollection() From { 0, 5, 10, 20, 30, 40, 50, 60, 70, 80, 90, 95, 100 }
End Sub
Protected First As Double
Protected Last As Double
Protected ProbabilityValues As DoubleCollection
''' <summary>
''' 軸ラベル、ストリップライン、およびグリッドラインを描画する前に目盛値を初期化します
''' </summary>
''' <param name="initializationParameters"></param>
Public Overrides Sub Initialize(initializationParameters As TickmarkValuesInitializationParameters)
MyBase.Initialize(initializationParameters)
' 初期化は、最大値および最小値を保存するためにオーバーライドされます
' これらの値は後で MajorValues() および MinorValues() メソッドで使用されます。
Me.First = initializationParameters.VisibleMinimum
Me.Last = initializationParameters.VisibleMaximum
End Sub
''' <summary>
''' 主目盛値を返します
''' </summary>
''' <returns></returns>
Public Overrides Function MajorValues() As IEnumerable(Of Double)
Dim values As IEnumerable(Of Double) = ProbabilityValues.Where(Function(value) value >= Me.First AndAlso value <= Me.Last)
Return values
End Function
''' <summary>
''' 副目盛値を返します
''' </summary>
''' <returns></returns>
Public Overrides Function MinorValues() As IEnumerable(Of Double)
' 副目盛値はありません
Return New Double() {}
End Function
End Class
End Namespace
C# の場合:
using System.Collections.Generic;
using System.Linq;
using Infragistics.Controls.Charts;
namespace Infragistics.Samples.Common
{
public class ProbabilityTickmarkValues : TickmarkValues
{
public ProbabilityTickmarkValues()
{
// 確率目盛値を定義します
this.ProbabilityValues = new DoubleCollection { 0, 5, 10, 20, 30, 40, 50, 60, 70, 80, 90, 95, 100 };
}
protected double First;
protected double Last;
protected DoubleCollection ProbabilityValues;
/// <summary>
/// 軸ラベル、ストリップライン、およびグリッドラインを描画する前に目盛値を初期化します
/// </summary>
/// <param name="initializationParameters"></param>
public override void Initialize(TickmarkValuesInitializationParameters initializationParameters)
{
base.Initialize(initializationParameters);
// 初期化は、最大値および最小値を保存するためにオーバーライドされます
// これらの値は後で MajorValues() および MinorValues() メソッドで使用されます。
this.First = initializationParameters.VisibleMinimum;
this.Last = initializationParameters.VisibleMaximum;
}
/// <summary>
/// 主目盛値を返します
/// </summary>
/// <returns></returns>
public override IEnumerable<double> MajorValues()
{
IEnumerable<double> values = ProbabilityValues.Where((value) => value >= this.First && value <= this.Last);
return values;
}
/// <summary>
/// 副目盛値を返します
/// </summary>
/// <returns></returns>
public override IEnumerable<double> MinorValues()
{
return new double[] { /* 副目盛値はありません */ };
}
}
}
以下のコード スニペットでは、XamDataChart コントロールで Y 軸に ProbabilityVerticalScaler を適用する方法を示します。
XAML の場合:
<ig:XamDataChart.Axes>
<ig:NumericYAxis Name="yAxis" MinimumValue="0" MaximumValue="100" Label="{}{} %" >
<!-- ========================================================================== -->
<ig:NumericYAxis.Scaler>
<custom:ProbabilityVerticalScaler />
</ig:NumericYAxis.Scaler>
<!-- ========================================================================== -->
<ig:NumericYAxis.TickmarkValues>
<custom:ProbabilityTickmarkValues />
</ig:NumericYAxis.TickmarkValues>
</ig:NumericYAxis>
</ig:XamDataChart.Axes>