Установка строковых значений в качестве меток xaxis гистограммы MPAndroidChart

#java #android #mpandroidchart

#java #Android #mpandroidchart

Вопрос:

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

     private static class MyFormatter extends ValueFormatter {
      public String getAxisLabel(float value, AxisBase axis) {
        if (value == 1) {
            return "JAN"; //make it a string and return
        } else  if (value == 2) {
            return "FEB"; //make it a string and return
        } else if (value == 3) {
            return "MAR"; //make it a string and return
        } else  if (value == 4) {
            return "APR"; //make it a string and return
        } else  if (value == 5) {
            return "MAY"; //make it a string and return
        } else  if (value == 6) {
            return "JUN"; //make it a string and return
        } else  if (value == 7) {
            return "JUL"; //make it a string and return
        } else  if (value == 8) {
            return "AUG"; //make it a string and return
        } else  if (value == 9) {
            return "SEP"; //make it a string and return
        } else  if (value == 10) {
            return "OCT"; //make it a string and return
        } else  if (value == 11) {
            return "NOV"; //make it a string and return
        } else  if (value == 12) {
            return "DEC"; //make it a string and return
        } else {
            return ""; // return empty for other values where you don't want to print anything on the X Axis
        }
    }
}
  

вот как я добавляю значения в набор данных и в конечном итоге форматирую метки

     if (response.body() != null) {
                List<BarEntry> barEntries = new ArrayList<>();
                for (MonthlySales monthlySales : response.body()) {
                    barEntries.add(new BarEntry(monthlySales.getMonth(), monthlySales.getTotal()));
                }
                BarDataSet dataSet = new BarDataSet(barEntries, "Monthly Sales");
                dataSet.setColors(ColorTemplate.COLORFUL_COLORS);
                BarData data = new BarData(dataSet);
                //data.setBarWidth(10f);
                chart.setVisibility(View.VISIBLE);
                chart.animateXY(2000, 2000);
                chart.setData(data);
                chart.setFitBars(true);
                Description description = new Description();
                description.setText("Sales per month");
                chart.setDescription(description);
                chart.invalidate();
                XAxis xAxis = chart.getXAxis();
                //xAxis.setLabelCount(12, true);
                xAxis.setPosition(XAxis.XAxisPosition.BOTTOM);
                //xAxis.setTypeface();
                xAxis.setDrawGridLines(false);
                //xAxis.setValueFormatter(new MyFormatter());
            }
  

обратите внимание, что возвращаемые месяцы из базы данных представляют собой целое число 1-12, но оно показывает значения с плавающей запятой за четыре месяца с мая по август.

Что я могу делать неправильно и как я могу достичь своей цели с помощью этой библиотеки?

Ответ №1:

Что вам нужно сделать, это преобразовать ваши значения с плавающей запятой в целое число, используя Math.round() это гарантирует, что проверки будут точно оцениваться как true, поскольку на данный момент они оцениваются только как true при 7.0, поскольку это равно 7, в то время как остальные оцениваются как false, даже когда это должно быть trueтаким образом, ваш код форматирования должен быть

 private static class MyFormatter extends ValueFormatter {
    public String getAxisLabel(float value, AxisBase axis) {
        if (Math.round(value) == 1) {
            return "JAN"; //make it a string and return
        } else  if (Math.round(value) == 2) {
            return "FEB"; //make it a string and return
        } else if (Math.round(value) == 3) {
            return "MAR"; //make it a string and return
        } else  if (Math.round(value) == 4) {
            return "APR"; //make it a string and return
        } else  if (Math.round(value) == 5) {
            return "MAY"; //make it a string and return
        } else  if (Math.round(value) == 6) {
            return "JUN"; //make it a string and return
        } else  if (Math.round(value) == 7) {
            return "JUL"; //make it a string and return
        } else  if (Math.round(value) == 8) {
            return "AUG"; //make it a string and return
        } else  if (Math.round(value) == 9) {
            return "SEP"; //make it a string and return
        } else  if (Math.round(value) == 10) {
            return "OCT"; //make it a string and return
        } else  if (Math.round(value) == 11) {
            return "NOV"; //make it a string and return
        } else  if (Math.round(value) == 12) {
            return "DEC"; //make it a string and return
        } else {
            return ""; // return empty for other values where you don't want to print anything on the X Axis
        }
    }
}
  

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

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

     xAxis.setGranularity(1f);
    xAxis.setGranularityEnabled(true);