在 MPAndroidChart 中格式化 x 轴上的日期

Formatting Dates on x-axis in MPAndroidChart

我正在使用 MPAndroidChart and I know this topic is covered quite a bit in the docs,如果我遗漏了一些明显的东西,我深表歉意,但我在将时间戳值格式化为折线图 x 轴上的日期时遇到了一些问题。

似乎出于某种原因没有为我的 x 轴值调用 getFormattedValue()。如果我调试 AxisBase,它似乎只是想格式化 y 轴值,我没有设置自定义格式化程序。

这里是代码片段,主要取自 Github 文档:

          LineChart chart = (LineChart) findViewById(R.id.chart);
          XAxis xAxis = chart.getXAxis();

          // set min timestamp to Jul 2017 
          HourAxisValueFormatter(Long.parseLong("1499814559"));

          xAxis.setValueFormatter(new IAxisValueFormatter() {
             // THIS IS NEVER INVOKED!
            @Override
            public String getFormattedValue(float value, AxisBase axis) 
            {
                return new Date(Long.parseLong(""+value)).toString();
            }
        });

        // rating is a map of timestamp to numeric value, both stored 
        // as strings
        for (Map.Entry<String, String> rating : ratings.entrySet()) {
            String timestamp = rating.getKey();
            String ratingValue = rating.getValue();
            entries.add(new Entry(Float.parseFloat(timestamp), 
            Float.parseFloat(ratingValue)));
        }

            // add entries to dataset
            LineDataSet dataSet = new LineDataSet(entries, "Ratings");
            LineData lineData = new LineData(dataSet);
            chart.setData(lineData);
            chart.invalidate(); // refresh'

我使用的是 3.0.2 版的库:

compile 'com.github.PhilJay:MPAndroidChart:v3.0.2'

提前致谢,加里

根据需要的 output/actual 输出请求进行编辑: 理想情况下,我会有一系列沿 x 轴的日期,例如10/7、11/8、12/8 等根据我提供的 Epoch 值构建。我知道上面的代码不会按照目前的格式对其进行格式化,但只想将其格式化为最初的任何日期值(因此暂时忽略它),问题的症结在于我的格式化程序没有被调用全部.

下面是当前输出的截图,它只在 x=0 行打印一个值(请注意,即使提供了多个 y 值,我想知道它们是否都在同一个 x=0 上line 它只是画最后一点还是什么?):

调试上面的时间戳值,Float.parseFloat(timestamp) 等于 1.50516885e^12。例如,实际时间戳值是 1505168846751,但在解析为 Float 后四舍五入,并给出指数值。

编辑 2:

作为 'entries' 提供给 LineDataSet 的值的屏幕截图:

编辑 3: 问题似乎与我提供的 x 值的时间戳值的 size/format 有关,将它们更改为 1.0 -> 20.0f 范围内的小浮点值,导致格式化程序被调用为预期的。我需要进一步调试代码以了解为什么未格式化指数时间戳值。

从这个角度来看,我认为目前这是一个限制,对于这个特定的用例(时间戳非常接近)因为 Entry 只接受浮点值,我的时间戳都被传递为 1.50516885e^ 12,即使精确的时间戳值略有不同。当 AxisRenderer 计算出 x 轴的范围时,会将其视为 0,并将条目也设置为 0,在此块中 here