MPAndroidChart柱状图Y轴数值较大但柱子高度过小问题求助
解决MPAndroidChart柱状图柱子过矮的问题
看起来你遇到的问题是明明Y轴数值都是80+的整数,但绘制出的柱状图柱子却特别矮,结合你的代码来看,我发现几个关键的问题点:
问题根源分析
你的代码里把左右两个Y轴都完全禁用了:
leftAxis.setEnabled(false); rightAxis.setEnabled(false);
MPAndroidChart在Y轴被全部禁用的情况下,自动计算图表高度范围的逻辑会出现偏差,导致柱子的高度无法按照实际数据比例渲染。另外,即使数据值是81、97这类数值,默认情况下图表会把Y轴最小值设为0,若图表容器高度本身不大,再加上Y轴范围计算异常,就会出现柱子“非常小”的情况。
解决方案
方案1:启用Y轴并手动设置合理范围
你可以启用其中一个Y轴(比如左Y轴),并根据你的数据区间手动设置Y轴的最小/最大值,确保柱子高度匹配数据比例:
YAxis leftAxis = mChart.getAxisLeft(); leftAxis.setEnabled(true); // 启用左Y轴 leftAxis.setAxisMinimum(70f); // 根据你的数据设置最小值,比如70 leftAxis.setAxisMaximum(100f); // 设置最大值,覆盖你的数据最大值97 leftAxis.setDrawGridLines(false); // 若不需要网格线可保留此设置
右Y轴可以保持禁用状态,不影响核心渲染逻辑。
方案2:让图表自动适配数据范围
如果你不想手动设置范围,只需要启用任意一个Y轴,MPAndroidChart会自动根据数据的最小和最大值调整Y轴范围,柱子高度就能正常显示:
YAxis leftAxis = mChart.getAxisLeft(); leftAxis.setEnabled(true); leftAxis.setDrawGridLines(false);
方案3:检查图表容器的布局高度
确保你的BarChart所在布局有足够的高度,避免使用wrap_content,可以设置固定高度或者match_parent,否则即使数据正确,容器过窄也会让柱子看起来很矮。
调整后的完整配置方法示例
private void setBarChart(BarChart mChart, DashboardMCOP mcop, DashboardMCOM mcom) { mChart.setOnChartValueSelectedListener(this); mChart.setDrawBarShadow(false); mChart.setDrawValueAboveBar(true); mChart.getDescription().setEnabled(false); mChart.setMaxVisibleValueCount(100); mChart.setPinchZoom(false); mChart.setDrawGridBackground(false); IAxisValueFormatter xAxisFormatter = new DayAxisValueFormatter(mChart, context); XAxis xAxis = mChart.getXAxis(); xAxis.setPosition(XAxis.XAxisPosition.BOTTOM); xAxis.setDrawGridLines(false); xAxis.setGranularity(1f); xAxis.setLabelCount(7); xAxis.setValueFormatter(xAxisFormatter); // 启用左Y轴并设置适配数据的范围 YAxis leftAxis = mChart.getAxisLeft(); leftAxis.setEnabled(true); leftAxis.setAxisMinimum(70f); leftAxis.setAxisMaximum(100f); leftAxis.setDrawGridLines(false); YAxis rightAxis = mChart.getAxisRight(); rightAxis.setEnabled(false); Legend l = mChart.getLegend(); l.setEnabled(false); XYMarkerView mv = new XYMarkerView(context, xAxisFormatter); mv.setChartView(mChart); mChart.setMarker(mv); mChart.animateY(1400, Easing.EasingOption.EaseInOutQuad); setDataBar(mChart, mcop, mcom); }
调整后柱子的高度应该会和你的数据值匹配,不会再出现“非常小”的情况。如果还有问题,可以检查mcom.getTreat()和mcom.getContract()返回的数值是否确实是你预期的81、97等,确保数据没有被错误赋值。
内容的提问来源于stack exchange,提问作者stanly
相关产品推荐
相关产品推荐

