水平条形图?也就是倒起来的柱状图,简单理解可以为,将正常的图表顺时针旋转90度,其x轴,y轴对应关系如下。

MPAndroidChart_水平条形图的那些事_HorizontalBarChart

简单明了吧,就是打个转而已,好了,现在开始熟悉它的相关方法,其实和柱状图没区别。。。

直接附上代码,相应的注释也在其中,如果有不懂的,可以看我别的文章。有些方法通用就没有必要再演示了。

public class MainActivity extends AppCompatActivity {
private HorizontalBarChart chart;

@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
chart = findViewById(R.id.chart);

XAxis xAxis = chart.getXAxis();
//取消x轴横线
xAxis.setDrawAxisLine(true);
//取消x轴竖线
xAxis.setDrawGridLines(false);
//设置x轴位于底部
xAxis.setPosition(XAxis.XAxisPosition.BOTTOM);
//显示3个标签 (不一定准确,如果要准确显示,请带上true)
xAxis.setLabelCount(3);
// x轴最大长度3f (注意自定义标签时,它与BarEntry(x,y),与x的关系)
xAxis.setAxisMaximum(3);
// x轴标签字体大小
xAxis.setTextSize(20f);
//自定义X轴
final List<String> list=new ArrayList<>();
list.add("昨天");
list.add("今天");
list.add("明天");
xAxis.setValueFormatter(new IAxisValueFormatter() {
@Override
public String getFormattedValue(float value, AxisBase axis) {
return value>2?"":list.get((int) value);
}
});

//在定义y轴的时候,需要两边都进行设置,而不是直接setEnabled禁用。否则将产生数据偶尔不显示的问题
YAxis left = chart.getAxisLeft();
left.setAxisMinimum(0);
left.setDrawGridLines(false);
left.setDrawAxisLine(false);



YAxis right = chart.getAxisRight();
right.setDrawGridLines(false);
right.setDrawAxisLine(true);
right.setTextSize(20f);
right.setLabelCount(11);
right.setAxisMinimum(0);
// y轴最大长度100f (注意自定义标签时,它与BarEntry(x,y),与y的关系)
right.setAxisMaximum(100f);

//自定义Y轴
final List<String> listY = new ArrayList<>();
for (int i = 0; i <= 100; i += 10) {
listY.add(i + "%");
}
right.setValueFormatter(new IAxisValueFormatter() {
@Override
public String getFormattedValue(float value, AxisBase axis) {
return value>100?"":listY.get((int) value/10);
}
});


//将图表底部向上偏移10f
chart.setExtraBottomOffset(10);
//将图表右边靠左偏移10f
chart.setExtraRightOffset(10);
//禁用描述
chart.getDescription().setEnabled(false);
//禁用图例
chart.getLegend().setEnabled(false);

//随机3个数
setData(3);
}

private void setData(int postion) {
List<BarEntry> list = new ArrayList<>();
for (int i = 0; i < postion; i++) {
list.add(new BarEntry(i, (float) (Math.random() * 101)));
}

BarDataSet set = new BarDataSet(list, "");
//取消显示标签
set.setDrawValues(false);
//设置多种颜色,如果x长度大于颜色个数,将随机赋予颜色
set.setColors(Color.RED,Color.BLACK,Color.BLUE);
BarData data = new BarData(set);
//设置轴的宽度
data.setBarWidth(0.4f);
chart.setData(data);
chart.invalidate();
}

}

最后,再说一下自定义x,y轴时需要注意的:


注意我上面代码里设置 x轴,y轴最大长度时的注释,与 BarEntry(x,y)  中的x,y密切相关。

一般情况下我们无需特意去设置 x,y轴的标签,但有时候的需求需要这几个值自定义并且不变,就像上面Demo里的百分比一样。

先说一下 setLabelCount这个方法,它设置的是显示的标签数。但是并不一定准确

setAxisMaximum 它与x的大小有关,MPandroidchart 在 将数据添加到图表中时,因为x不固定大小,所以在每次绘制时,会以最大的x值和标签的个数来规定标签的显示,及就是value从0开始增加,执行标签个数次。同理y轴也是一样的。

如图:

 MPAndroidChart_水平条形图的那些事_MPAndroidChart_02


所以我们如果要自定义x轴或者y轴时,一定要注意 x轴或y轴的最大长度,配合设置标签数才可以更加得心应手。



3.12补充


今天使用的时候发现了一个问题,我的y轴数据为啥偶尔不显示了?

原因是因为有一方的最小y轴长度没有设置,在使用别的图时,我们直接setEnabled禁用即可。但是在水平图里面,这样是千万不行的。

原因是因为,水平图表 需要你的两条y轴确定一个点来定位,但是我们一般只对一个轴进行设置,所以就会产生数据点不显示的情况。