当我按X轴缩放我的图表时,图表会消失。为什么会发生这种情况? Lib版本 - MPAndroidChart:v3.0.0-beta1
我使用了示例LineChartTime。并在setData()函数中编辑long hourMillis = 36000L;
,并在图表视图中出现问题。
已更新!
当时间采样小于360000毫秒或6分钟时,问题就出现了。比如示例中的1小时" LineChartTime"一切都好。但是,如果我将x值从1451606400000L减少到0并使时间采样等于1毫秒,一切都可以。所以我认为浮点型x值的主要问题是处理不正确的大LONG值。
所以,我找到了临时解决方案。 当我得到当前时间时,我将它减少到1451606400000L(2016 01.01 00:00)并绘制不那么大的值,但也改变Formatter字符串
xAxis.setValueFormatter(new AxisValueFormatter() {
private FormattedStringCache.Generic<Long, Date> mFormattedStringCache = new FormattedStringCache.Generic<>(new SimpleDateFormat("yyyy dd MMM HH:mm"));
@Override
public String getFormattedValue(float value, AxisBase axis) {
Long v = (long) value + 1451606400000L;
return mFormattedStringCache.getFormattedValue(new Date(v), v);
}
如果有人有其他解决方案,请告诉我。
答案 0 :(得分:0)
放大时,库不会渲染可见区域之外的值。这里的算法使用float
类型(可能有很多好的理由),但这会导致“大”数字出现问题。
float
内部是32位IEEE 754,这意味着它只能代表大约7位有效数字。以毫秒为单位的时间戳将截断它们的最后一个数字(至少为了确定要绘制哪些行),所以你的一些行将会消失。
选项1:
使用float
精度范围内的时间戳,或至少更接近它。
如果要绘制当前数据,请从时间戳中减去System.currentTimeMillis()的存储值,并在格式化时添加相同的值,就像在自己的解决方案中一样。如果您能够以1秒的精度生活,请将时间戳除以60000并相应地调整格式化程序。
选项2:修补库以在可见区域之外绘制线条。
如果您没有大型数据集,那么快速修复工作就是渲染所有内容。对于折线图,请在第1280行附近的BarLineChartBase.java
中更改以下两种方法的内容,如下所示:
public float getLowestVisibleX() {
return mXAxis.mAxisMinimum;
}
public float getHighestVisibleX() {
return mXAxis.mAxisMaximum;
}
这可能非常低效,根据您的数据集大小,这可能是也可能不是问题。