Подтвердить что ты не робот

Mpandroidchart - Как избежать повторяющихся значений в оси Y?

Я хочу избежать повторных значений и значений -0 в Y-оси, избегая ситуации с изображением.

У меня есть эти идеи, чтобы решить это, но любое решение:

  • Ограничьте масштабирование перед повторным значением в YAxis, поэтому остановите бесконечное масштабирование на диаграмме
  • Получить значения YAxis и удалить повторяющиеся значения.

YAxis с повторяющимися значениями

4b9b3361

Ответ 1

tl; dr Вы можете сделать это, изменив количество меток в onChartScale.

Сначала вы хотите, чтобы ваш слушатель настроил:

chart.setOnChartGestureListener(this); // set a listener ;)

Вы пытаетесь получить верхние/нижние значения и проверить, что нарисовано на экране. Примените некоторые базовые вычисления, и вы настроены.

Следующий код будет нарисовать 2 ярлыка, если уровень масштабирования будет слишком высоким и до 9 в противном случае:

@Override
public void onChartScale(MotionEvent me, float scaleX, float scaleY) {
    final YAxis yAxis = mChart.getAxisLeft();
    final Transformer transformer = mChart.getTransformer(YAxis.AxisDependency.LEFT);

    // ...minor dirty hack
    final PointD top = transformer.getValuesByTouchPoint(0, 0);
    final PointD bottom = transformer.getValuesByTouchPoint(0, mChart.getHeight());
    final int diff = (int)(top.y - bottom.y);

    // draw 2-9 axis labels
    final int count = Math.min(9, Math.max(diff, 2));

    Log.d("scale", String.format("scale %f: diff %d and count %d", scaleY, diff, count));

    // "force" the count, for there are drawing issues where none get drawn on high zoom levels (just try it out)
    yAxis.setLabelCount(count, true);
}

// todo implement other interface methods

Форматирование значений и все остальное остаются прежними.

И некоторый уродливый скриншот, чтобы показать, что он работает: D

Увеличен график с двумя метками

Ответ 2

код выглядит следующим образом:

    mchart.setAutoScaleMinMaxEnabled(false);
    mchart.getAxisLeft().setAxisMaxValue(10);
    mchart.getAxisLeft().setAxisMinValue(5);
    mchart.getAxisRight().setAxisMaxValue(10);
    mchart.getAxisRight().setAxisMinValue(5);

или

boolean a = isReady;
 mchart.getAxisLeft().setFormater(new format(float b){ return "" ;})

Когда вы получите данные:

    mchart.setAutoScaleMinMaxEnabled(true);
    mchart.getAxisLeft().resetAxisMaxValue();
    mchart.getAxisLeft().resetAxisMinValue();
    mchart.getAxisRight().resetAxisMaxValue();
    mchart.getAxisRight().resetAxisMinValue(5);

У меня нет моего кода.

Ответ 3

Хотя это старый вопрос, который я хотел бы добавить к нему для дальнейшего использования. Более новые версии библиотеки имеют малоизвестную функцию, которая разрешает дублированные метки, называемые детализацией. Это проще, чем старые решения (хотя, честно говоря, это было недоступно в то время, когда они были опубликованы).

Вы можете всегда проверить последние AxisBase Javadocs (3.0.0-beta1) для более подробного объяснения. Вот соответствующие методы:

  • setGranularity(float granularity): Установите минимальный интервал для оси при масштабировании. Ось не разрешено идти ниже этого предела. Это можно использовать, чтобы избежать ярлыка дублирование при масштабировании.
  • setGranularityEnabled(boolean enabled): Включить/отключить контроль детализации по интервалам значений осей. Если разрешен интервал оси не может быть ниже определенного зернистость.

Итак, в вашем случае вам нужно установить степень детализации на 0.1f, так как у вас есть одна десятичная точка. Следующий фрагмент кода должен избегать повторяющихся значений на оси:

YAxis yAxis = mChart.getAxisLeft();
yAxis.setGranularityEnabled(true);
yAxis.setGranularity(0.1f);

Ответ 4

Я раньше не использовал MPAndroidCharts, но только небольшой поиск здесь и там дал мне этот метод, который, я думаю, был бы полезен.

public void setLabelCount(int count, boolean force) {

        if (count > 25)
            count = 25;
        if (count < 2)
            count = 2;

        mLabelCount = count;
        mForceLabels = force;
    }

В описании говорится, что "точное заданное количество меток будет нарисовано и равномерно распределено вместе с осью". Если вы можете заставить его работать в вашу пользу, вы можете ограничить масштабирование.

Кроме того, существует еще один способ -

public int getLabelCount() {
        return mLabelCount;
    }

Это возвращает количество меток на оси. Надеюсь, это поможет.

https://github.com/PhilJay/MPAndroidChart/blob/5a15715b25991e3d61d27d552f9eba45975d65e7/MPChartLib/src/com/github/mikephil/charting/components/YAxis.java