Символы оси 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)+"";
}
});
![enter image description here]()
![enter image description here]()
Как видно из этих изображений, мои целые значения не там, где они должны быть (и есть два "2s" ). В этом примере я бы хотел, чтобы он отображал значения 0,1,2,3,4. Если у меня будет намного больше данных, я надеюсь, что это будет достаточно разумно, чтобы показать только, какие значения у меня есть, поэтому, например, если данные содержат значения 0-50, это будет показывать что-то вроде 0,10,20,30, 40,50 или, возможно, 0,15,30,45 и т.д.
Ответы
Ответ 1
Хорошо, теперь я вижу твою проблему.
Проблема в том, что YAxis
(YLabels) определяет количество цифр и, следовательно, шаги между каждой меткой автоматически.
К сожалению, он в настоящее время не представляется возможным для настройки того, как ось вычисляет себя или устанавливает пользовательские метки.
Я рассматриваю возможность добавления такой функции в будущем, когда пользователь может самостоятельно определить, какие значения рисуются как метки оси.
Просто подсказка:
Массив mEntries
, который содержит все метки оси, является общедоступным. Поэтому в целом вы можете изменить его после его создания.
Тем не менее, я абсолютно не уверен, как будет вести себя ось, если вы ее вручную измените.
Но, может быть, стоит попробовать:-)
https://github.com/PhilJay/MPAndroidChart/blob/master/MPChartLib/src/com/github/mikephil/charting/components/YAxis.java
Ответ 2
Довольно просто. Все, что вам нужно, это две вещи:
-
Форматирование значения оси
mChart.getAxisLeft().setValueFormatter(new ValueFormatter() {
@Override
public String getFormattedValue(float value) {
return String.valueOf((int) Math.floor(value));
}
});
-
Число метки метки
int max = findMaxYValue(yourdata); // figure out the max value in your dataset
mChart.getAxisLeft().setLabelCount(max);
Ответ 3
Вот как я решил эту проблему. Кажется, что ось y всегда нарисована 1 над максимальным значением (если оно не заставляет его). Поэтому установите количество меток 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);
Ответ 4
Осмотревся без решения, я решил изучить javadoc и узнал об этом методе: setGranularity(float)
. Чтобы заставить YAxis всегда отображать целые числа (или любой желаемый интервал), вам просто нужно вызвать это:
yAxisLeft.setGranularity(1.0f);
yAxisLeft.setGranularityEnabled(true); // Required to enable granularity
Однако, если минимальные и максимальные значения диаграммы слишком близки, тогда график не будет отмечать 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);
}
}
И что это!
Ответ 5
Я знаю, что я отвечаю очень поздно, но я пытаюсь добавить немного света к этой проблеме, чтобы будущие пользователи имели немного больше информации об этом.
Я также столкнулся с той же проблемой. Я использовал 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, поэтому будет два или может быть больше 0 значений в Y-оси.
Я думаю, что это то, что происходит в случае @Fozefy
.
Я реализовал ниже заданный код, чтобы решить эту проблему, и ее работа как шарм. Я использовал функцию setAxisMaxValue
для установки пользовательского максимального значения для оси Y и 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
.
Ответ 6
Я тоже столкнулся с той же проблемой.. Просто используйте код ниже, чтобы избавиться от него.
chart.getAxisLeft().setValueFormatter(new ValueFormatter() {
@Override
public String getFormattedValue(float value) {
return String.valueOf((int) Math.floor(value));
}
});
Счастливое кодирование.
Ответ 7
Мое решение:
mChart.getAxisLeft().setValueFormatter(new ValueFormatter() {
@Override
public String getFormattedValue(float value) {
return String.valueOf((int) Math.floor(value));
}
});
int max = (int) mChart.getData().getYMax();
mChart.getAxisLeft().setLabelCount(max);
Ответ 8
Вот простое решение, которое принесет пользу тому, кто ищет ответ.
Количество меток оси Y
barChart.getAxisLeft().setLabelCount(7, true); //if you want 6 labels then value should be 7
Рассчитать maxValue
- Получить
maxValue
из значений должны быть включены в диаграмму
int maxValueMod = (maxValue + 2) % 6; //calc mod, here 2 is to display Legend and 6 is no of labels
maxValue = maxValue + (6-maxValueMod); // calculate final maxValue to set in barchart
barChart.getAxisLeft().setAxisMaximum(maxValue+2); '''