【问题标题】:How to add x axis as datetime label in MPAndroidChart?如何在 MPAndroidChart 中添加 x 轴作为日期时间标签?
【发布时间】:2017-05-16 12:18:35
【问题描述】:

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

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

【问题讨论】:

标签: android mpandroidchart


【解决方案1】:

试试下面的。

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

希望对你有帮助

【讨论】:

  • 嗨,我在下面添加了 xaxis,您能检查一下它是正确的还是错误的? ArrayList xAxisValues = new ArrayList(); for (int i = 0; i
  • 是日期显示。但是日期太长了。
  • 是如何避免崩溃?
  • 将此添加到您的图表 mChart.setDragEnabled(true); mChart.setPinchZoom(true); mChart.setDoubleTapToZoomEnabled(true); mChart.setHorizo​​ntalScrollBarEnabled(true); mChart.getViewPortHandler().setMaximumScaleX(5f); mChart.getViewPortHandler().setMaximumScaleY(5f);
  • 我已经实现了你想要的东西。可以请你试试这个。 stackoverflow.com/a/40806503/1343788
【解决方案2】:

如果它仍然真的......

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 put String[] values (public DateAxisValueFormatter(String[] values) ) 其中每个值都是一个 DateString。 X 的数据系列条目(new Entry(forX,forY))必须是 flat array = 0,1,2,3,4

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

【讨论】:

    【解决方案3】:

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

    编码愉快!

    【讨论】:

    • 你能解释一下如何在这个图表中添加值DataArray.add(new Entry(secondsSince1970Float, yValueFloat));
    • 这是在“for in”循环中完成的,循环遍历 secondsSince1970Float 和 yValueFloat 数据的映射以输入图表。
    • 是的,谢谢
    【解决方案4】:

    进一步从@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).

    【讨论】:

      猜你喜欢
      • 2021-04-07
      • 2017-04-09
      • 2017-10-13
      • 2015-06-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-09-06
      • 1970-01-01
      相关资源
      最近更新 更多