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

MPChart水平堆叠条形图Y轴标签异常问题:标签不匹配给定ArrayList、无法对齐且显示异常

解决MPChart水平堆叠条形图Y轴标签不匹配、对齐异常及格式化问题

我看了你用MPChart实现水平堆叠条形图时遇到的Y轴标签错位、和数据不匹配,还有班次标签显示异常的问题,结合你贴的代码片段,咱们一步步来梳理和修复这些问题:

一、Y轴标签与ArrayList数据不匹配、对齐异常的核心修复

你当前的Y轴设置只指定了标签数量,但没把刻度和arrayListHour的索引绑定,这是标签错位的核心原因。水平堆叠条形图的Y轴刻度本质是对应数据的类别索引(比如第0个条形对应Y轴0刻度,第1个对应1刻度),所以得手动锁定Y轴范围并关联数据:

  1. 强制Y轴刻度匹配数据项数量
    替换你原来的rightAxis.calculate(...)和setVisibleYRangeMaximum代码,手动设置Y轴的最小/最大值,确保每个数据项对应一个刻度:

    rightAxis.setAxisMinimum(0f);
    rightAxis.setAxisMaximum(arrayListHour.size() - 1f);
    rightAxis.setLabelCount(arrayListHour.size(), true); // 第二个参数设为true,强制显示指定数量的标签且均匀分布
    rightAxis.setAutoScaleMinMaxEnabled(false); // 关闭自动缩放,避免覆盖手动设置的范围
    
  2. 把Y轴刻度绑定到你的ArrayList数据
    你原来的ValueFormatter只做了数值格式化,但没关联arrayListHour里的实际标签(比如班次、小时文本),替换成下面的实现,让每个刻度对应arrayListHour里的内容:

    rightAxis.setValueFormatter(new ValueFormatter() {
        @Override
        public String getFormattedValue(float value) {
            int index = (int) value;
            // 确保索引在数组范围内,避免越界
            if (index >= 0 && index < arrayListHour.size()) {
                // 返回arrayListHour中对应的班次/小时标签
                return arrayListHour.get(index);
            }
            return "";
        }
    });
    

二、班次标签无法正常显示和对齐的修复

  1. 调整标签对齐方式与显示位置
    让Y轴标签和条形图居中对齐,并确保显示在图表外侧不被遮挡:

    rightAxis.setLabelAlignment(Paint.Align.CENTER);
    rightAxis.setPosition(YAxis.YAxisLabelPosition.OUTSIDE_CHART);
    
  2. 给标签留出足够显示空间
    如果标签太长被截断,调整右侧偏移量并开启自动换行:

    rightAxis.setWordWrapEnabled(true);
    chart.getViewPortHandler().setMaximumRightOffset(100f); // 根据标签长度调整偏移量
    

三、Y轴数值格式化位置错误的修复

如果你的需求是显示格式化后的时间(比如跨天的小时数),要注意区分Y轴的刻度索引和实际时间值:

  • 确保数据集合中每个BarEntry的y值是对应的索引(比如第i个数据的y=i)
  • 在ValueFormatter中通过索引从arrayListHour取出实际时间值再格式化:
    rightAxis.setValueFormatter(new ValueFormatter() {
        @Override
        public String getFormattedValue(float value) {
            int index = (int) value;
            if (index >= 0 && index < arrayListHour.size()) {
                float hourValue = arrayListHour.get(index);
                // 处理跨天的特殊情况
                if (hourValue <= -1) {
                    hourValue = 24 + hourValue;
                }
                if (hourValue >= 24) {
                    hourValue = hourValue - 24;
                }
                return String.format("%02d", (int) hourValue);
            }
            return "";
        }
    });
    

四、最后检查数据绑定是否正确

确保你创建BarEntry时,每个堆叠条的y值对应Y轴的索引,比如:

ArrayList<BarEntry> entries = new ArrayList<>();
for (int i = 0; i < arrayListHour.size(); i++) {
    // 替换成你的堆叠数值数组,比如停机时间、运行时间
    float[] stackValues = {downtimeValue, workingTimeValue};
    entries.add(new BarEntry(i, stackValues)); // y值设为索引i,对应Y轴的刻度
}
BarDataSet dataSet = new BarDataSet(entries, "");
// 配置数据集的颜色、标签等
BarData barData = new BarData(dataSet);
chart.setData(barData);

做完这些调整后,调用chart.invalidate()刷新图表,应该就能解决Y轴标签不匹配、对齐异常以及班次标签显示的问题了。

内容的提问来源于stack exchange,提问作者Hassan Izhar

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.29 19:53:10