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).
- Cómo ocultar valores dibujados en MPAndroidChart?
- MPAndroidChart - Diagrama de barras redondeado
- leyenda desplazable mpandroidchart piechart
- Personalización de leyenda MPAndroidChart
- ¿Cómo no dibujar valores cero en un linechart mientras muestra sus valores de eje X en MPAndroidChart?
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 ..]
Pregunta
¿Existe una manera de controlar el posicionamiento de las etiquetas del eje x para lograr los resultados anteriores?
- Mpandroidchart - ¿Cómo puedo evitar los valores repetidos en Y-Axis?
- ¿Hay una manera de ocultar etiquetas de valor para cada barra en el gráfico de barras en MPAndroidChart?
- Ocultar puntos desde MPChart LineChart
- Dibujar línea vertical en el centro de un gráfico de líneas (indicador)
- MPAndroidChart StackedBarChart mostrando valores pero sin barras
- El fondo de gráfico de sectores cambia cuando el segmento es demasiado pequeño en MPAndroidChart
- MPAndroidChart ocultar rejilla de fondo
- Cómo cambiar el fondo del gráfico con la biblioteca MPAndroidChart?
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; }
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
- ¿Cómo agregar botones a la vista de búsqueda en la barra de herramientas de Android?
- El icono de la aplicación no aparece en la barra de acciones de Android