У меня есть несколько вопросов о MPAndroidCharts - PullRequest
0 голосов
/ 16 июня 2020
  1. Данные на моих графиках используют миллисекунды и выглядят примерно так:

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

    , но с множеством тысяч точек данных. По какой-то причине точки накладываются друг на друга, как на картинке, которую я прикрепил. Как я могу это исправить? То же самое происходит с HelloCharts. Точки накладываются друг на друга.

  2. Я предпочитаю MPAndroidChart, но HelloCharts получил этот потрясающий вид, previewChart. Вот пример: https://github.com/lecho/hellocharts-android. Поддерживает ли MPAndroidCharts previewCharts или что-то подобное?

  3. В настоящее время я использую средство форматирования значений, чтобы изменить текущие миллисекунды. Могу ли я каким-то образом получить разницу между наименьшим и наибольшим видимым в настоящее время значением и таким образом динамически изменять форматирование значений для более точного форматирования c времени? Заранее благодарим за любые ответы!

Ответы [ 2 ]

0 голосов
/ 25 июня 2020

Я понял несколько вещей. На случай, если кто-то столкнется с этим в будущем и задастся вопросом о том же.

  1. Класс Entry MPAndroidCharts использует Float. Максимальное значение для Float - 2 ^ 23, и все, что выше, округляется, точки получают одинаковое значение x. Я исправляю это, вычитая 1,5 миллиарда из каждого значения и деля на 100. Затем в ValueFormatter я отменяю это.

  2. Я пока не знаю.

  3. Мое решение заключалось в том, чтобы вычислить разницу между каждым значением, форматируемым в ValueFormatter. Если разница меньше нуля, форматтер зациклился, и это значение является отображаемым интервалом. Другое решение предлагало использовать chart.visibleXRange, что намного проще.

0 голосов
/ 22 июня 2020

Только ответ 3.:

chart.visibleXRange дает вам разницу между самым низким и самым высоким видимым значением x. Точно так же chart.visibleYRange дает значения для оси Y.

Имейте в виду, что (если вы определили dragOffsetX) при прокрутке до конца к левой или правой границе диаграммы, тогда самая низкая или соответственно, самое высокое значение - это самое низкое / самое высокое значение, фактически встречающееся в ваших данных, но не значение x, соответствующее левой / правой границе диаграммы. Чтобы получить это значение, вы можете использовать chart.getValuesByTouchPoint(...) и chart.contentRect.

Я использую следующую функцию, чтобы определить точный интервал между метками, который помогает мне решить, с какой степенью детализации я хочу отформатировать метки (в моем case секунды против миллисекунд). Основная часть, которая преобразует 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)
    }
}
...