5

軸の最小値と最大値を計算するためのまともなアルゴリズムを持っている人はいますか?

特定のデータ項目セットのグラフを作成するとき、アルゴリズムを指定できるようにしたいと思います。

  • セット内の最大 (y) 値
  • セット内の最小 (y) 値
  • 軸に表示される目盛りの数
  • 目盛りとして表示する必要があるオプションの値(例: +ve および -ve 値を表示する場合はゼロ)

アルゴリズムは返す必要があります

  • 軸の最大値
  • 軸の最小値 (ただし、最大値、間隔サイズ、およびティック数から推測できます)
  • 間隔サイズ

ティックは一定の間隔である必要があり、「妥当な」サイズである必要があります (たとえば、1、3、5、場合によっては 2.5 ですが、それ以上の sig figs ではありません)。

オプションの値が存在するとこれが歪められますが、その値がないと、最大の項目が上の 2 つの目盛りの間に表示され、最小の値が下の 2 つの目盛りの間に表示されます。

これは言語にとらわれない質問ですが、C#/.NET ライブラリがあれば、それは素晴らしいことです ;)

4

3 に答える 3

2

OK、これが私たちのアプリケーションの 1 つに思いついたものです。オプションの値は常に0であるため、言及した「オプションの値」シナリオは処理しないことに注意してください。ただし、変更するのは難しくありません。

データはシリーズに継続的に追加されるため、追加された各データ ポイントを検査することで、y 値の範囲を最新の状態に保ちます。これは非常に安価で、簡単に追跡できます。最小値と最大値が等しいという特殊なケースがあります。間隔 0 は、マーカーを描画しないことを示します。

このソリューションは、指数乗数の任意の分数を少し扱いに​​くい方法で処理することを除いて、上記のアンドリューの提案と似ていません。

最後に、このサンプルは C# です。それが役に立てば幸い。

    private float GetYMarkerSpacing()
    {
        YValueRange range   = m_ScrollableCanvas.
                    TimelineCanvas.DataModel.CurrentYRange;
        if ( range.RealMinimum == range.RealMaximum )
        {
            return 0;
        }

        float   absolute    = Math.Max(
                    Math.Abs( range.RealMinimum ),
                    Math.Abs( range.RealMaximum ) ),
            spacing     = 0;
        for ( int power = 0; power < 39; ++power )
        {
            float   temp    = ( float ) Math.Pow( 10, power );
            if ( temp <= absolute )
            {
                spacing = temp;
            }
            else if ( temp / 2 <= absolute )
            {
                spacing = temp / 2;
                break;
            }
            else if ( temp / 2.5 <= absolute )
            {
                spacing = temp / 2.5F;
                break;
            }
            else if ( temp / 4 <= absolute )
            {
                spacing = temp / 4;
                break;
            }
            else if ( temp / 5 <= absolute )
            {
                spacing = temp / 5;
                break;
            }
            else
            {
                break;
            }
        }

        return spacing;
    }
于 2008-09-30T11:31:08.367 に答える
0

次のことをお勧めします。

  • 視覚的に魅力的な主線の最小数を設定します。これは、提示しているデータの性質と実行しているプロットのサイズによって異なりますが、7 はかなり良い数値です。
  • 指数と乗数を 1、2、5、10 などの進行に基づいて選択します。これにより、少なくとも主要な行の最小数が得られます。(つまり、(最大-最小)/(スケール x 10^指数) >= 最小の目盛り)
  • 範囲内に収まる指数と乗数の最小整数倍数を見つけます。これが最初の大きな目盛りになります。残りのティックはこれから導出されます。

これは、データの任意のスケーリングを許可するアプリケーションに使用され、うまく機能しているように見えました。

于 2008-09-30T10:55:32.243 に答える
0

jQuery flotグラフ ライブラリを使用しています。これはオープン ソースであり、軸/目盛りの生成が非常にうまく行われます。そのコードを見て、そこからいくつかのアイデアをつまむことをお勧めします。

于 2008-09-09T13:22:44.347 に答える