How to create a BarChart with grouped bars with MPAndroidChart?

前端 未结 4 1095
我在风中等你
我在风中等你 2020-12-29 05:38

How can i compare two set of data using BarChart of MPAndroidChart.

It should look like this image below:

I edited a code, I get from a sample

4条回答
  •  梦谈多话
    2020-12-29 06:07

    Since there has been an update on BarData constructor you need to use following code:

    BarChart barChart = (BarChart) view.findViewById(R.id.chart);
    barChart.setDrawBarShadow(false);
    barChart.setDrawValueAboveBar(true);
    barChart.setDescription("");
    barChart.setMaxVisibleValueCount(50);
    barChart.setPinchZoom(false);
    barChart.setDrawGridBackground(false);
    
    XAxis xl = barChart.getXAxis();
    xl.setGranularity(1f);
    xl.setCenterAxisLabels(true);
    xl.setValueFormatter(new AxisValueFormatter() {
        @Override
        public String getFormattedValue(float value, AxisBase axis) {
            return String.valueOf((int) value);
        }
    
        @Override
        public int getDecimalDigits() {
            return 0;
        }
    });
    
    YAxis leftAxis = barChart.getAxisLeft();
    leftAxis.setValueFormatter(new AxisValueFormatter() {
        @Override
        public String getFormattedValue(float value, AxisBase axis) {
            return String.valueOf((int) value);
        }
    
        @Override
        public int getDecimalDigits() {
            return 0;
        }
    });
    leftAxis.setDrawGridLines(false);
    leftAxis.setSpaceTop(30f);
    leftAxis.setAxisMinValue(0f); // this replaces setStartAtZero(true
    barChart.getAxisRight().setEnabled(false);
    
    //data
    float groupSpace = 0.04f;
    float barSpace = 0.02f; // x2 dataset
    float barWidth = 0.46f; // x2 dataset
    // (0.46 + 0.02) * 2 + 0.04 = 1.00 -> interval per "group"
    
    int startYear = 1980;
    int endYear = 1985;
    List yVals1 = new ArrayList(); 
    List yVals2 = new ArrayList();
    
    for (int i = startYear; i < endYear; i++) {
        yVals1.add(new BarEntry(i, 0.4f));
        yVals2.add(new BarEntry(i, 0.7f));
    }
    
    BarDataSet set1, set2;
    if (barChart.getData() != null && barChart.getData().getDataSetCount() > 0) {
        set1 = (BarDataSet)barChart.getData().getDataSetByIndex(0);
        set2 = (BarDataSet)barChart.getData().getDataSetByIndex(1);
        set1.setValues(yVals1);
        set2.setValues(yVals2);
        barChart.getData().notifyDataChanged();
        barChart.notifyDataSetChanged();
    } else {
        // create 2 datasets with different types
        set1 = new BarDataSet(yVals1, "Company A");
        set1.setColor(Color.rgb(104, 241, 175));
        set2 = new BarDataSet(yVals2, "Company B");
        set2.setColor(Color.rgb(164, 228, 251));
        ArrayList dataSets = new ArrayList();
        dataSets.add(set1);
        dataSets.add(set2);
        BarData data = new BarData(dataSets);
        barChart.setData(data);
    }
    
    barChart.getBarData().setBarWidth(barWidth);
    barChart.getXAxis().setAxisMinValue(startYear);
    barChart.groupBars(startYear, groupSpace, barSpace);
    barChart.invalidate();
    

    That's how it will look like:

提交回复
热议问题