MPAndroidChart x-axis date/time label formatting

前端 未结 2 468
-上瘾入骨i
-上瘾入骨i 2020-12-06 01:38

Background

For some charts in my app, I\'m using the MPAndroidChart library. All horizontal axis\' of my graphs are time based, they can span a full

相关标签:
2条回答
  • 2020-12-06 02:09

    I had a similar issue with days of the week...

    My timestamps were in the same format as yours, but when they were converted to floats for the entries, they'd lose too much precision and give me irregular intervals.

    I converted my timestamps in millis to timestamps in minutes, and now it works perfectly

    check that the float conversion isn't messing with your precision, and from there you can set the rest of the params that will make your intervals regular

    0 讨论(0)
  • 2020-12-06 02:18

    I have done same thing, Try this,

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

    in this range in your case. If you want month then there is 12, in case of week 7 etc.

    in interval you pass 1.

    in slot you have to pass, identification of your data like month, year, day, i have use enum for this.

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

    See: http://prntscr.com/dbn62x

    0 讨论(0)
提交回复
热议问题