我对MPAndroidCharts有一些疑问

时间:2020-06-16 10:39:36

标签: android mpandroidchart

  1. 图形中的数据使用毫秒,看起来大致像这样:

    [1534928499109,52],[1534928522758,49],[1534928546408,51],[1534928570036,47],[1534928593671,54],

    ,但有数千个数据点。由于某些原因,这些点会像我所附的图片一样相互叠放。我怎样才能解决这个问题? HelloCharts也会发生这种情况。 Points stacking on top of each other.

  2. 我更喜欢MPAndroidChart,但是HelloCharts获得了这个很棒的视图PreviewChart。这是一个示例:https://github.com/lecho/hellocharts-android。 MPAndroidCharts是否支持PreviewCharts或类似的东西?

  3. 我当前正在使用valueformatter更改日期的毫秒数。我能以某种方式获得当前可见值的最小和最大之间的差异,并以此方式动态更改valueformatter以格式化更特定的时间吗? 预先感谢您提供任何答案!

2 个答案:

答案 0 :(得分:0)

仅回答3。:

chart.visibleXRange为您提供了最低可见x值和最高可见x值之间的差。同样,chart.visibleYRange给出Y轴的值。

请注意,如果一直滚动到图表的左边界或右边界(如果已定义了dragOffsetX),则最低或最高值分别是实际发生在您的图表中的最低/最高值数据,但不包含与图表左/右边框相对应的x值。要获得该值,可以使用chart.getValuesByTouchPoint(...)chart.contentRect

我使用以下函数来确定标签之间的确切间隔,这有助于我确定要格式化标签的粒度(在我的情况下是几秒钟还是几毫秒)。将rawInterval转换为interval的主要部分取自com.github.mikephil.charting.renderer.AxisRenderer.computeAxisValue并翻译成Kotlin:

fun calculateIntervalBetweenLabels(): Double {
    val range = chart.getValuesByTouchPoint(chart.contentRect.right, 0f, YAxis.AxisDependency.LEFT).x - chart.getValuesByTouchPoint(chart.contentRect.left, 0f, YAxis.AxisDependency.LEFT).x
    val rawInterval = range / chart.xAxis.labelCount
    var interval = Utils.roundToNextSignificant(rawInterval).toDouble()
    val intervalMagnitude = Utils.roundToNextSignificant(10.0.pow(log10(interval).toInt())).toDouble()
    val intervalSigDigit = (interval / intervalMagnitude).toInt()
    if (intervalSigDigit > 5) {
        interval = floor(10 * intervalMagnitude)
    }
    return interval
}

在没有dragOffsetX的较简单情况下,第一行可以用val range = chart.visibleXRange代替。

在ValueFormatter中,我这样做:

override fun getFormattedValue(value: Float): String {
    return when {
        calculateIntervalBetweenLabels().roundToLong() >= 1000 -> formatValueInSeconds(value)
        else -> formatValueInMilliseconds(value)
    }
}

答案 1 :(得分:0)

我已经弄明白了几件事。万一将来有人遇到这个问题并且想知道同样的事情。

  1. MPAndroidCharts类Entry使用Float。 Float的最大值为2 ^ 23,所有大于该值的值均被四舍五入,这些点将获得相同的x值。我通过从每个值中减去15亿并除以100来解决此问题。然后在ValueFormatter中撤消该操作。

  2. 我还不知道。

  3. 我的解决方案是计算在ValueFormatter中格式化的每个值之间的差。如果差异小于零,则格式器已循环播放,并且该值是显示的间隔。建议使用另一种解决方案chart.visibleXRange,它要简单得多。