如何在MPAndroidChart中添加x轴作为日期时间标签?

时间:2017-01-02 11:30:56

标签: android mpandroidchart

我在我的项目中实现了温度报告的折线图(MPAndroidChart库)。在X轴上应绘制日期时间并绘制Y轴温度。

我刚刚将日期时间添加为X轴标签中的字符串,但它已折叠。所以请任何人指导我。

4 个答案:

答案 0 :(得分:2)

请尝试以下操作。

设置X轴

 XAxis xAxis = mChart.getXAxis();
        xAxis.setPosition(XAxis.XAxisPosition.BOTTOM);
        xAxis.setValueFormatter(new MyXAxisValueFormatter());
        xAxis.setLabelsToSkip(0);

创建新的MyXAxisValueFormatter工具XAxisValueFormatter

public class MyXAxisValueFormatter implements XAxisValueFormatter {

@Override
public String getXValue(String dateInMillisecons, int index, ViewPortHandler viewPortHandler) {
    try{
        SimpleDateFormat sdf = new SimpleDateFormat("dd MMM");

        return sdf.format(new Date(Long.parseLong(dateInMillisecons)));
    }
   catch (Exception e)
   {
       return  dateInMillisecons;
   }

}

希望这有帮助

答案 1 :(得分:2)

使用 MPAndroidChart 3.0+ 版:

将格式化程序设置为 x 轴(在下面创建):

// Formatter to adjust epoch time to readable date
lineChart.xAxis.setValueFormatter(new LineChartXAxisValueFormatter());

新建一个 LineChartXAxisValueFormatter 类:

public class LineChartXAxisValueFormatter extends IndexAxisValueFormatter {

    @Override
    public String getFormattedValue(float value) {

        // Convert float value to date string
        // Convert from seconds back to milliseconds to format time  to show to the user
        long emissionsMilliSince1970Time = ((long) value) * 1000;

        // Show time in local version
        Date timeMilliseconds = new Date(emissionsMilliSince1970Time);
        DateFormat dateTimeFormat = DateFormat.getDateInstance(DateFormat.MEDIUM, Locale.getDefault());

        return dateTimeFormat.format(timeMilliseconds);
    }
}

当条目添加到 chartDataArray 时,它们以秒为单位添加,而不是毫秒,以避免输入为浮点数(即毫秒除以 1000)时潜在的精度问题。

chartDataArray.add(new Entry(secondsSince1970Float, yValueFloat));

快乐编码!

答案 2 :(得分:1)

根据@Ben 的回答,如果您正在创建条形图,并且条形图的时间跨度类似于一小时或一天,并且您提供毫秒或秒的数据,则最终会使条形图变得太细而无法可见。这是 2017 年 (https://github.com/PhilJay/MPAndroidChart/issues/2892) 发布的错误,遗憾的是至今仍未解决。

提出了一种解决方法,它是先将毫秒值转换为条形图的时间跨度,然后再将其设置为 BarEntry。我的时间跨度是一天,所以 我有格式化程序:

    static class BarChartXAxisValueFormatter extends IndexAxisValueFormatter {

    @Override
    public String getFormattedValue(float value) {

        // Convert float value to date string
        // Convert from days back to milliseconds to format time  to show to the user
        long emissionsMilliSince1970Time = TimeUnit.DAYS.toMillis((long)value);
        // Show time in local version
        Date timeMilliseconds = new Date(emissionsMilliSince1970Time);
        SimpleDateFormat dateTimeFormat = new SimpleDateFormat("MM-dd");

        return dateTimeFormat.format(timeMilliseconds);
    }
}

我设置了 X 轴:

xAxis.setValueFormatter(new BarChartXAxisValueFormatter());

然后当设置数据到栏时,我有

new BarEntry(TimeUnit.MILLISECONDS.toDays((long)valX), valY)

答案 3 :(得分:0)

如果实际上仍然...

class DateAxisValueFormatter implements IAxisValueFormatter {
  private String[] mValues;

  SimpleDateFormat sdf = new SimpleDateFormat("yyyy.MM.dd.hh");

  public DateAxisValueFormatter(String[] values) {
      this.mValues = values; }


   @Override
   public String getFormattedValue(float value, AxisBase axis) {
        // "value" represents the position of the label on the axis (x or y)
        return mValues[(int) value];
      }
    }
  • 并且您必须在Create上放置String[](public DateAxisValueFormatter(String[] values) ),其中每个值都是DateString。 X的数据系列条目(新条目(forX,forY))必须为flat array = 0,1,2,3,4

  • 对不起,我的英语不好,我来自俄罗斯。自1988年起担任水电厂实时控制系统开发公司的主要负责人(www.asu-epro.ru)。 Borodatov迈克尔miclosoft@mail.ru