Forzar BarChart eje Y etiquetas a ser enteros?

He creado un BarChart usando MPAndroidChart y estoy entrando los datos dinámicamente. Esto significa que necesito que mi eje Y también se determine dinámicamente. Todos mis datos están representados como números enteros, sin embargo, el eje Y a veces muestra la leyenda como valores decimales con 1 punto decimal.

He intentado utilizar un ValueFormatter para redondear los valores, pero el problema es que a veces los valores de Y no están en las posiciones del valor entero (por ejemplo 0.8.1.6.2.4, etc). Por lo tanto, si sólo edito estos números enteros, no estarán en la ubicación correcta.

¿Hay de todos modos que puedo forzar el BarChart a sólo mostrar valores en ubicaciones de entero? Su autorización si salta algo, de hecho lo quiero a cuando los valores consiguen grandes.

Edit: Cuando dije que los números enteros no están en las ubicaciones correctas, quise decir que una vez que modifico lo que cada etiqueta muestra que no son "correctas". En mi ejemplo tengo 5 barras mostrando los valores 3,4,2,3,2. La primera imagen es 'default', la segunda es la imagen una vez que he editado el formador de valores usando:

myBarChart.getYLabels().setFormatter(new ValueFormatter() { @Override public String getFormattedValue(float v) { return ((int) v)+""; } }); 

Introduzca aquí la descripción de la imagenIntroduzca aquí la descripción de la imagen

Como podemos ver en estas imágenes, mis valores enteros no están donde deben estar (y hay dos '2s'). En este ejemplo, excepto que para mostrar los valores 0,1,2,3,4. Si tengo muchos más datos espero que sea lo suficientemente inteligente como para mostrar sólo los valores que tengo espacio para, por lo que para los ejemplos, si los datos contienen valores de 0-50 se muestra algo como 0,10,20,30 , 40,50 o posiblemente 0,15,30,45, etc.

De acuerdo, ahora veo tu problema. El problema es que el YAxis (YLabels) determina el número de dígitos y por lo tanto los pasos entre cada etiqueta automáticamente .

Desafortunadamente, actualmente no es posible personalizar la forma en que el eje se calcula o configura etiquetas personalizadas.

Estoy pensando en añadir una característica de este tipo en el futuro, donde el usuario puede autodefinir qué valores se dibujan como las etiquetas del eje.

Sólo una pista:

La matriz mEntries que contiene todas las etiquetas de eje es pública. Por lo tanto, en general, puede modificarlo después de haber sido creado. Sin embargo, no estoy absolutamente seguro de cómo se comportará el eje si lo modifica manualmente.

Pero tal vez valga la pena intentarlo 🙂 https://github.com/PhilJay/MPAndroidChart/blob/master/MPChartLib/src/com/github/mikephil/charting/components/YAxis.java

Así es como resolví este problema. Parece que el eje y siempre se dibuja 1 sobre el valor máximo (si no lo fuerza). Así que establezca el recuento de etiquetas 2 sobre el valor máximo (incluya cero y uno sobre su máximo), entonces todo lo que necesita hacer es quitar el decimal con el formateador de eje. Esto funciona si todos sus valores y son enteros, no estoy seguro de cómo funcionaría con valores decimales.

  barChart.getAxisLeft().setLabelCount(maxYvalue + 2, true); barChart.getAxisLeft().setAxisMinValue(0f); barChart.getAxisLeft().setAxisMaxValue(maxYvalue + 1); YAxisValueFormatter customYaxisFormatter = new YAxisValueFormatter() { @Override public String getFormattedValue(float value, YAxis yAxis) { return String.valueOf((int)value); } }; barChart.getAxisLeft().setValueFormatter(customYaxisFormatter); 

Bastante simple. Todo lo que necesitas es dos cosas:

  1. Formateador de valores de ejes

     mChart.getAxisLeft().setValueFormatter(new ValueFormatter() { @Override public String getFormattedValue(float value) { return String.valueOf((int) Math.floor(value)); } }); 
  2. Recuento de etiquetas del eje

     int max = findMaxYValue(yourdata); // figure out the max value in your dataset mChart.getAxisLeft().setLabelCount(max); 

Después de mirar alrededor sin ninguna solución disponible, he decidido mirar en el javadoc y encontré sobre este método: setGranularity(float) . Para forzar el YAxis a mostrar siempre enteros (o cualquier intervalo que desee), sólo tiene que llamar a esto:

 yAxisLeft.setGranularity(1.0f); yAxisLeft.setGranularityEnabled(true); // Required to enable granularity 

Sin embargo, si los valores min y max del gráfico están demasiado cerca, el gráfico no respetará setLabelCount() , a menos que cuando sea forzado (lo que hará las etiquetas en decimal de nuevo), por lo que necesita llamar a esto después de configurar datos:

 private void calculateMinMax(BarLineChartBase chart, int labelCount) { float maxValue = chart.getData().getYMax(); float minValue = chart.getData().getYMin(); if ((maxValue - minValue) < labelCount) { float diff = labelCount - (maxValue - minValue); maxValue = maxValue + diff; chart.getAxisLeft().setAxisMaximum(maxValue); chart.getAxisLeft().setAxisMinimum(minValue); } } 

¡Y eso es!

Sé que estoy respondiendo muy tarde, pero estoy tratando de arrojar algo más de luz sobre este tema para que los futuros usuarios tienen un poco más de conocimientos sobre lo mismo.

También me enfrenté al mismo problema. Utilicé MyYAxisValueFormatter para mostrar sólo el valor entero en Y-Axis . A continuación se muestra el código para el mismo.

 public class MyYAxisValueFormatter implements YAxisValueFormatter { private DecimalFormat mFormat; public MyYAxisValueFormatter () { mFormat = new DecimalFormat("###,###,##0"); } @Override public String getFormattedValue(float value, YAxis yAxis) { // write your logic here // access the YAxis object to get more information return mFormat.format(value); } } 

Usando esta clase lo que sucede es definitivamente que muestra los valores del eje Y en formato de número entero, pero también duplicar algún valor. Esto es debido a la conversión del valor flotante en entero.

Dejar decir por ejemplo 0.4 será convertido a 0 así que habrá dos o puede ser más 0 valores en Y-Eje.

Creo que esto es lo que sucede en el caso de @Fozefy .

Implementé a continuación código dado para resolver este problema y su trabajo como un encanto. setAxisMaxValue función setAxisMaxValue para establecer un valor máximo personalizado para el eje Y y setLabelCount para establecer el número de entradas de etiqueta para el eje Y.

  YAxis yAxis = chart.getAxis(YAxis.AxisDependency.LEFT); // Minimum section is 1.0f, could be 0.25f for float values float labelInterval = 1.0f / 2f; int sections; //No of sections in Y-Axis, Means your Highest Y-value. do { labelInterval *= 2; //Interval between labels in Y-Axis sections = ((int) Math.ceil(chart.getYMax() / labelInterval)); } while (sections > 10); // If the ymax lies on one of the top interval, add another one for some spacing if (chart.getYMax() == sections * labelInterval) { sections++; } yAxis.setAxisMaximum(labelInterval * sections); yAxis.setLabelCount(sections + 1, true); 

El intervalo de etiqueta sigue siendo uno si su máximo valor de y es menos de 10 si no dos. Puede personalizar este comportamiento según su requisito y también aumentar el intervalo de etiquetas modificando el bucle do-while.

También asegúrese de que está utilizando el setLabelCount(int count, boolean force) y el valor de la force paso a true .

Yo también me enfrenté al mismo problema .. Sólo el uso debajo del código para deshacerse de él!

 chart.getAxisLeft().setValueFormatter(new ValueFormatter() { @Override public String getFormattedValue(float value) { return String.valueOf((int) Math.floor(value)); } }); 

Codificación feliz

  • ¿Cómo obtener el valor del eje x de la barra seleccionado con MPAndroidChart?
  • Mostrar el valor cuando se pulsa
  • MPAndroidChart: agregar imagen personalizada dentro de las barras
  • MPAndroidChart ajuste gráfico padding / offset
  • Android: arrastrar en MPAndroidChart no responde cuando está contenido en ScrollView
  • Cómo ocultar leyendas y el eje en MPAndroidChart?
  • MPAndroidChart BarChart Grouped DataSets
  • ¿Cómo hacer que un CombinedChart tenga dos escalas diferentes en MPAndroidChart?
  • MPAndroidChart LineChart personalizado resaltar dibujable
  • Cómo obtener el desplazamiento de desplazamiento en MPAndroidChart?
  • MarkerView no aparece con MPAndroidChart
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.