如何设置MPAndroidChart的HorizontalBarChart使其不从0起始?
嘿,我之前也折腾过这个需求!MPAndroidChart的HorizontalBarChart默认确实会从0开始绘制条形,要实现你想要的不从0起始的效果,有两种实用的方法,你可以根据自己的场景选:
方法一:设置轴的最小值(适合统一起始基准的场景)
如果你的所有条形都需要从同一个非0值开始,且数据都大于这个起始值,直接修改Y轴的配置就可以快速实现:
实现步骤
- 获取HorizontalBarChart的水平轴(因为HorizontalBarChart的条形长度对应Y轴的数值)
- 关闭「强制从0开始」的配置
- 设置你想要的起始最小值
修改后的代码(添加到onCreateView中)
// 获取HorizontalBarChart的左侧Y轴(如果用右侧轴就换成getAxisRight()) YAxis yAxis = D_hos_chart.getAxisLeft(); // 告诉图表不要强制从0开始绘制 yAxis.setStartAtZero(false); // 设置你想要的起始最小值,比如20 yAxis.setAxisMinimum(20f); // 可选:如果需要限制最大值,也可以设置 // yAxis.setAxisMaximum(120f);
注意:这种方法是让图表的可视区域从设定的最小值开始,条形的实际长度还是从0到数据值,但0到最小值的部分会被移出可视范围,看起来像是从最小值开始。如果你的数据有小于最小值的情况,这部分条形会被截断看不到。
方法二:使用堆叠条形图(灵活控制每个条形的起始位置)
如果需要每个条形有不同的起始值,或者要准确显示「从X到Y」的区间效果,用堆叠条形图是更稳妥的方案:
实现思路
把每个条形拆成两部分:
- 第一部分:从0到起始值的长度,设置为透明色
- 第二部分:从起始值到最终数据值的长度,设置为你想要的条形颜色
修改后的getDataSet()方法
private ArrayList<IBarDataSet> getDataSet() { ArrayList<IBarDataSet> dataSets = null; ArrayList<BarEntry> valueSet1 = new ArrayList<>(); // 这里可以自定义每个条形的起始值,比如统一设为30,或者每个月份单独设置 float baseStartValue = 30f; // 每个BarEntry用堆叠数组:[透明部分长度, 可见部分长度] BarEntry v1e1 = new BarEntry(new float[]{baseStartValue, data - baseStartValue}, 0); // Jan valueSet1.add(v1e1); BarEntry v1e2 = new BarEntry(new float[]{baseStartValue, 40f - baseStartValue}, 1); // Feb valueSet1.add(v1e2); BarEntry v1e3 = new BarEntry(new float[]{baseStartValue, 60f - baseStartValue}, 2); // Mar valueSet1.add(v1e3); BarEntry v1e4 = new BarEntry(new float[]{baseStartValue, 30f - baseStartValue}, 3); // Apr valueSet1.add(v1e4); BarEntry v1e5 = new BarEntry(new float[]{baseStartValue, 90f - baseStartValue}, 4); // May valueSet1.add(v1e5); BarEntry v1e6 = new BarEntry(new float[]{baseStartValue, 100f - baseStartValue}, 5); // Jun valueSet1.add(v1e6); BarDataSet barDataSet1 = new BarDataSet(valueSet1, ""); // 设置堆叠颜色:第一个是透明,第二个是你想要的条形颜色(比如蓝色) barDataSet1.setColors(new int[]{Color.TRANSPARENT, Color.BLUE}, getContext()); // 关闭堆叠标签,避免显示透明部分的无效标签 barDataSet1.setStackLabels(new String[]{"", "实际数值"}); dataSets = new ArrayList<>(); dataSets.add(barDataSet1); return dataSets; }
注意:如果某个数据值小于起始值,可见部分会变成负数,条形会向左延伸,这时候可以根据需求调整轴的方向或者起始值的设置,灵活性很高。
内容的提问来源于stack exchange,提问作者Eddie.kim
相关产品推荐
相关产品推荐

