2016-11-25 52 views
6

tłaMPAndroidChart oś x data/czas etykieta formatowania

Dla niektórych wykresów w moim app używam biblioteki MPAndroidChart. Wszystkie poziomy osi moich wykresów są oparte na czasie, mogą obejmować cały rok, miesiąc, tydzień, dzień lub okres jednej godziny. Zawsze pokazuje pełny okres, czyli od stycznia do grudnia, od poniedziałku do niedzieli, od 0:00 do 24:00 itd. Wartość osi jest zawsze znacznikiem czasu epoki (w sekundach).

Wymagania

Chcę etykiety osi x do poniższych zasad:

  • w 1 miesiąca w przypadku roku rozpiętości;
  • w początek dnia w przypadku miesiąca lub tydzień rozpiętość;
  • na dowolnej pełnej godzinie (##: 00) (nie wszystkie) w przypadku przedziału dzień;
  • na dowolnym 5 minutowym punkt na godzin przęsła.

Problem

mogę ustawić granularity na osi x, co sprawia, że ​​na pewno nie ma mniejszą przestrzeń między dwoma punktami następnie ziarnistość mówi, ale to może oznaczać, że (w przypadku dnia span) pierwsza etykieta jest o 1:00 rano, a druga o 2:01, a trzecia o 3:16 rano, ponieważ pasuje do ziarnistości (minimum) 60 minut.

Aktualny błędna sytuacja, która idealnie będzie coś [0:00, 3:00, 6:00, 9:00 ..]

Example of current situation

Pytanie

Czy istnieje sposób, aby kontrolować pozycjonowanie etykiety osi x, aby osiągnąć wyniki powyżej ?

Odpowiedz

3

Zrobiłem to samo, spróbuj tego,

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

w tym range w Twoim przypadku. Jeśli chcesz miesięcy to nie jest 12, w przypadku 7 tygodniu itd

w interval zdać 1.

w slot trzeba przejść, identyfikacja danych, takich jak miesiąc, rok, dzień, mam użyj do tego wyliczenia.

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

Patrz: http://prntscr.com/dbn62x

+0

Proszę poprawić mnie, jeśli się mylę, ale nie zmienia to tylko wartości wyświetlanych, a nie faktyczne położenie etykiet. Pokazuje poprawne wartości, ale w (nieznacznie) nieprawidłowych lokalizacjach. – Marcel50506

+0

@ Marcel50506 czy możesz mi powiedzieć, proszę, czy ta odpowiedź zadziałała dla ciebie? – MeknessiHamida

+0

@MeknessiHamida: Nie, to nie rozwiązało mojego problemu. Jak wspomniano w poprzednim komentarzu, nie określa ona poprawnej lokalizacji etykiet. – Marcel50506

0

Miałem podobny problem z dni tygodnia ...

Moje sygnatury czasowe były w tym samym formacie co twoje, ale kiedy zostały zamienione na zmienne dla wpisów, straciły zbyt dużo precyzji i dawały mi nieregularne interwały.

konwertowane moje sygnatury czasowe w Millis do znaczników czasu w minutach, a teraz działa idealnie

czek że konwersja pływak nie brudząc z precyzją, a stamtąd można ustawić resztę params, które będą ustaw regularne interwały