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

如何设置MPAndroidChart的HorizontalBarChart使其不从0起始?

嘿,我之前也折腾过这个需求!MPAndroidChart的HorizontalBarChart默认确实会从0开始绘制条形,要实现你想要的不从0起始的效果,有两种实用的方法,你可以根据自己的场景选:


方法一:设置轴的最小值(适合统一起始基准的场景)

如果你的所有条形都需要从同一个非0值开始,且数据都大于这个起始值,直接修改Y轴的配置就可以快速实现:

实现步骤

  1. 获取HorizontalBarChart的水平轴(因为HorizontalBarChart的条形长度对应Y轴的数值)
  2. 关闭「强制从0开始」的配置
  3. 设置你想要的起始最小值

修改后的代码(添加到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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.15 04:03:00