MPandroid x轴标签与条形图不对齐

7

我的X轴数值没有对齐。我应该修改哪个设置?

X轴未对齐

以下是我目前在代码中拥有的内容,但.setLabelsToSkip不起作用,因为我正在使用3.0.1版本。

XAxis xAxis = mChart.getXAxis();
    xAxis.setTypeface(mTfLight);
    xAxis.setGranularity(1f);
    xAxis.setCenterAxisLabels(true);
    xAxis.setDrawLabels(true);
    xAxis.setGranularity(1f);
    xAxis.setGranularityEnabled(true);
    xAxis.setPosition(XAxis.XAxisPosition.BOTTOM);
    xAxis.setTextColor(Color.WHITE);
    xAxis.setTextSize(15);

这是我的LabelFormatter类:
import com.github.mikephil.charting.components.AxisBase;
import com.github.mikephil.charting.formatter.IAxisValueFormatter;

public class LabelFormatter implements IAxisValueFormatter {
private final String[] mLabels;

public LabelFormatter(String[] labels) {
    mLabels = labels;
}

@Override
public String getFormattedValue(float value, AxisBase axis) {
    return mLabels[(int) value];
}
}

这是我的主活动设置数据方法:

    private void setData() {
    ArrayList<BarEntry> entries = new ArrayList<>();
    String labels[]=new String[5];
    for (Cars c : values) {

       if (c.getX()==1){
            labels[0] = "Engine 1";
        }
        if (c.getX()==2){
            labels[1] = "Engine 2";
        }
        if (c.getX()==3){
            labels[2] = "Engine 3";
        }
        if (c.getX()==4){
            labels[3] = "Engine 4";
        }
        if (c.getX()==5){
            labels[4] = "Engine 5";
        }

        entries.add(new BarEntry((float) c.getX(), ((float) c.getY()),labels));

    }
    BarDataSet set1;

    if (mChart.getData() != null && mChart.getData().getDataSetCount() > 0) {
        set1 = (BarDataSet) mChart.getData().getDataSetByIndex(0);
        set1.setValues(entries);

        mChart.getXAxis().setValueFormatter(new IndexAxisValueFormatter(labels));
       //set1.setValueFormatter(new LabelFormatter(labels));
       //mChart.getXAxis().setValueFormatter(new BarValueFormatter(set1));
        mChart.getData().notifyDataChanged();
        mChart.notifyDataSetChanged();

    } else {
        set1 = new BarDataSet(entries, "Engine Types");

        ArrayList<Integer> colors = new ArrayList<Integer>();

        for (int c : ColorTemplate.VORDIPLOM_COLORS)
            colors.add(c);

        for (int c : ColorTemplate.JOYFUL_COLORS)
            colors.add(c);

        for (int c : ColorTemplate.COLORFUL_COLORS)
            colors.add(c);

        for (int c : ColorTemplate.LIBERTY_COLORS)
            colors.add(c);

        for (int c : ColorTemplate.PASTEL_COLORS)
            colors.add(c);

        colors.add(ColorTemplate.getHoloBlue());

        set1.setColors(colors);


        ArrayList<IBarDataSet> dataSets = new ArrayList<IBarDataSet>();
        dataSets.add(set1);
        mChart.getXAxis().setValueFormatter(new IndexAxisValueFormatter(labels));
        //mChart.getXAxis().setValueFormatter(new LabelFormatter(labels));
        //mChart.getXAxis().setValueFormatter(new BarValueFormatter(set1));
        BarData data = new BarData(dataSets);
        data.setValueTextSize(50f);
        data.setValueTextColor(Color.WHITE);
        data.setValueTypeface(mTfLight);



        mChart.setData(data);


    }

}

在我的主活动中,我这样使用它:

 mChart.getXAxis().setValueFormatter(new IndexAxisValueFormatter(labels));

你的AxisValueFormatter在哪里?请[编辑]以包括您正在使用的内容。也许是IndexValueFormatter - David Rawson
@David Rawson,我已经包含了我在LabelFormatter中使用的类文件以及我在主活动中如何调用它。 - raptor496
那么你使用的是哪一个?IndexValueFormatter还是LabelFormatter?你的代码展示了两者,所以不太清楚。此外,不要使用(int) value,因为它总是向下取整。请使用int index = Math.round(value); - David Rawson
使用内置于3.0.1中的IndexAxisValueFormatter。 - raptor496
我更新了我的主活动(setdata)方法。 - raptor496
显示剩余2条评论
2个回答

3
如果你想将x轴标签对齐到每个条形图的中心,将setCenterAxisLabels属性设置为false。
xAxis.setCenterAxisLabels(false);

4
我尝试过了。发生的情况是它们确实对齐了,但第一个标签完全从屏幕上消失了,所有标签位置都向左移动。所以最后一根柱子没有标签。 - raptor496
请发布您的(x,y)数据。 - remya thekkuvettil
@raptor496,你找到了你提到的问题的解决方案吗?我也遇到了同样的问题。 - Megala Mani
尝试将相同的属性设置为true可能会起作用。xAxis.setCenterAxisLabels(true); - meekash55

0
编写一个自定义的IndexValueFormatter类,如下所示,它应该可以正常工作。
 public class FixedIndexAxisValueFormatter extends ValueFormatter {
    private final float offset;
    private final String[]labels;

    public FixedIndexAxisValueFormatter(float offset, String[]labels) {
        this.offset = offset;
        this.labels = labels;
    }


    public String getFormattedValue(float value) {
        float x = value - offset;
        int index = Math.round(x);
        if (index < 0 || index >= labels.length || Math.abs(index - x) > 0.01f) {
            return "";
        } else {
            return labels[index];
        }
    }
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接