C#プログラム

【C#】グラフのメモリ間隔の計算

C#でグラフを書く場合はChartを使うと簡単に書く事ができますが、Chartだけでは物足り無い事や、描画速度が遅かったりするので、自前でグラフを書こうとしたときに、Chartでやっているグラフの軸の間隔(下図の例では20)は、どうようにして決めているのか?
いまいち分からなかったので、調べてみました。

 

AutoCalcGraphStep

 

本当は、ソースコードから、どうやっているのか?見たかったのですが、よく分からなかったので、とりあえず、Chartの動きをよ~く見てみました。

 

下図の例は棒グラフで、値を(1, 1),(2, 2),(3, 3),(4, 4),(5, 5)・・・
とデータを追加した時の様子

AutoCalcGraphStep

 

すると、軸の間隔は

 

0.2、0.5、1、2、5、10、20、50、100、200、500・・・

 

という風に変化している事がわかりました。

結局、値そのものは 1、2、5 の繰り返し+指数で表現できそうだったので、グラフの最大値を浮動小数点で表してみると、仮数の部分の数値で1,2,5のいづれかが決まっているようでした。

 

例えば、125の場合は 1.25x10 なので、仮数は1.25で、この時のグラフの間隔は 0.2x10 の 20 となります。

 

仮数 グラフ間隔
1.5未満 0.2x10n
3.5未満 0.5x10n
5以下 1.0x10n
その他 2.0x10n

 

このグラフの間隔を関数にしたのがこちら↓

/// <summary>
/// グラフ間隔の計算
/// </summary>
/// <param name="value">グラフの最大値</param>
/// <returns></returns>
private double GetAxisStep(double value)
{
    // 指数
    double exponent = Math.Pow(10, Math.Floor(Math.Log10(value)));
    // 仮数
    double significand = value / exponent;

    // グラフ間隔
    double axisStep;

    if (significand < 1.5)
    {
        axisStep = 0.2 * exponent;
    }
    else if (significand < 3.5)
    {
        axisStep = 0.5 * exponent;
    }
    else if (significand <= 5.0)
    {
        axisStep = 1.0 * exponent;
    }
    else
    {
        axisStep = 2.0 * exponent;
    }
    return axisStep;
}

もう少し、綺麗な書き方ありそうですが。。

コメント

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