MPAndroidChart_水平条形图的那些事

版权声明:https://blog.csdn.net/petterp https://blog.csdn.net/petterp/article/details/88380075

MPAndroidChart攻略第一步——LineChart的点点滴滴。

带你入门折线图的基本使用,各种属性的设置,自定义轴上的标签,及去除边框线与轴线,和MarkView提示的使用。

MPAndroidChart_折线图的那些事

MPAndroidChart_饼图的那些事

MPAndroidChart_动态柱状图

MPAndroidChart_水平条形图的那些事

MPAndroidChart_并列柱状图,及如何实现点击隐藏掉不需要的条目。

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

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

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

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轴也是一样的。

如图:

 

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

3.12补充

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

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

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

猜你喜欢

转载自blog.csdn.net/petterp/article/details/88380075