MPChart水平堆叠条形图Y轴标签异常问题:标签不匹配给定ArrayList、无法对齐且显示异常
解决MPChart水平堆叠条形图Y轴标签不匹配、对齐异常及格式化问题
我看了你用MPChart实现水平堆叠条形图时遇到的Y轴标签错位、和数据不匹配,还有班次标签显示异常的问题,结合你贴的代码片段,咱们一步步来梳理和修复这些问题:
一、Y轴标签与ArrayList数据不匹配、对齐异常的核心修复
你当前的Y轴设置只指定了标签数量,但没把刻度和arrayListHour的索引绑定,这是标签错位的核心原因。水平堆叠条形图的Y轴刻度本质是对应数据的类别索引(比如第0个条形对应Y轴0刻度,第1个对应1刻度),所以得手动锁定Y轴范围并关联数据:
强制Y轴刻度匹配数据项数量
替换你原来的rightAxis.calculate(...)和setVisibleYRangeMaximum代码,手动设置Y轴的最小/最大值,确保每个数据项对应一个刻度:rightAxis.setAxisMinimum(0f); rightAxis.setAxisMaximum(arrayListHour.size() - 1f); rightAxis.setLabelCount(arrayListHour.size(), true); // 第二个参数设为true,强制显示指定数量的标签且均匀分布 rightAxis.setAutoScaleMinMaxEnabled(false); // 关闭自动缩放,避免覆盖手动设置的范围把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 ""; } });
二、班次标签无法正常显示和对齐的修复
调整标签对齐方式与显示位置
让Y轴标签和条形图居中对齐,并确保显示在图表外侧不被遮挡:rightAxis.setLabelAlignment(Paint.Align.CENTER); rightAxis.setPosition(YAxis.YAxisLabelPosition.OUTSIDE_CHART);给标签留出足够显示空间
如果标签太长被截断,调整右侧偏移量并开启自动换行: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
相关产品推荐
相关产品推荐

