Frage

Hat jemand einen anständigen Algorithmus zur Berechnung von Achsenminima und -maxima?

Beim Erstellen eines Diagramms für einen bestimmten Satz von Datenelementen möchte ich dem Algorithmus Folgendes geben können:

  • der maximale (y) Wert im Satz
  • der minimale (y) Wert im Satz
  • die Anzahl der Teilstriche, die auf der Achse angezeigt werden sollen
  • ein optionaler Wert, der muss als Häkchen erscheinen (z.B.Null, wenn +ve- und -ve-Werte angezeigt werden)

Der Algorithmus sollte zurückkehren

  • der größte Achsenwert
  • der kleinste Achsenwert (obwohl dieser aus dem größten, der Intervallgröße und der Anzahl der Ticks abgeleitet werden könnte)
  • die Intervallgröße

Die Zecken sollten in regelmäßigen Abständen angebracht werden und eine „angemessene“ Größe haben (z. B.1, 3, 5, möglicherweise sogar 2,5, aber keine weiteren Signifikanten).

Das Vorhandensein des optionalen Werts wird dies verzerren, aber ohne diesen Wert sollte das größte Element zwischen den beiden oberen Teilstrichen und der niedrigste Wert zwischen den beiden unteren erscheinen.

Dies ist eine sprachunabhängige Frage, aber wenn es eine C#/.NET-Bibliothek gibt, wäre das der Knaller ;)

War es hilfreich?

Lösung

Ich habe jQuery verwendet flot Graphenbibliothek.Es ist Open Source und beherrscht die Achsen-/Tick-Generierung recht gut.Ich würde vorschlagen, einen Blick auf den Code zu werfen und daraus einige Ideen zu ziehen.

Andere Tipps

OK, hier ist, was ich mir für eine unserer Anwendungen ausgedacht habe.Beachten Sie, dass das von Ihnen erwähnte Szenario mit dem „optionalen Wert“ nicht behandelt wird, da unser optionaler Wert immer 0 ist, die Änderung für Sie jedoch nicht schwierig sein dürfte.

Der Reihe werden kontinuierlich Daten hinzugefügt, daher halten wir den Bereich der y-Werte lediglich auf dem neuesten Stand, indem wir jeden Datenpunkt überprüfen, sobald er hinzugefügt wird.Dies ist sehr kostengünstig und leicht zu verfolgen.Gleiche Mindest- und Höchstwerte sind Sonderfälle:Ein Abstand von 0 gibt an, dass keine Markierungen gezeichnet werden sollen.

Diese Lösung ist dem obigen Vorschlag von Andrew nicht unähnlich, abgesehen davon, dass sie auf etwas umständliche Weise mit einigen willkürlichen Brüchen des Exponentenmultiplikators umgeht.

Schließlich ist dieses Beispiel in C#.Ich hoffe es hilft.

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

Folgendes kann ich empfehlen:

  • Legen Sie eine optisch ansprechende Mindestanzahl an Hauptlinien fest.Dies hängt von der Art der Daten ab, die Sie präsentieren, und von der Größe des Diagramms, das Sie erstellen, aber 7 ist eine ziemlich gute Zahl
  • Wählen Sie den Exponenten und den Multiplikator basierend auf einer Progression von 1, 2, 5, 10 usw.Dadurch erhalten Sie mindestens die Mindestanzahl an Hauptlinien.(d. h.(max-min)/(Skala x 10^Exponent) >= Minimum_tick_marks)
  • Finden Sie das kleinste ganzzahlige Vielfache Ihres Exponenten und Multiplikators, das in Ihren Bereich passt.Dies wird der erste große Tick sein.Die restlichen Ticks leiten sich davon ab.

Dies wurde für eine Anwendung verwendet, die eine beliebige Skalierung von Daten ermöglichte und offenbar gut funktionierte.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top