2011-11-07 12 views
7

Sto utilizzando CorePlot per rappresentare graficamente un insieme di dati. I dati per il mio asse x sono costituiti da date, mentre i dati per il mio asse y sono costituiti da float (che poi trasformo in NSNumber). Ricevo i dati da un feed e il feed restituisce numeri con un numero elevato di decimali, ad esempio: 0.46673718852844, 4.59392222219, 353.1293012045. Sto utilizzando il seguente pezzo di codice per formattare correttamente asse y:Formattazione corretta per iPhone CorePlot dell'asse Y

NSNumberFormatter *numberFormatter = [[[NSNumberFormatter alloc] init] autorelease]; 
[numberFormatter setNumberStyle:NSNumberFormatterDecimalStyle]; 
[numberFormatter setMaximumFractionDigits:3]; 
[numberFormatter setPositiveFormat:@"###0.000"];  
CPTXYAxis *y = axisSet.yAxis; 
y.labelingPolicy = CPTAxisLabelingPolicyAutomatic; 
y.minorTicksPerInterval = 1; 
y.preferredNumberOfMajorTicks = 5; 
y.labelFormatter = numberFormatter; 

Nella maggior parte dei casi, tutto funziona bene. Tuttavia, a volte visualizza lo stesso valore in più posizioni lungo l'asse. Vedi immagine qui sotto:

enter image description here

I valori sono presentati in modo corretto, vorrei solo evitare inutili (0,466) etichette. Ho anche cercato di arrotondare i numeri a 3 cifre decimali in numberForPlot metodo:

if(fieldEnum == CPTScatterPlotFieldY) 
{ 
     float floatNum = r.value; 
     floatNum *= 1000; 
     int intValue = (int) floatNum; 
     float decimal = floatNum - intValue; 
     if (decimal > 0.5) { 
      intValue++; 
     } 
     floatNum = intValue /1000.0; 
     return [NSNumber numberWithFloat:floatNum]; 

} 

ma non v'è alcuna differenza di etichette.

risposta

1

La proprietà preferredNumberOfMajorTicks indica all'algoritmo di etichettatura quanti segni di graduazione utilizzare. Se vuoi tre tick, impostalo su 3. Potresti anche aumentare il numero massimo di cifre di frazione per il formattatore di numeri per evitare del tutto il problema di arrotondamento.

+0

il problema è che questo non è l'unico grafico nella mia applicazione, e 5 tick di solito sembrano i migliori. la stessa cosa con le cifre: tre di solito sono sufficienti, non è necessario mostrare 4 cifre. ah, credo che dovrò fare un po 'di configurazione manuale del grafico. grazie comunque – Maggie

+0

La mia soluzione era di modificare dinamicamente il numero di tick in base alla gamma dell'asse. – Jackson

0

Credo che, poiché hai detto che vuoi 5 tick principali, è quello che otterrai, indipendentemente da quanto siano vicini i valori dell'asse y. Se senti che i valori sono troppo vicini, probabilmente dovrai modificare la proprietà preferredNumberOfMajorTicks.

Nella mia app che sto usando Core Plot, ho disattivato l'etichettatura automatica degli assi e sto mettendo insieme le mie etichette degli assi xey. È un po 'più di lavoro, ma mi piace la flessibilità di farlo da solo.

+0

che labelingPolicy usi per impostare manualmente le etichette? – Maggie

+0

@maggie un po 'in ritardo qui, ma sarebbe: CPTAxisLabelingPolicyNone –

0

Quello che ho fatto qui è stato impostare dinamicamente la proprietà preferredNumberOfMajorTicks mentre il grafico è tracciato. Poiché il mio formattatore mostra 3 posizioni decimali, ho usato il seguente codice per cambiare il numero di tick in base alla gamma dell'asse Y in modo che il formattatore mostrasse un valore univoco sull'asse ad ogni tick. Troppe zecche significa che le cifre decimali vengono troncate e che vi sono valori duplicati sull'asse Y.

  CPTXYAxis *y   = axisSet.yAxis; 
      { 
       y.preferredNumberOfMajorTicks = round([newYRange.length floatValue]/0.001); 
      } 

Spero che questo aiuti.

Problemi correlati