在 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
我正在使用 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