超简单!Android植入MPAndroidChart统计图(条形、圆柱)同时解决X轴为中文、斜着显示(直接拿来用)

16 篇文章 0 订阅
14 篇文章 0 订阅

最近项目要统计巡查数据以柱状图表示各区域、各时段、各类巡查对象数量及变化趋势,数据需要自己替换,可以用List封装;
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
字体、颜色都可以根据自己需求更改

第一步

implementation ‘com.github.PhilJay:MPAndroidChart:v3.0.1’
maven { url “https://jitpack.io” }

allprojects {
    repositories {
        google()
        jcenter()
        maven { url "https://jitpack.io" }
    }
}

编译完没问题后:
首先是布局

第二步
条形统计图

<com.github.mikephil.charting.charts.BarChart
                    android:id="@+id/chart"
                    android:layout_width="match_parent"
                    android:layout_height="400dp"
                    android:layout_margin="10dp"
                    android:padding="20dp" />

扇形统计图

 <com.github.mikephil.charting.charts.PieChart
                    android:id="@+id/chart2"
                    android:layout_width="match_parent"
                    android:layout_height="400dp"
                    android:layout_margin="10dp"
                    android:padding="20dp" />

需要哪种就用哪种直接放在activity布局里就可以了

第三步
在Activity中直接用这个方法,不要嫌多直接复制能用,大部分都是在设置样式

    private BarChart chart;
    
    private void initData1() {
        chart = findViewById(R.id.chart);
        chart.getDescription().setEnabled(false);
        chart.setMaxVisibleValueCount(60);
        chart.setPinchZoom(false);
        chart.setDrawBarShadow(false);
        chart.setDrawGridBackground(false);
        chart.animateY(1500);
        chart.getLegend().setEnabled(false);
        XAxis xAxis = chart.getXAxis();
        xAxis.setPosition(XAxis.XAxisPosition.BOTTOM);
        xAxis.setDrawGridLines(false);
        ArrayList<BarEntry> values = new ArrayList<>();
        
        //Sum就是代码有几个条形
        int sum=7;
        for (int i = 0; i < sum; i++) {
            float multi = (i + 1);
            float val = (float) (int)((Math.random() * multi) + multi / 2);
            values.add(new BarEntry(i, val));
        }
        BarDataSet set1;
        if (chart.getData() != null &&
                chart.getData().getDataSetCount() > 0) {
            set1 = (BarDataSet) chart.getData().getDataSetByIndex(0);
            set1.setValues(values);
            chart.getData().notifyDataChanged();
            chart.notifyDataSetChanged();
        } else {
            set1 = new BarDataSet(values, "Data Set");
            set1.setColors(ColorTemplate.VORDIPLOM_COLORS);
            set1.setDrawValues(false);
            ArrayList<IBarDataSet> dataSets = new ArrayList<>();
            dataSets.add(set1);

            BarData data = new BarData(dataSets);
            chart.setData(data);
            chart.setFitBars(true);
            final String[] months = new String[] {
                    "高家闸建筑用砂矿",
                    "镇北堡2号建筑用砂矿",
                    "套门沟老采区3号建筑石料用灰岩矿",
                    "套门沟5号建筑石料用灰岩矿",
                    "套门沟老采区1号建筑石料用灰岩矿",
                    "套门沟老采区2号建筑石料用灰岩矿",
                    "套门沟石灰石矿山"
            };
            xAxis.setValueFormatter(new IAxisValueFormatter() {
                @Override
                public String getFormattedValue(float value, AxisBase axis) {
                    if (value >= 0) {
                        return months[(int) value % months.length];
                    } else {
                        return "";
                    }
                }
            });
        }
        //这里的作用是将X轴上的文字旋转80度
        chart.getXAxis().setLabelRotationAngle(-80);
        chart.getAxisRight().setEnabled(false);
        chart.setScaleYEnabled(false);
        chart.setScaleXEnabled(false);
        chart.invalidate();
    }

多种类型的统计

其实跟上面差不多,同样可以直接拿来用

private BarChart chart1;
private void initData2() {
        chart1 = findViewById(R.id.chart1);
        chart1.getDescription().setEnabled(false);
        chart1.setPinchZoom(false);
        chart1.setDrawBarShadow(false);
        chart1.setDrawGridBackground(false);
        chart1.getAxisRight().setEnabled(false);
        Legend l = chart1.getLegend();
        l.setVerticalAlignment(Legend.LegendVerticalAlignment.TOP);
        l.setHorizontalAlignment(Legend.LegendHorizontalAlignment.RIGHT);
        l.setOrientation(Legend.LegendOrientation.VERTICAL);
        l.setDrawInside(true);
        l.setYOffset(0f);
        l.setXOffset(10f);
        l.setYEntrySpace(0f);
        l.setTextSize(8f);
        XAxis xAxis = chart1.getXAxis();
        xAxis.setGranularity(1f);
        xAxis.setCenterAxisLabels(true);
        xAxis.setDrawGridLines(false);
        YAxis leftAxis = chart1.getAxisLeft();
        leftAxis.setValueFormatter(new LargeValueFormatter());
        leftAxis.setSpaceTop(35f);
        leftAxis.setAxisMinimum(0f); // this replaces setStartAtZero(true)

        float groupSpace = 0.08f;
        float barSpace = 0.03f; // x4 DataSet
        float barWidth = 0.2f; // x4 DataSet
        // (0.2 + 0.03) * 4 + 0.08 = 1.00 -> interval per "group"
        
        //这里设置X\Y
        int k=10;
        int groupCount =6 + 1;
        int startYear = 5;
        int endYear = startYear + groupCount;

        ArrayList<BarEntry> values1 = new ArrayList<>();
        ArrayList<BarEntry> values2 = new ArrayList<>();
        ArrayList<BarEntry> values3 = new ArrayList<>();
        ArrayList<BarEntry> values4 = new ArrayList<>();

        float randomMultiplier = k * 10f;
		
		//这里控制几种类型,我图上加了四个
        for (int i = startYear; i < endYear; i++) {
            values1.add(new BarEntry(i, (float) (Math.random() * randomMultiplier)));
            values2.add(new BarEntry(i, (float) (Math.random() * randomMultiplier)));
            values3.add(new BarEntry(i, (float) (Math.random() * randomMultiplier)));
            values4.add(new BarEntry(i, (float) (Math.random() * randomMultiplier)));
        }

        BarDataSet set1, set2, set3, set4;

        if (chart1.getData() != null && chart1.getData().getDataSetCount() > 0) {

            set1 = (BarDataSet) chart1.getData().getDataSetByIndex(0);
            set2 = (BarDataSet) chart1.getData().getDataSetByIndex(1);
            set3 = (BarDataSet) chart1.getData().getDataSetByIndex(2);
            set4 = (BarDataSet) chart1.getData().getDataSetByIndex(3);
            set1.setValues(values1);
            set2.setValues(values2);
            set3.setValues(values3);
            set4.setValues(values4);
            chart1.getData().notifyDataChanged();
            chart1.notifyDataSetChanged();
        } else {
            // create 4 DataSets
            set1 = new BarDataSet(values1, "安全生产");
            set1.setColor(Color.rgb(104, 241, 175));
            set2 = new BarDataSet(values2, "生态保护");
            set2.setColor(Color.rgb(164, 228, 251));
            set3 = new BarDataSet(values3, "依法生产");
            set3.setColor(Color.rgb(242, 247, 158));
            set4 = new BarDataSet(values4, "地质灾害");
            set4.setColor(Color.rgb(255, 102, 0));

            set1.setDrawValues(false);
            set2.setDrawValues(false);
            set3.setDrawValues(false);
            set4.setDrawValues(false);

            BarData data = new BarData(set1, set2, set3, set4);
            data.setValueFormatter(new LargeValueFormatter());

            chart1.setData(data);
        }

        chart1.getBarData().setBarWidth(barWidth);
        // restrict the x-axis range
        chart1.getXAxis().setAxisMinimum(startYear);
        // barData.getGroupWith(...) is a helper that calculates the width each group needs based on the provided parameters
        chart1.getXAxis().setAxisMaximum(startYear + chart1.getBarData().getGroupWidth(groupSpace, barSpace) * groupCount);
        chart1.groupBars(startYear, groupSpace, barSpace);

        final String[] months = new String[] {
                "高家闸建筑用砂矿",
                "镇北堡2号建筑用砂矿",
                "套门沟老采区3号建筑石料用灰岩矿",
                "套门沟5号建筑石料用灰岩矿",
                "套门沟老采区1号建筑石料用灰岩矿",
                "套门沟老采区2号建筑石料用灰岩矿",
                "套门沟石灰石矿山"
        };
        xAxis.setValueFormatter(new IAxisValueFormatter() {
            @Override
            public String getFormattedValue(float value, AxisBase axis) {
                if (value >= 0) {
                    return months[(int) value % months.length];
                } else {
                    return "";
                }
            }
        });

        xAxis.setPosition(XAxis.XAxisPosition.BOTTOM);
        chart1.getXAxis().setLabelRotationAngle(-80);
        chart1.setScaleYEnabled(false);
        chart1.setScaleXEnabled(false);
        chart1.invalidate();
    }

扇形统计

这里需要绑定PieChart

 		private PieChart chart3;
		private void initData3() {
	        chart3 = findViewById(R.id.chart2);
	        chart3.setUsePercentValues(true);
	        chart3.getDescription().setEnabled(false);
	        chart3.setExtraOffsets(5, 10, 5, 5);
	        chart3.setDragDecelerationFrictionCoef(0.95f);
	        chart3.setCenterText(generateCenterSpannableText());
	        chart3.setDrawHoleEnabled(true);
	        chart3.setHoleColor(Color.WHITE);
	        chart3.setTransparentCircleColor(Color.WHITE);
	        chart3.setTransparentCircleAlpha(110);
	        chart3.setHoleRadius(58f);
	        chart3.setTransparentCircleRadius(61f);
	        chart3.setDrawCenterText(true);
	        chart3.setRotationAngle(0);
	        // enable rotation of the chart by touch
	        chart3.setRotationEnabled(true);
	        chart3.setHighlightPerTapEnabled(true);
	        chart3.animateY(1400, Easing.EasingOption.EaseInOutQuad);
	        // chart.spin(2000, 0, 360);
	        Legend l = chart.getLegend();
	        l.setVerticalAlignment(Legend.LegendVerticalAlignment.TOP);
	        l.setHorizontalAlignment(Legend.LegendHorizontalAlignment.RIGHT);
	        l.setOrientation(Legend.LegendOrientation.VERTICAL);
	        l.setDrawInside(false);
	        l.setXEntrySpace(7f);
	        l.setYEntrySpace(0f);
	        l.setYOffset(0f);
	        // entry label styling
	        chart3.setEntryLabelColor(Color.BLACK);
	        chart3.setEntryLabelTextSize(12f);
	        ArrayList<PieEntry> entries = new ArrayList<>();
	        // NOTE: The order of the entries when being added to the entries array determines their position around the center of
	        // the chart.
	        
			//count 是有几种类型,我写的四种;
			
	        int count = 4;
	        float range = 50;
	        final String[] parties = new String[] {
	                "安全生产", "生态保护", "依法生产", "地质灾害", "Party E", "Party F", "Party G", "Party H",
	                "Party I", "Party J", "Party K", "Party L", "Party M", "Party N", "Party O", "Party P",
	                "Party Q", "Party R", "Party S", "Party T", "Party U", "Party V", "Party W", "Party X",
	                "Party Y", "Party Z"
	        };
	        for (int i = 0; i < count ; i++) {
	            entries.add(new PieEntry((float) ((Math.random() * range) + range / 5),
	                    parties[i % parties.length],
	                    getResources().getDrawable(R.drawable.bg_button)));
	        }
	        PieDataSet dataSet = new PieDataSet(entries, "");
	        dataSet.setSliceSpace(3f);
	        dataSet.setSelectionShift(5f);
	        ArrayList<Integer> colors = new ArrayList<>();
	        for (int c : ColorTemplate.VORDIPLOM_COLORS)
	            colors.add(c);
	
	        for (int c : ColorTemplate.JOYFUL_COLORS)
	            colors.add(c);
	
	        for (int c : ColorTemplate.COLORFUL_COLORS)
	            colors.add(c);
	
	        for (int c : ColorTemplate.LIBERTY_COLORS)
	            colors.add(c);
	
	        for (int c : ColorTemplate.PASTEL_COLORS)
	            colors.add(c);
	
	        colors.add(ColorTemplate.getHoloBlue());
	
	        dataSet.setColors(colors);
	        //dataSet.setSelectionShift(0f);
	
	        PieData data = new PieData(dataSet);
	        data.setValueFormatter(new PercentFormatter());
	        data.setValueTextSize(11f);
	        data.setValueTextColor(Color.BLACK);
	        chart3.setData(data);
	        // undo all highlights
	        chart3.highlightValues(null);
	        chart3.invalidate();
    }

一大半全都是设置属性,如果属性不清楚的可以去这篇博主写的文章看看,里面属性还是挺全的
https://www.cnblogs.com/Sharley/p/8492893.html

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值