Mpandroidchart - Как избежать повторяющихся значений в оси Y?
Я хочу избежать повторных значений и значений -0 в Y-оси, избегая ситуации с изображением.
У меня есть эти идеи, чтобы решить это, но любое решение:
- Ограничьте масштабирование перед повторным значением в YAxis, поэтому остановите бесконечное масштабирование на диаграмме
- Получить значения YAxis и удалить повторяющиеся значения.
![YAxis с повторяющимися значениями]()
Ответы
Ответ 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