Знаки оси Force BarChart Y являются целыми числами?

Я создал BarChart, используя MPAndroidChart, и я динамически вводил данные. Это означает, что мне нужно, чтобы моя ось Y также определялась динамически. Все мои данные представлены как целые числа, однако ось Y иногда отображает легенду как десятичные значения с 1 десятичной точкой.

Я попытался использовать ValueFormatter для округления значений, но проблема в том, что иногда значения Y не являются целыми значениями (например, 0,8,1,6,2,4 и т. Д.). Поэтому, если я просто отредактирую их как целые, они не будут в нужном месте.

Есть ли в любом случае, что я могу заставить BarChart показывать только значения в ячейках Integer? Его нормально, если он пропускает некоторые, на самом деле я хочу, чтобы эти значения стали большими.

Изменить: Когда я сказал, что целые числа не находятся в правильных местах, я имел в виду, что как только я изменяю то, что отображается на каждой этикетке, они не являются «правильными». В моем примере у меня есть 5 баров, отображающих значения 3,4,2,3,2. Первое изображение – это «по умолчанию», второе – изображение, когда я редактировал форматирование значений, используя:

myBarChart.getYLabels().setFormatter(new ValueFormatter() { @Override public String getFormattedValue(float v) { return ((int) v)+""; } }); 

Введите описание изображения здесьВведите описание изображения здесь

Как видно из этих изображений, мои целые значения не там, где они должны быть (и есть два «2s»). В этом примере я бы хотел, чтобы он отображал значения 0,1,2,3,4. Если у меня будет намного больше данных, я надеюсь, что это будет достаточно умным, чтобы показать только, какие значения у меня есть, поэтому, например, если данные содержат значения 0-50, это будет показывать что-то вроде 0,10,20,30 , 40,50 или, возможно, 0,15,30,45 и т. Д.

Solutions Collecting From Web of "Знаки оси Force BarChart Y являются целыми числами?"

Хорошо, теперь я вижу твою проблему. Проблема в том, что YAxis (YLabels) определяет количество цифр и, следовательно, шаги между каждой меткой автоматически .

К сожалению, в настоящее время невозможно настроить, как вычисляет ось или устанавливает пользовательские метки.

Я рассматриваю возможность добавления такой функции в будущем, когда пользователь может самостоятельно определить, какие значения нарисованы как метки оси.

Просто подсказка:

Массив mEntries который содержит все метки оси, является общедоступным. Поэтому в целом вы можете изменить его после его создания. Тем не менее, я абсолютно не уверен, как будет вести себя ось, если вы ее вручную измените.

Но, может быть, стоит попробовать 🙂 https://github.com/PhilJay/MPAndroidChart/blob/master/MPChartLib/src/com/github/mikephil/charting/components/YAxis.java

Вот как я решил эту проблему. Кажется, что ось y всегда нарисована 1 над максимальным значением (если ее не заставить). Поэтому установите метку count 2 над максимальным значением (включая ноль и один над вашим максимальным), тогда все, что вам нужно сделать, это удалить десятичную с помощью форматирования оси. Это работает, если все ваши значения y являются целыми числами, не уверен, как он будет работать с десятичными значениями.

  barChart.getAxisLeft().setLabelCount(maxYvalue + 2, true); barChart.getAxisLeft().setAxisMinValue(0f); barChart.getAxisLeft().setAxisMaxValue(maxYvalue + 1); YAxisValueFormatter customYaxisFormatter = new YAxisValueFormatter() { @Override public String getFormattedValue(float value, YAxis yAxis) { return String.valueOf((int)value); } }; barChart.getAxisLeft().setValueFormatter(customYaxisFormatter); 

Довольно просто. Все, что вам нужно, это две вещи:

  1. Форматирование значения оси

     mChart.getAxisLeft().setValueFormatter(new ValueFormatter() { @Override public String getFormattedValue(float value) { return String.valueOf((int) Math.floor(value)); } }); 
  2. Количество ярлыков оси

     int max = findMaxYValue(yourdata); // figure out the max value in your dataset mChart.getAxisLeft().setLabelCount(max); 

setGranularity(float) без решения, я решил изучить javadoc и узнал об этом методе: setGranularity(float) . Чтобы заставить YAxis всегда отображать целые числа (или любой желаемый интервал), вам просто нужно вызвать это:

 yAxisLeft.setGranularity(1.0f); yAxisLeft.setGranularityEnabled(true); // Required to enable granularity 

Однако, если минимальные и максимальные значения диаграммы слишком близки, то график не будет setLabelCount() , если только это не принудительно (что сделает метки в десятичном setLabelCount() снова), поэтому вам нужно вызвать это после установки данных:

 private void calculateMinMax(BarLineChartBase chart, int labelCount) { float maxValue = chart.getData().getYMax(); float minValue = chart.getData().getYMin(); if ((maxValue - minValue) < labelCount) { float diff = labelCount - (maxValue - minValue); maxValue = maxValue + diff; chart.getAxisLeft().setAxisMaximum(maxValue); chart.getAxisLeft().setAxisMinimum(minValue); } } 

Вот и все!

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

Я также столкнулся с той же проблемой. Я использовал MyYAxisValueFormatter для отображения только целочисленного значения в Y-Axis . Ниже приведен код для него.

 public class MyYAxisValueFormatter implements YAxisValueFormatter { private DecimalFormat mFormat; public MyYAxisValueFormatter () { mFormat = new DecimalFormat("###,###,##0"); } @Override public String getFormattedValue(float value, YAxis yAxis) { // write your logic here // access the YAxis object to get more information return mFormat.format(value); } } 

Используя этот класс, то, что происходит, определенно отображает значения Y-Axis в целочисленном формате, но также дублирует некоторое значение. Это связано с преобразованием значения float в integer.

Скажем, например, 0,4 будет преобразован в 0, поэтому в Y-оси будет два или может быть больше 0.

Я думаю, что это то, что происходит в случае @Fozefy .

Я реализовал ниже данный код, чтобы решить эту проблему, и ее работа, как прелесть. Я использовал функцию setAxisMaxValue для установки пользовательского максимального значения для оси Y и setLabelCount для setLabelCount количества записей ярлыков для оси Y.

  YAxis yAxis = chart.getAxis(YAxis.AxisDependency.LEFT); // Minimum section is 1.0f, could be 0.25f for float values float labelInterval = 1.0f / 2f; int sections; //No of sections in Y-Axis, Means your Highest Y-value. do { labelInterval *= 2; //Interval between labels in Y-Axis sections = ((int) Math.ceil(chart.getYMax() / labelInterval)); } while (sections > 10); // If the ymax lies on one of the top interval, add another one for some spacing if (chart.getYMax() == sections * labelInterval) { sections++; } yAxis.setAxisMaximum(labelInterval * sections); yAxis.setLabelCount(sections + 1, true); 

Интервал метки остается одним, если ваше максимальное значение y меньше 10, в противном случае два. Вы можете настроить это поведение согласно вашему требованию, а также увеличить интервал между метками, изменив цикл do-while.

Также убедитесь, что вы используете setLabelCount(int count, boolean force) и передаете значение force true .

Я тоже столкнулся с той же проблемой. Просто используйте ниже код, чтобы избавиться от него !!!

 chart.getAxisLeft().setValueFormatter(new ValueFormatter() { @Override public String getFormattedValue(float value) { return String.valueOf((int) Math.floor(value)); } }); 

Счастливое кодирование.