Domanda

Qualcuno ha un algoritmo decente per calcolare i minimi e i massimi degli assi?

Quando creo un grafico per un determinato insieme di elementi di dati, mi piacerebbe essere in grado di fornire l'algoritmo:

  • il valore massimo (y) nel set
  • il valore minimo (y) nel set
  • il numero di segni di graduazione da visualizzare sull'asse
  • un valore facoltativo that dovere appaiono come un segno di spunta (ad es.zero quando vengono visualizzati i valori +ve e -ve)

L'algoritmo dovrebbe tornare

  • il valore dell'asse più grande
  • il valore dell'asse più piccolo (sebbene ciò possa essere dedotto dal più grande, dalla dimensione dell'intervallo e dal numero di tick)
  • la dimensione dell'intervallo

Le zecche dovrebbero essere posizionate a intervalli regolari e di dimensioni "ragionevoli" (ad es.1, 3, 5, forse anche 2,5, ma non più sig fig).

La presenza del valore opzionale lo distorcerà, ma senza quel valore dovrebbe apparire l'elemento più grande tra i due segni di graduazione superiori, il valore più basso tra i due inferiori.

Questa è una domanda indipendente dal linguaggio, ma se ci fosse una libreria C#/.NET in giro, sarebbe fantastico ;)

È stato utile?

Soluzione

Sto usando jQuery flottare libreria di grafici.È open source e genera abbastanza bene assi/tick.Suggerirei di guardare il suo codice e di prendere alcune idee da lì.

Altri suggerimenti

OK, ecco cosa ho pensato per una delle nostre applicazioni.Tieni presente che non riguarda lo scenario del "valore facoltativo" che hai menzionato, poiché il nostro valore facoltativo è sempre 0, ma non dovrebbe essere difficile per te modificarlo.

I dati vengono continuamente aggiunti alla serie, quindi manteniamo aggiornato l'intervallo dei valori y controllando ciascun punto dati man mano che viene aggiunto;questo è molto economico e facile da tenere traccia.Valori minimi e massimi uguali sono casi speciali:una spaziatura pari a 0 indica che non deve essere tracciato alcun contrassegno.

Questa soluzione non è dissimile dal suggerimento di Andrew sopra, tranne che si occupa, in modo un po' goffo, di alcune frazioni arbitrarie del moltiplicatore dell'esponente.

Infine, questo esempio è in C#.Spero che sia d'aiuto.

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

Posso consigliare quanto segue:

  • Imposta un numero minimo di linee principali visivamente accattivante.Ciò dipenderà dalla natura dei dati che stai presentando e dalla dimensione del grafico che stai realizzando, ma 7 è un numero abbastanza buono
  • Scegli l'esponente e il moltiplicatore in base a una progressione di 1, 2, 5, 10, ecc.che ti darà almeno il numero minimo di linee principali.(cioè.(max-min)/(scala x 10^esponente) >= minimo_tick_marks)
  • Trova il multiplo intero minimo del tuo esponente e moltiplicatore che rientra nel tuo intervallo.Questo sarà il primo segno di spunta importante.Il resto delle zecche derivano da questo.

Questo è stato utilizzato per un'applicazione che consentiva il ridimensionamento arbitrario dei dati e sembrava funzionare bene.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top