IndexAxisValueFormatter未按预期工作

时间:2018-02-16 10:30:54

标签: android mpandroidchart

我使用MPAndroidChart创建条形图。我的配置:

<string-array name="months_initials">
       <item>J</item>
       <item>F</item>
       <item>M</item>
       <item>A</item>
       <item>M</item>
       <item>J</item>
       <item>J</item>
       <item>A</item>
       <item>S</item>
       <item>O</item>
       <item>N</item>
       <item>D</item>
   </string-array>

...

String[] months = getResources().getStringArray(R.array.months_initials);
chart.getXAxis().setCenterAxisLabels(true);
chart.getXAxis().setLabelCount(months.length, true);
chart.getXAxis().setValueFormatter(new IndexAxisValueFormatter(months) {
    @Override
    public String getFormattedValue(float value, AxisBase axis) {
        Timber.i("index = %s", value);
        return super.getFormattedValue(value, axis);
    }
});
  

指数= 0.5
  index = 1.5909091
  index = 2.6818182
  index = 3.7727275
  指数= 4.8636365
  index = 5.9545455
  index = 7.0454545
  index = 8.136364
  index = 9.227273
  index = 10.318182
  index = 11.409091

这就是结果:
enter image description here

现在,如果我将其更改为:return super.getFormattedValue(value-0.5f, axis);

结果是:
enter image description here

同样,如果我添加了另一项更改:chart.getXAxis().setLabelCount(Integer.MAX_VALUE, true);

  

指数= 0.5
  index = 1.0
  index = 1.5
  index = 2.0
  index = 2.5
  index = 3.0
  index = 3.5
  index = 4.0
  index = 4.5
  index = 5.0
  index = 5.5
  index = 6.0
  index = 6.5
  index = 7.0
  index = 7.5
  index = 8.0
  index = 8.5
  index = 9.0
  index = 9.5
  index = 10.0
  index = 10.5
  index = 11.0
  index = 11.5
  index = 12.0
  index = 12.5

结果是:
enter image description here

有点&#34;锤击时间&#34;但它对我有用,遗憾的是标签没有正确居中。 那么,这里发生了什么,我错过了什么?我怎样才能达到最终结果?

感谢您的时间。

ps:也开了issue

编辑完整设置代码:

    String[] months = getResources().getStringArray(R.array.months_initials);
    BarChart chart = binding.barChart;

    chart.setTouchEnabled(false);
    chart.getDescription().setEnabled(false);
    chart.getLegend().setEnabled(false);
    chart.getAxisLeft().setEnabled(false);
    chart.getAxisRight().setEnabled(false);
    chart.getXAxis().setPosition(XAxis.XAxisPosition.BOTTOM);
    chart.getXAxis().setDrawAxisLine(false);
    chart.getXAxis().setDrawGridLines(false);
    chart.getXAxis().setCenterAxisLabels(true);
    chart.getXAxis().setLabelCount(Integer.MAX_VALUE, true);
    chart.getXAxis().setValueFormatter(new IndexAxisValueFormatter(months) {
        @Override
        public String getFormattedValue(float value, AxisBase axis) {
            Timber.i("index = %s", value);
            return super.getFormattedValue(value - 0.5f, axis);
        }
    });
    chart.getXAxis().setTextColor(ContextCompat.getColor(this, R.color.grey));
    chart.getXAxis().setTextSize(12);

    BarDataSet barData = new BarDataSet(data, "data");
    barData.setColor(ContextCompat.getColor(this, R.color.chart_bar));
    barData.setDrawValues(false);

    ArrayList<IBarDataSet> dataSets = new ArrayList<>();
    dataSets.add(barData);
    binding.barChart.setData(new BarData(dataSets));
    binding.barChart.animateY(1000, Easing.EasingOption.Linear);

2 个答案:

答案 0 :(得分:1)

我无法在您的代码中准确指出问题,但这可能与图表的粒度有关。 但这是一个粗略的工作示例。希望这有帮助!

        String[] months = {"Jan", "Feb", "Mar", "Apr", "May", "Jun"};

        BarChart mChart = (BarChart) findViewById(R.id.barChart);
        mChart.setDrawBarShadow(false);
        mChart.setDrawValueAboveBar(false);
        mChart.getDescription().setEnabled(false);
        mChart.setDrawGridBackground(false);

        XAxis xaxis = mChart.getXAxis();
        xaxis.setDrawGridLines(false);
        xaxis.setPosition(XAxis.XAxisPosition.BOTTOM);
        xaxis.setGranularity(1f);
        xaxis.setDrawLabels(true);
        xaxis.setDrawAxisLine(false);
        xaxis.setValueFormatter(new IndexAxisValueFormatter(months));

        YAxis yAxisLeft = mChart.getAxisLeft();
        yAxisLeft.setPosition(YAxis.YAxisLabelPosition.INSIDE_CHART);
        yAxisLeft.setDrawGridLines(false);
        yAxisLeft.setDrawAxisLine(false);
        yAxisLeft.setEnabled(false);

        mChart.getAxisRight().setEnabled(false);

        Legend legend = mChart.getLegend();
        legend.setEnabled(false);

        ArrayList<BarEntry> valueSet1 = new ArrayList<BarEntry>();

        for (int i = 0; i < 6; ++i) {
            BarEntry entry = new BarEntry(i, (i+1)*10);
            valueSet1.add(entry);
        }

        List<IBarDataSet> dataSets = new ArrayList<>();
        BarDataSet barDataSet = new BarDataSet(valueSet1, " ");
        barDataSet.setColor(Color.CYAN);
        barDataSet.setDrawValues(false);
        dataSets.add(barDataSet);

        BarData data = new BarData(dataSets);
        mChart.setData(data);
        mChart.invalidate();

<强> RESULT

enter image description here

答案 1 :(得分:0)

我有同样的问题并通过这样解决:

barChart.getXAxis().setLabelCount(barDataSet.getEntryCount());

此外,如果您只使用一个数据集,则代替此:

ArrayList<IBarDataSet> dataSets = new ArrayList<>();
dataSets.add(barData);

使用:

BarDataSet barDataSet = new BarDataSet(yourValauesHere, "Legend Text here");

供参考,请参阅以下示例:

    barEntries = new ArrayList<BarEntry>();

    barEntries.add(new BarEntry(0, 1));
    barEntries.add(new BarEntry(1, 2));
    barEntries.add(new BarEntry(2, 4));
    barEntries.add(new BarEntry(3, 6));
    barEntries.add(new BarEntry(4, 5));
    barEntries.add(new BarEntry(5, 7));

    barDataSet = new BarDataSet(barEntries, "Contracts");
    barDataSet.setAxisDependency(YAxis.AxisDependency.LEFT);
    barDataSet.setColor(getColor("defaultYellow"));
    barDataSet.setHighlightEnabled(true);
    barDataSet.setHighLightColor(Color.RED);
    barDataSet.setValueTextSize(defaultValueTextSize);
    barDataSet.setValueTextColor(getColor("primaryDark"));

    BarData barData = new BarData(barDataSet);

    barChart.getDescription().setText("No. of Contracts signed in 6 
    months");
    barChart.getDescription().setTextSize(12);
    barChart.getAxisLeft().setAxisMinimum(0);
    barChart.getXAxis().setPosition(XAxis.XAxisPosition.BOTH_SIDED);
    barChart.getXAxis().setValueFormatter(new 
    IndexAxisValueFormatter(getXAxisValues()));
    barChart.animateY(1000);
    barChart.setData(barData);

获取xAxis值方法:

private ArrayList<String> getXAxisValues()
{
    ArrayList<String> labels = new ArrayList<String> ();

    labels.add( "JAN");
    labels.add( "FEB");
    labels.add( "MAR");
    labels.add( "APR");
    labels.add( "MAY");
    labels.add( "JUN");
    return labels;
}