MPAndroidChart x 轴日期/时间标签格式 [英] MPAndroidChart x-axis date/time label formatting




对于我应用中的一些图表,我使用的是 MPAndroidChart 库.我的图表的所有水平轴都是基于时间的,它们可以跨越一整年、一个月、一周、一天或一个小时.它总是显示一个完整的时间段,例如 1 月至 12 月、周一至周日、0:00 - 24:00 等.轴的值始终是纪元时间戳(以秒为单位).

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 year, a month, a week, a day or span one hour. It always shows a full period, so January-December, Monday-Sunday, 0:00 - 24:00 etc. The value of the axis is always the epoch-timestamp (in seconds).


我希望 x 轴标签遵循以下规则:

I want the x-axis labels to follow these rules:

  • 月 1 日(如果是 跨度);
  • 一天的开始,如果是跨度;
  • 在任何整小时 (##:00)(并非全部),如果是跨度;
  • 小时跨度的任何5分钟点上.
  • at 1st of month in case of year span;
  • at start of day in case of month or week span;
  • on any full hour (##:00) (not perse all) in case of a day span;
  • on any 5 minute point on an hour span.


我可以设置 x 轴的 granularity,这样可以确保两点之间的空间不小于粒度所说的,但这可能意味着(在一天跨度的情况下)第一个标签是凌晨 1:00,第二个是凌晨 2:01,第三个是凌晨 3:16,因为这符合(最小)60 分钟的粒度.

I can set the granularity of the x-axis, which makes sure there is no less space between two points then the granularity says, but that can mean that (in case of day span) the first label is at 1:00am, and the second at 2:01am and the third is at 3:16am, since that fits a granularity of (minimum) 60 minutes.

当前不正确的情况,最好是 [0:00, 3:00, 6:00, 9:00 ..]

Current incorrect situation, which would ideally be something like [0:00, 3:00, 6:00, 9:00 ..]



Is there a way to control the positioning of the x-axis labels to achieve the results above?



 XAxis xAxis = mChart.getXAxis();
    xAxis.setGranularity(1f); // only intervals of 1 day
    xAxis.setTextColor(ContextCompat.getColor(this, R.color.colorYellow));
    xAxis.setValueFormatter(new GraphXAxisValueFormatter(range, interval, slot));

在你的情况下,在这个 range 中.如果你想要一个月,那么有 12 个,如果是第 7 周等等.

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

interval 中你通过了 1.

in interval you pass 1.

slot 你必须通过,识别你的数据,比如月、年、日,我为此使用了枚举.

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++) {

        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;

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


public int getDecimalDigits() {
    return 0;


登录 关闭
发送“验证码”获取 | 15天全站免登陆