C#でグラフを書く場合はChartを使うと簡単に書く事ができますが、Chartだけでは物足り無い事や、描画速度が遅かったりするので、自前でグラフを書こうとしたときに、Chartでやっているグラフの軸の間隔(下図の例では20)は、どうようにして決めているのか?
いまいち分からなかったので、調べてみました。
本当は、ソースコードから、どうやっているのか?見たかったのですが、よく分からなかったので、とりあえず、Chartの動きをよ~く見てみました。
下図の例は棒グラフで、値を(1, 1),(2, 2),(3, 3),(4, 4),(5, 5)・・・
とデータを追加した時の様子
すると、軸の間隔は
0.2、0.5、1、2、5、10、20、50、100、200、500・・・
という風に変化している事がわかりました。
結局、値そのものは 1、2、5 の繰り返し+指数で表現できそうだったので、グラフの最大値を浮動小数点で表してみると、仮数の部分の数値で1,2,5のいづれかが決まっているようでした。
例えば、125の場合は 1.25x102 なので、仮数は1.25で、この時のグラフの間隔は 0.2x102 の 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;
}
もう少し、綺麗な書き方ありそうですが。。
コメント