You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Android MPChart分组柱状图X轴标签重复问题求助

解决Android MPChart分组多柱状图X轴标签重复与Formatter取值错误问题

你遇到的问题核心在于分组柱状图的X轴坐标逻辑和当前Formatter取值方式不匹配,再加上几处X轴配置的错误设置,导致了标签重复和取值异常。我来帮你一步步修复:

核心问题拆解

  1. 分组柱状图的X轴不是整数索引:调用chart.groupBars()后,每个分组的X轴位置是带偏移的范围值(比如第一组是0 ~ groupWidth,第二组是groupWidth ~ 2*groupWidth),直接把float value强转为int会得到重复的整数(如0、0、1、1...),自然会重复取同一个标签。
  2. 错误的X轴配置:setGranularityEnabled(false)会关闭X轴的粒度控制,允许重复标签显示;setLabelCount(dayDataList.size(), true)在分组场景下不适用,因为分组后每个组占的宽度不是1单位。
  3. setData()里的冗余代码:你在更新数据集时错误覆盖了values1和values2,会导致数据显示异常。

分步解决方案

1. 修正X轴核心配置

替换你原来的X轴设置代码为以下内容:

//X轴设置
XAxis xAxis = chart.getXAxis();
xAxis.setCenterAxisLabels(true); // 标签居中对齐到分组中间
xAxis.setPosition(XAxis.XAxisPosition.BOTTOM);
xAxis.setDrawGridLines(false);

// 关键:开启粒度控制,设置粒度为分组宽度,确保每个分组只显示一个标签
float groupWidth = chart.getBarData().getGroupWidth(groupSpace, barSpace);
xAxis.setGranularity(groupWidth);
xAxis.setGranularityEnabled(true);

// 移除setLabelCount,让MPChart自动计算合适的标签数量
// xAxis.setLabelCount(dayDataList.size(), true);

2. 修复自定义IAxisValueFormatter的取值逻辑

不再直接强转value为int,而是通过分组宽度计算当前所属的分组索引:

xAxis.setValueFormatter(new IAxisValueFormatter() {
    @Override
    public String getFormattedValue(float value, AxisBase axis) {
        // 通过分组宽度计算当前分组的索引
        float groupWidth = chart.getBarData().getGroupWidth(groupSpace, barSpace);
        int groupIndex = (int) (value / groupWidth);
        // 防止索引越界
        if (groupIndex >= xAxisLabel.size()) {
            return "";
        }
        Log.e("TAG_VALUE", "group index is "+groupIndex);
        return xAxisLabel.get(groupIndex);
    }
});

3. 清理setData()里的冗余代码

删除setData()中这两行错误覆盖数据的代码:

// 删掉这两行!会覆盖你之前设置的values1和values2
set1.setValues(yVals1);
set2.setValues(yVals2);

4. 调整分组配置的顺序

确保groupBars()和X轴范围设置在setData()的最后,并且在计算分组宽度前已经设置好barWidth、groupSpace和barSpace:

private void setData() {
    // ... 省略前面的数据集创建代码 ...

    float barSpace = 0.02f;
    float groupSpace = 0.1f;
    int groupCount = dayDataList.size();
    float barWidth = 0.15f;

    BarData data = new BarData(set1, set2);
    data.setValueTextSize(10f);
    data.setBarWidth(barWidth);
    chart.setData(data);

    // 计算分组宽度并设置X轴范围
    float groupWidth = data.getGroupWidth(groupSpace, barSpace);
    chart.getXAxis().setAxisMinimum(0);
    chart.getXAxis().setAxisMaximum(0 + groupWidth * groupCount);
    chart.groupBars(0, groupSpace, barSpace);

    // ... 省略其他设置代码 ...
}

额外优化建议

  • 把xAxisLabel的初始化逻辑简化,直接用你定义的array转成List,避免重复创建:
    final ArrayList<String> xAxisLabel = new ArrayList<>(Arrays.asList(array));
    
  • 如果dayDataList的大小不是24,要确保xAxisLabel的大小和groupCount一致,避免索引越界。

这样修改后,X轴标签就会每个分组显示一次,不会重复,且Formatter能正确取到对应的标签。

内容的提问来源于stack exchange,提问作者Anshul Tyagi

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.12 05:19:24