MPAndroidChart直方图、多组(可滑动、渐变可以看博主前面讲直方图的博客)

分组直方图

这里写图片描述


代码

private void showBarChart() {
        setBarChartProperties();
        setBarChartMarkView();
        setXAxis();
        setYAxis();
        setBarChartLegend();
        setBarChartData(xListValue.size(),yListValue);
    }

    private void setBarChartProperties() {
        mBarChart.setDrawBarShadow(false);//设置阴影为false
        mBarChart.setDrawValueAboveBar(false);//这里设置为true每一个直方图的值就会显示在直方图的顶部
        mBarChart.getDescription().setEnabled(false);//设置描述不显示
        mBarChart.setPinchZoom(false);
        mBarChart.setDrawGridBackground(false);//设置不显示网格
        //mbarchart.setMaxVisibleValueCount(60);
        float ratio = (float) xListValue.size()/(float) 10;
        mBarChart.zoom(ratio,1f,0,0);//显示的时候是按照多大的比率缩放显示  1f表示不放大缩小
        //我默认手机屏幕上显示10  剩下的滑动直方图 然后显示。。假如要显示25个 那么除以10 就是放大2.5f。。同理
        // 56个民族   那么放大5.6f

        mBarChart.animateY(1500);//从Y轴弹出的动画时间
        //mBarChart.getLegend().setEnabled(false);//设置不显示比例图
        mBarChart.setScaleEnabled(false);//设置是否可以缩放
        mBarChart.setTouchEnabled(true);//设置是否可以触摸
        mBarChart.setDragEnabled(true);//设置是否可以拖拽
    }
//定义点击直方图顶部弹出的类似popuwindow的标记
private void setBarChartMarkView() {
        // create a custom MarkerView (extend MarkerView) and specify the layout
        // to use for it
        PandectMarkerView mv = new PandectMarkerView(getActivity(), R.layout.custom_marker_view);
        mv.setChartView(mBarChart); // For bounds control
        mBarChart.setMarker(mv); // Set the marker to the chart
    }
private void setXAxis() {
        //自定义设置横座标
        IAxisValueFormatter xValueFormatter = new PandectModelFourXValueFormatter(xListValue);
        //设置不显示网格线,保留水平线
        XAxis xAxis = mBarChart.getXAxis();
        xAxis.setPosition(XAxis.XAxisPosition.BOTTOM);
        xAxis.setDrawAxisLine(true);
        xAxis.setDrawGridLines(false);
        xAxis.setGranularity(1f);
        //xAxis.setLabelCount(xListValue.size());//设置横座标显示多少个
        xAxis.setLabelCount(10);//一个界面显示10个Lable。那么这里要设置11个
        xAxis.setCenterAxisLabels(true);//字体下面的标签 显示在每个直方图的中间
        xAxis.setValueFormatter(xValueFormatter);//将自定义的横座标设置上去
        xAxis.setLabelRotationAngle(-40f);
    }
private void setYAxis() {
        //左边Y轴
        YAxis leftYAxis = mBarChart.getAxisLeft();
        leftYAxis.setDrawGridLines(true);//设置从Y轴左侧发出横线
        leftYAxis.setAxisMinimum(0f);
        leftYAxis.setEnabled(true);//设置显示左边Y座标
        //右边Y轴
        YAxis rightYAxis = mBarChart.getAxisRight();
        rightYAxis.setEnabled(false);//设置隐藏右边y座标
    }
private void setBarChartLegend() {
        Legend l = mBarChart.getLegend();
        l.setVerticalAlignment(Legend.LegendVerticalAlignment.TOP);
        l.setHorizontalAlignment(Legend.LegendHorizontalAlignment.CENTER);
        l.setOrientation(Legend.LegendOrientation.HORIZONTAL);
        l.setDrawInside(false);
        l.setYOffset(0f);
        l.setXOffset(10f);
        l.setFormSize(8f);
        l.setXEntrySpace(4f);
        l.setEnabled(true);//设置显示比例图
    }
    private int[] mColors = new int[] {
            Color.parseColor("#C23531"),
            Color.parseColor("#2F4554")
    };

    private void setBarChartData(int count, ArrayList<ArrayList<Float>> yListValue) {
        // 这里是通用的设置
        float groupSpace = 0.12f; //柱状图组之间的间距
        float barSpace = (float) ((1 - 0.12) / yListValue.size() / 10); // x4 DataSet
        float barWidth = (float) ((1 - 0.12) / yListValue.size() / 10 * 9); // x4 DataSet
        //满足的规则:(barWidth + barSpace)*4 + groupSpace = 1.00 -> interval per "group"
        int startYear = 0;
        ArrayList<IBarDataSet> dataSets = new ArrayList<IBarDataSet>();
        for(int i=0;i<yListValue.size();i++){
            ArrayList<BarEntry> yValues = new ArrayList<>();
            for(int j=0;j<count;j++){
                yValues.add(new BarEntry(j,yListValue.get(i).get(j)));
            }
            BarDataSet set = new BarDataSet(yValues,lableNames.get(i));
            set.setDrawIcons(false);//设置直方图上面时候显示图标
            set.setColor(mColors[i%mColors.length]);
            dataSets.add(set);
        }
        BarData data = new BarData(dataSets);
        data.setValueFormatter(new LargeValueFormatter());
        data.setValueTextSize(10f);//设置直方图上面文字的大小
        data.setBarWidth(0.9f);//设置直方图的宽度
        data.setValueTextColor(Color.WHITE);
        data.setDrawValues(true);//设置直方图上面的值显示
        //data.setBarWidth(barWidth);//直方图的宽度
        data.setDrawValues(false);//设置不显示值
        mBarChart.setData(data);//设置值

        mBarChart.getBarData().setBarWidth(barWidth);//设置直方图每个bar的宽度
        // restrict the x-axis range
        mBarChart.getXAxis().setAxisMinimum(startYear);//设置X轴的最小值从startYear开始

        //要实现分组下面的代码必须实现,博主理解的不清楚,虽然简单地懂 不好意思 O(∩_∩)O
        // barData.getGroupWith(...) is a helper that calculates the width each group needs based on the provided parameters
        mBarChart.getXAxis().setAxisMaximum(startYear + mBarChart.getBarData().getGroupWidth(groupSpace, barSpace) * count);
        //起始点、直方图组间距、直方图之间的间距
        mBarChart.groupBars(startYear, groupSpace, barSpace);

        mBarChart.invalidate();
    }
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章