Formato de etiqueta de fecha / hora de eje-x de MPAndroidChart

Fondo

Para algunos gráficos de mi aplicación, estoy usando la biblioteca MPAndroidChart. Todos los ejes horizontales de mis gráficos están basados ​​en el tiempo, pueden abarcar un año completo, un mes, una semana, un día o un período de una hora. Siempre muestra un período completo, por lo que enero-diciembre, lunes-domingo, 0:00 – 24:00, etc El valor del eje es siempre el epoch-timestamp (en segundos).

Requisito

Quiero que las etiquetas del eje x sigan estas reglas:

  • A 1 de mes en caso de año ;
  • Al comienzo del día en caso de mes o semana ;
  • En cualquier hora completa (##: 00) (no todas las perse) en caso de un período de un día ;
  • En cualquier punto de 5 minutos en un lapso de hora .

Problema

Puedo establecer la granularity del eje x, que asegura que no hay menos espacio entre dos puntos que la granularidad dice, pero eso puede significar que (en caso de intervalo de día) la primera etiqueta es a la 1:00 am, y la Segundo a las 2:01 am y el tercero a las 3:16 am, ya que se ajusta a una granularidad de (mínimo) 60 minutos.

Situación incorrecta actual, que idealmente sería algo así como [0:00, 3:00, 6:00, 9:00 ..]

Ejemplo de situación actual

Pregunta

¿Existe una manera de controlar el posicionamiento de las etiquetas del eje x para lograr los resultados anteriores?

He hecho lo mismo, Intente esto,

  XAxis xAxis = mChart.getXAxis(); xAxis.setPosition(XAxis.XAxisPosition.BOTTOM_INSIDE); xAxis.setDrawGridLines(false); xAxis.setGranularity(1f); // only intervals of 1 day xAxis.setTypeface(mTfLight); xAxis.setTextSize(8); xAxis.setTextColor(ContextCompat.getColor(this, R.color.colorYellow)); xAxis.setValueFormatter(new GraphXAxisValueFormatter(range, interval, slot)); 

En este range en su caso. Si quieres mes entonces hay 12, en caso de semana 7 etc.

En el interval que pasa 1.

En la slot que tiene que pasar, la identificación de sus datos como mes, año, día, tengo enum uso para esto.

 public class GraphXAxisValueFormatter implements IAxisValueFormatter { private static int MINUTES_INTERVAL = 5; private String[] mValues; private int mInterval; private SensorInterval.Interval mSlot; public GraphXAxisValueFormatter(List<BinSensorData> range, int interval, SensorInterval.Interval slot) { mValues = new String[range.size()]; mInterval = interval; mSlot = slot; Calendar calendar = Calendar.getInstance(); for (int i = 0; i < range.size(); i++) { calendar.setTimeInMillis(range.get(i).getTime()); int unroundedMinutes = calendar.get(Calendar.MINUTE); int mod = unroundedMinutes % MINUTES_INTERVAL; calendar.add(Calendar.MINUTE, mod < 8 ? -mod : (MINUTES_INTERVAL - mod)); String s = ""; if (slot.equals(SensorInterval.Interval.HOUR) || slot.equals(SensorInterval.Interval.DAY)) s = Util.getTimeFromTimestamp(calendar.getTimeInMillis()); else if (slot.equals(SensorInterval.Interval.WEEK)) s = Util.getDayFromTimestamp(calendar.getTimeInMillis()); else if (slot.equals(SensorInterval.Interval.MONTH)) s = Util.getMonthFromTimestamp(calendar.getTimeInMillis()); else if (slot.equals(SensorInterval.Interval.YEAR)) s = Util.getYearFromTimestamp(calendar.getTimeInMillis()); Util.setLog("Time : "+s); mValues[i] = s; } } @Override public String getFormattedValue(float value, AxisBase axis) { Util.setLog("Value : "+ value); if (value % mInterval == 0 && value >= 0) { return mValues[(int) value % mValues.length]; } else return ""; } @Override public int getDecimalDigits() { return 0; } 

Vea: http://prntscr.com/dbn62x

Tuve un problema similar con los días de la semana …

Mis marcas de tiempo estaban en el mismo formato que el tuyo, pero cuando se convirtieron en flotadores para las entradas, perderían demasiada precisión y me darían intervalos irregulares.

Convertido mis marcas de tiempo en millis a timestamps en minutos, y ahora funciona perfectamente

Compruebe que la conversión de flotador no está jugando con su precisión, ya partir de ahí se puede establecer el resto de los parámetros que harán que sus intervalos regulares

  • No se pudo resolver: com.github.PhilJay: MPAndroidChart: v2.1.4
  • Dibuja el valor de la barra en la barra
  • MPAndroidChart - ¿Cómo mostrar los valores y cuando su valor es cero?
  • MPAndroidChart - Añadir etiquetas al gráfico de barras
  • Cómo obtener el desplazamiento de desplazamiento en MPAndroidChart?
  • En MPAndroidChart, ¿cómo agregar el evento de clic para cada barra en Barchart?
  • Implementar etiquetas de fecha y hora continuas en el eje x de mpandroidchart
  • Android-MPChartLibrary no se puede reemplazar por defecto "No hay datos de gráfico de texto disponibles"
  • MPAndroidChart cómo establecer el color de la etiqueta?
  • Cómo resaltar varios valores con MPAndroidChart?
  • MPAndroidChart PieChart no se muestra cuando se utiliza en ScrollView
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.