Precisione Auto-Interval in MS Chart

Attualmente sto utilizzando la creazione di grafici all’interno di .NET utilizzando System.Windows.Forms.DataVisualization.Charting.Chart . Finora sembra molto potente e funziona alla grande. Tuttavia, vi è un enorme problema in termini di come si auto-calcola gli intervalli. Uso molti valori double , e in librerie come ZedGraph, gestisce perfettamente questo. Seleziona min / max / intervallo bene. Tuttavia, in MS Chart, è ansible selezionare 206.3334539832 come minimo e intervalli con una precisione decimale simile. Ovviamente questo sembra abbastanza brutto.

Così, ho provato semplicemente a fare il formato dell’asse {0.00} e funziona alla grande quando carica il grafico. Tranne quando si esegue lo zoom in avanti, è necessaria una maggiore precisione, forse a 4 cifre decimali anziché a 2. Sembra che io sia bloccato con 9 posizioni decimali per tutto il tempo, oppure un numero fisso costante che può rompersi quando qualcuno richiede maggiore precisione. Preferisco che raccolga la precisione in base al livello di zoom attualmente applicato. Librerie come ZedGraph e Dundas (che credo utilizzi anche la MS!) Tendono a selezionare valori validi che cambiano man mano che si ingrandisce e rimpicciolisce.

C’è un modo per cambiare gli intervalli con precisione quando cambia il frame dello zoom? È probabilmente una proprietà semplice che ho impostato in modo errato, ma è difficile dire con milioni di proprietà questa cosa (specialmente quando ci sono circa 14 posizioni che rappresentano il concetto di intervallo).

Ho avuto lo stesso identico problema durante lo zoom. Ho aggiunto il codice per formattare le etichette degli assi e chiamarlo dal gestore Paint. Gli oggetti Vista asse hanno una proprietà IsZoomed e dispongono di funzioni per ottenere i limiti dell’asse corrente (GetViewMinimum / Maximum). Ho impostato Axis LabelStyle.Format su “N” per tutti i casi a meno che Max-Min = non sia inferiore a 1. Quindi ho impostato il formato su “F #” dove # è calcolato in base all’intervallo dell’asse.

 # = Convert.ToInt32(Math.Abs(Math.Log10(range) - .5)) + 1; 

Avendo giocato con il controllo grafico non sono stato in grado di trovare una soluzione semplice al tuo problema. Tuttavia il seguente potrebbe aiutare:

Hai considerato di impostare da solo i valori massimo e minimo per gli assi? Se si arrotondano i valori massimi e minimi effettivi al numero “round” sensibile più vicino (5, 10, 0.5, 0.01), questo dovrebbe rendere gli intervalli calcolati un po ‘più amichevoli.

Capisco che questa non è una soluzione ideale, ma scegliendo accuratamente i valori massimo e / o minimo è ansible garantire che gli intervalli siano numeri “più belli”. Se l’intervallo dei tuoi assi è dire divisibile per 2, 5 e 10, dovrebbe risultare in intervalli abbastanza buoni.

Perché non modificare la stringa del formato numerico.

Crea una stringa di formato

 string formatString = "{0.00"; 

Identifica il livello di zoom, ad esempio zoomLevel = 2;

 formatString = formatString.PadRight(5+zoomLevel, '0'); formatString += "}"; 

Ora usa questo formato sulla legenda degli assi. Utilizzare il generatore di stringhe o un modo migliore per modificare la stringa di formato.

Per fornire il risultato con un costo minimo è ansible utilizzare il formato scientifico esponenziale

È ansible albind per personalizzare l’ evento. Da lì, puoi modificare le etichette sull’asse x:

 var xAxisLabels = chart1.ChartAreas[0].AxisX.CustomLabels; ... xAxisLabels[0].Text = ... 

imposta min. e max. valori:

  chart1.ChartAreas[0].AxisX.Maximum = ...; 

eccetera.

puoi aggiornare in modo dinamico il massimo e il minimo in base al tuo set di dati. ogni volta che l’utente esegue lo zoom, esegui un FOREACH su ogni punto e ottieni le statistiche e in base a tale set le tue massime e min

Aiuta ad impostare l’IntervalOffset dell’asse, ecco un esempio:

 Private Sub chMap_AxisViewChanged(sender As System.Object, e As System.Windows.Forms.DataVisualization.Charting.ViewEventArgs) Handles chMap.AxisViewChanged 'the grid ticks are rounded values e.Axis.IntervalOffset = -e.Axis.ScaleView.ViewMinimum End Sub