如何在MP Android图表(条形图)中设置X轴标签?

16
这是关于文章的参考:https://github.com/PhilJay/MPAndroidChart/wiki/Setting-Data,标题为柱形图。在下面给出的代码中:
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {

    View view = inflater.inflate(R.layout.fragment_graph_test, container, false);

    BarChart chart = view.findViewById(R.id.bar_Chart_test);

    List<BarEntry> entries = new ArrayList<>();
    entries.add(new BarEntry(0f, 30f));
    entries.add(new BarEntry(1f, 80f));
    entries.add(new BarEntry(2f, 60f));
    entries.add(new BarEntry(3f, 50f));
    // gap of 2f
    entries.add(new BarEntry(5f, 70f));
    entries.add(new BarEntry(6f, 60f));

    BarDataSet set = new BarDataSet(entries, "BarDataSet");
    BarData data = new BarData(set);
    data.setBarWidth(0.9f); // set custom bar width
    chart.setData(data);
    chart.setFitBars(true); // make the x-axis fit exactly all bars
    chart.invalidate(); // refresh

    return view;
}

输出结果如下:

此处未显示X值。点击此处查看截图

如何将X轴的值设置为按月份显示(1月1日,2月1日,3月1日...),与文章中所示相同。

7个回答

20

你只需像这样制作一个简单的字符串列表:

final ArrayList<String> xAxisLabel = new ArrayList<>();
    xAxisLabel.add("Mon");
    xAxisLabel.add("Tue");
    xAxisLabel.add("Wed");
    xAxisLabel.add("Thu");
    xAxisLabel.add("Fri");
    xAxisLabel.add("Sat");
    xAxisLabel.add("Sun");

那么您需要执行以下步骤:

    XAxis xAxis = chart.getXAxis();
    xAxis.setValueFormatter(new ValueFormatter() {
        @Override
        public String getFormattedValue(float value, AxisBase axis) {
            return xAxisLabel.get((int) value);

        }
    });

希望这能帮到你。

仍然存在一些问题。在这行代码中:return xAxisLabel.get((int) value); 中的“value”是什么? - Shubham Tunwal
这里的意思是“值是索引”。 - Sarthak Gandhi
值是x轴上的数字标签,从左到右开始,可以是负数,在使用它作为索引时要小心。始终确保您的图表具有所有默认的x轴标签,这些标签不是负数。 - tapsey
我有一个与此相关的问题,您能否请看一下? - Moeez
嘿,这个 ValueFormatter 类在哪里? - Jaimin Modi
显示剩余3条评论

18

Kotlin:

val xAxisLabels = listOf("1", "2", "3", "4", "5", "6" ...)      
barChartView.xAxis.valueFormatter = IndexAxisValueFormatter(xAxisLabels)

Java:

ArrayList<String> xAxisLables = new ArrayList();
xAxisLables.add("1");
xAxisLables.add("2");
xAxisLables.add("3");
xAxisLables.add("4"); ...

OR

String[] xAxisLables = new String[]{"1","2", "3", "4" ...};

barChartView.getXAxis().setValueFormatter(new IndexAxisValueFormatter(xAxisLables));

你可以在xAxisLabels中准备任何你想要展示的数据。

1
这应该是最新版本库的被接受解决方案。 - ScruffyFox
我有一个与此相关的问题,您能否请看一下? - Moeez
1
@Moeez,也许 xAsix.setLabelCount(...) 可以帮助你。 - Amir Raza

4

对于 com.github.PhilJay:MPAndroidChart:v3.0.3

我正在使用标签列表:

final List list_x_axis_name = new ArrayList<>();
list_x_axis_name.add("label1");
list_x_axis_name.add("label2");
list_x_axis_name.add("label3");
list_x_axis_name.add("label4");
list_x_axis_name.add("label5");

并将标签设置为:

BarChart chartBar = (BarChart) findViewById(R.id.chartBar);
XAxis xAxis = chartBar.getXAxis();
xAxis.setGranularity(1f);
xAxis.setCenterAxisLabels(true);
xAxis.setLabelRotationAngle(-90);
xAxis.setValueFormatter(new IAxisValueFormatter() {
 @override
 public String getFormattedValue(float value, AxisBase axis) {
  if (value >= 0) {
   if (value <= list_x_axis_name.size() - 1) {
    return list_x_axis_name.get((int) value);
   }
   return "";
  }
  return "";
 }
});

我有一个与此相关的问题,您能否请看一下? - Moeez

3

如果有人需要Kotlin版本的示例,我稍微定制了一下:

val labels = arrayListOf(
    "Ene", "Feb", "Mar",
    "Abr", "May", "Jun",
    "Jul", "Ago", "Set",
    "Oct", "Nov", "Dic"
)

barChart.xAxis.valueFormatter = IndexAxisValueFormatter(labels)
barChart.xAxis.position = XAxis.XAxisPosition.BOTTOM

barChart.setDrawGridBackground(false)
barChart.axisLeft.isEnabled = false
barChart.axisRight.isEnabled = false
barChart.description.isEnabled = false

val entries = arrayListOf(
    BarEntry(0f, 10f),
    BarEntry(1f, 20f),
    BarEntry(2f, 30f),
    BarEntry(3f, 40f),
    BarEntry(4f, 50f),
    BarEntry(5f, 60f),
    BarEntry(6f, 70f),
    BarEntry(7f, 60f),
    BarEntry(8f, 50f),
    BarEntry(9f, 40f),
    BarEntry(10f, 30f),
    BarEntry(11f, 20f)
)    
val set = BarDataSet(entries, "BarDataSet")
set.valueTextSize = 12f

barChart.data = BarData(set)    
barChart.invalidate()
  • 默认情况下,x轴标签显示在顶部。本示例将它们显示在底部。
  • 我还禁用了文本描述以及左右两侧的坐标轴(是的,默认情况下我们有两个Y轴)。
  • 我决定禁用网格并增加文字大小(默认情况下文字很小)。

我有一个与此相关的问题,您能否请看一下? - Moeez

3
在动态设置 X 轴标签中,
XAxis xAxis = chart.getXAxis();

xAxis.setValueFormatter(new IndexAxisValueFormatter(getDate));

public ArrayList<String> getDate() {

        ArrayList<String> label = new ArrayList<>();
        for (int i = 0; i < yourList.size(); i++)
            label.add(yourList.get(i).getDateValue());
        return label;
    }

我有一个与此相关的问题,您能否请看一下? - Moeez
@Moeez 请尝试将此值调整为 xAxis.setGranularity(1f)。 - Gayathri
我已经尝试过这个 xAxis.setGranularity(1f); xAxis.setGranularityEnabled(true); 但结果相同。 - Moeez
@Moeez 给 xAxis.setGranularity(2f) 赋值,然后检查结果;再给 xAxis.setGranularity(0f) 赋值,然后检查结果。 - Gayathri

0
        HorizontalBarChart chart = findViewById(R.id.hbc_graph);   

        ArrayList<BarEntry> entries = new ArrayList<>();
        entries.add(new BarEntry(0, 3f));
        entries.add(new BarEntry(1, 8f));
        entries.add(new BarEntry(2, 6f));
        entries.add(new BarEntry(3, 11f));
        entries.add(new BarEntry(4, 5f));
        entries.add(new BarEntry(5, 14f));

        BarDataSet dataSet = new BarDataSet(entries,"Horizontal Bar");

        BarData data = new BarData(dataSet);
        chart.setData(data);
        chart.animateXY(2000, 2000);
        chart.invalidate();


        ArrayList<String> xLabels = new ArrayList<>();
        xLabels.add("January");
        xLabels.add("February");
        xLabels.add("March");
        xLabels.add("April");
        xLabels.add("May");
        xLabels.add("June");

        XAxis xAxis = chart.getXAxis();
        xAxis.setValueFormatter(new IAxisValueFormatter() {
            @Override
            public String getFormattedValue(float value, AxisBase axis) {
                Print.e(value);
                return xLabels.get((int) value);
            }

        });

我有一个与此相关的问题,您能否请看一下? - Moeez

0
ArrayList<String> xMonth= new ArrayList<>();
            xMonth.add("January");
            xMonth.add("February");
            xMonth.add("March");
            xMonth.add("April");
            xMonth.add("May");
            xMonth.add("June");
XAxis xAxis = chartMth.getXAxis();
xAxis.setValueFormatter(new ValueFormatter() {
   
                @Override
                public String getAxisLabel(float value, AxisBase axis) {
                    return xMonth.get((int) value);
                }
            });

1
您的回答可以通过提供更多的支持性信息来改进。请进行[编辑]以添加更多详细信息,例如引用或文档,以便他人确认您的答案是否正确。您可以在帮助中心找到有关如何撰写良好答案的更多信息。 - Community

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