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

Символы оси 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 hereenter image description here

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

4b9b3361

Ответ 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

Вот простое решение, которое принесет пользу тому, кто ищет ответ.

  1. Количество меток оси Y

    barChart.getAxisLeft().setLabelCount(7, true); //if you want 6 labels then value should be 7

  2. Рассчитать 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); '''