2011-11-07 10 views
7

Estoy usando CorePlot para graficar un conjunto de datos. Los datos para mi eje x constan de fechas, mientras que los datos para mi eje y consisten en flotantes (que luego se convierten en NSNumber). Estoy obteniendo datos de un feed, y el feed devuelve números con un gran número de decimales, por ejemplo: 0.46673718852844, 4.59392222219, 353.1293012045. estoy usando el siguiente fragmento de código para formatear adecuadamente eje y:iPhone CorePlot formateo adecuado del eje 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; 

En la mayoría de los casos, todo funciona bien. Sin embargo, algunas veces muestra el mismo valor en múltiples posiciones a lo largo del eje. Ver la imagen a continuación:

enter image description here

Los valores se presentan correctamente, me gustaría evitar (0.466) etiquetas innecesarias. Incluso he intentado para redondear los números a 3 decimales en numberForPlot método:

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

} 

pero no hay diferencia en las etiquetas.

Respuesta

1

La propiedad preferredNumberOfMajorTicks le dice al algoritmo de etiquetado cuántas marcas usar. Si quiere tres tics, configúrelo en 3. También puede aumentar el número máximo de dígitos de fracción para el formateador de números para evitar el problema de redondeo.

+0

el problema es que este no es el único gráfico en mi aplicación, y 5 ticks generalmente se ven mejor. lo mismo con los dígitos: tres es suficiente, no es necesario mostrar 4 dígitos. ah, supongo que tendré que hacer una configuración manual del gráfico. gracias de todos modos – Maggie

+0

Mi solución fue cambiar dinámicamente el número de ticks dependiendo del rango del eje. – Jackson

0

Creo que porque ha dicho que quiere 5 tics principales, eso es lo que va a obtener, independientemente de lo cerca que estén los valores del eje y. Si percibe que los valores están muy juntos, probablemente deba ajustar su propiedad preferredNumberOfMajorTicks.

En mi aplicación que estoy usando Core Plot, apagué el etiquetado automático del eje y estoy armando mis propias etiquetas de eje xey. Es un poco más trabajo, pero me gusta la flexibilidad de hacerlo yo mismo.

+0

¿qué etiquetadoPolicy usas para configurar manualmente las etiquetas? – Maggie

+0

@maggie un poco tarde aquí, pero eso sería: CPTAxisLabelingPolicyNone –

0

Lo que hice aquí fue establecer dinámicamente mi propiedad preferredNumberOfMajorTicks mientras se representa el gráfico. Como mi formateador muestra 3 decimales, utilicé el siguiente código para cambiar el número de ticks en función del rango del eje Y, de modo que el formateador muestre un valor único en el eje en cada tic. Demasiadas marcas significa que los lugares decimales se cortan y hay valores duplicados en el eje Y.

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

Espero que esto ayude.

Cuestiones relacionadas