Question

Quelqu'un a-t-il un algorithme décent pour calculer les minima et les maxima des axes ?

Lors de la création d'un graphique pour un ensemble donné d'éléments de données, j'aimerais pouvoir donner à l'algorithme :

  • la valeur maximale (y) dans l'ensemble
  • la valeur minimale (y) dans l'ensemble
  • le nombre de graduations à apparaître sur l'axe
  • une valeur facultative qui doit apparaître sous la forme d'une coche (par ex.zéro lors de l'affichage des valeurs +ve et -ve)

L'algorithme devrait retourner

  • la plus grande valeur d'axe
  • la plus petite valeur d'axe (bien que cela puisse être déduit de la plus grande, de la taille de l'intervalle et du nombre de ticks)
  • la taille de l'intervalle

Les tiques doivent être à intervalles réguliers et doivent être d'une taille "raisonnable" (par ex.1, 3, 5, peut-être même 2,5, mais plus de figues sig).

La présence de la valeur facultative faussera cela, mais sans cette valeur, l'élément le plus grand devrait apparaître entre les deux graduations supérieures, la valeur la plus faible entre les deux inférieures.

C'est une question indépendante du langage, mais s'il existe une bibliothèque C#/.NET, ce serait génial ;)

Était-ce utile?

La solution

J'utilise jQuery flottant bibliothèque de graphiques.Il est open source et génère assez bien des axes/ticks.Je suggère de regarder son code et d'en extraire quelques idées.

Autres conseils

OK, voici ce que j'ai trouvé pour l'une de nos applications.Notez qu'il ne concerne pas le scénario de "valeur facultative" que vous mentionnez, puisque notre valeur facultative est toujours 0, mais elle ne devrait pas être difficile à modifier.

Les données sont continuellement ajoutées à la série, nous maintenons donc simplement la plage de valeurs y à jour en inspectant chaque point de données au fur et à mesure de son ajout ;c'est très peu coûteux et facile à suivre.Les valeurs minimales et maximales égales sont dans des cas particuliers :un espacement de 0 indique qu'aucun marqueur ne doit être dessiné.

Cette solution n'est pas différente de la suggestion d'Andrew ci-dessus, sauf qu'elle traite, de manière légèrement compliquée, certaines fractions arbitraires du multiplicateur d'exposant.

Enfin, cet exemple est en C#.J'espère que cela aide.

    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;
    }

Je peux recommander ce qui suit :

  • Définissez un nombre minimum de lignes principales visuellement attrayant.Cela dépendra de la nature des données que vous présentez et de la taille du tracé que vous réalisez, mais 7 est un assez bon nombre.
  • Choisissez l'exposant et le multiplicateur en fonction d'une progression de 1, 2, 5, 10, etc.cela vous donnera au moins le nombre minimum de lignes principales.(c'est à dire.(max-min)/(échelle x 10^exposant) >= minimum_tick_marks)
  • Trouvez le multiple entier minimum de votre exposant et de votre multiplicateur qui correspond à votre plage.Ce sera le premier tick majeur.Le reste des ticks en dérive.

Ceci a été utilisé pour une application qui permettait une mise à l'échelle arbitraire des données et semblait bien fonctionner.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top