MPAndroidChart 配置问题。 Xaxis,条形背景

Problems with MPAndroidChart configuration. Xaxis, bar background

亲爱的 Whosebug 社区!我非常感谢使用过 MPAndroidChart 一段时间或者只了解这个库的人的帮助。

这个 post 可能有点长,但是如果你知道一些提示或技巧,或者你已经使用过这个库 - 请阅读一下,也许你可以节省我的时间很多时间并帮助解决至少一个问题.

所以,长话短说。 我想要达到的目标

以及我现在所拥有的。

先别笑

所以我遇到了三个问题:

  1. 将条形图的背景设置为可绘制项目。我有三个可绘制的渐变背景,没有形状或笔触,只有普通渐变,我想将其设置为我的条形背景。
  2. 条之间的距离。我没有像第一张图片那样成功设置条形之间的距离。我不知道如何在一个 DataSet 中正确地使条形彼此靠近并在 DataSet 之间设置此 space。
  3. X 轴。我知道很多人都很难设置 x 轴标签。我正在使用 IndexAxisValueFormatter 并向它传递一个字符串列表,我想将它们设置为我的标签。

例如,我有 5 个数据集,每个数据集有 3 个柱状图。我应该如何正确配置我的条形图?

提前谢谢你,可爱的 Whosebug 社区!

2) 要在数据集之间设置space,请使用groupBars 方法。它允许设置:

  • space 同一数据集中的柱之间
  • space 数据集之间

    mChart = (BarChart) findViewById(R.id.chart);
    
    final ArrayList<BarEntry> bar1List = new ArrayList<>();
    final ArrayList<BarEntry> bar2List = new ArrayList<>();
    final ArrayList<BarEntry> bar3List = new ArrayList<>();
    final ArrayList<String> xLabels = new ArrayList<>();
    
    for (int i = 0; i < 3; i++) {
        bar1List.add(new BarEntry(i, (float) randInt()));
        bar2List.add(new BarEntry(i, (float) randInt()));
        bar3List.add(new BarEntry(i, (float) randInt()));
    
        xLabels.add("entry " + i);
    }
    
    // set color for bars
    BarDataSet bar1Set = new BarDataSet(bar1List, "Bar 1");
    bar1Set1.setColor(Color.rgb(255, 0, 0));
    
    BarDataSet bar2Set = new BarDataSet(bar2List, "Bar 2");
    bar2Set.setColor(Color.rgb(0, 255, 0));
    
    BarDataSet bar3Set = new BarDataSet(bar3List, "Bar 3");
    bar3Set.setColor(Color.rgb(0, 0, 255));
    
    
    // for 3 bars in a dataset, this must equals "1" :
    //     (barWidth + barSpace) * 3 + groupSpace = 1
    
    // space between data sets
    final float groupSpace = 0.25f;
    // space between bars in same data set
    final float barSpace = 0.05f;
    // width of bar
    final float barWidth = 0.2f;
    
    BarData barData = new BarData(bar1Set, bar2Set, bar3Set);
    barData.setBarWidth(barWidth);
    
    // make this BarData object grouped
    barData.groupBars(0, groupSpace, barSpace); // start at x = 0
    
    mChart.setData(barData);
    

3) 要将字符串列表显示为 x-axis 标签,请创建 IAxisValueFormatter 并将其设置为 x-axis 的 ValueFormatter

    XAxis xAxis = mChart.getXAxis();
    xAxis.setPosition(XAxis.XAxisPosition.BOTTOM);
    xAxis.setDrawGridLines(false);
    xAxis.setDrawAxisLine(false);
    xAxis.setCenterAxisLabels(true);
    xAxis.setGranularity(1f);
    xAxis.setTextSize(12);
    xAxis.setAxisMinimum(0);
    xAxis.setAxisMaximum(barData.getXMax() + 1);

    // xLabels is populated in code above in (2)

    // show user-defined string
    IAxisValueFormatter xAxisFormatter = new IAxisValueFormatter() {
        @Override
        public String getFormattedValue(float value, AxisBase axis) {
            if (value >= 0 && value <= xLabels.size() - 1) {
                return xLabels.get((int) value);
            }

            // to avoid IndexOutOfBoundsException on xLabels, if (value < 0 || value > xLabels.size() - 1)
            return "";
        }
    };

    xAxis.setValueFormatter(xAxisFormatter);

您可以通过下面的示例来实现您想要做的事情:

    float barWidth;
    float barSpace;
    float groupSpace;

    // (barWidth * 2) + (barSpace * 2) + groupSpace should be equal to one
    barWidth = 0.25f;
    barSpace = 0.05f;
    groupSpace = 0.4f;

    int groupCount = 7;

    ArrayList<String> xVals = new ArrayList<String>();

    xVals.add("Jan");
    xVals.add("Feb");
    xVals.add("Mar");
    xVals.add("Apr");
    xVals.add("May");
    xVals.add("Jun");
    xVals.add("Jul");

    ArrayList<BarEntry> yVals1 = new ArrayList<BarEntry>();
    ArrayList<BarEntry> yVals2 = new ArrayList<BarEntry>();

    yVals1.add(new BarEntry(0, (float) 2));
    yVals2.add(new BarEntry(0, (float) 3));
    yVals1.add(new BarEntry(1, (float) 1));
    yVals2.add(new BarEntry(1, (float) 2));
    yVals1.add(new BarEntry(2, (float) 3));
    yVals2.add(new BarEntry(2, (float) 4));
    yVals1.add(new BarEntry(3, (float) 6));
    yVals2.add(new BarEntry(3, (float) 5));
    yVals1.add(new BarEntry(4, (float) 4));
    yVals2.add(new BarEntry(4, (float) 3));
    yVals1.add(new BarEntry(5, (float) 2));
    yVals2.add(new BarEntry(5, (float) 6));
    yVals1.add(new BarEntry(6, (float) 5));
    yVals2.add(new BarEntry(6, (float) 7));

    BarDataSet set1, set2;
    set1 = new BarDataSet(yVals1, "A");
    set1.setColor(getColor("defaultGreen"));
    set1.setValueTextColor(getColor("primaryDark"));
    set1.setValueTextSize(defaultValueTextSize);

    set2 = new BarDataSet(yVals2, "B");
    set2.setColor(getColor("defaultOrange"));
    set2.setValueTextColor(getColor("primaryDark"));
    set2.setValueTextSize(defaultValueTextSize);

    BarData data = new BarData(set1, set2);
    barChart.setData(data);
    barChart.getDescription().setText("No. of Contracts signed in 6 months");
    barChart.getDescription().setTextSize(12);
    barChart.setDrawMarkers(true);
    barChart.setMarker(markerView(context));
    barChart.getAxisLeft().addLimitLine(lowerLimitLine(2,"Minimum",2,12,getColor("defaultOrange"),getColor("defaultOrange")));
    barChart.getAxisLeft().addLimitLine(upperLimitLine(6,"Target",2,12,getColor("defaultGreen"),getColor("defaultGreen")));

    barChart.getBarData().setBarWidth(barWidth);
    barChart.getXAxis().setAxisMinimum( 0 );
    barChart.getXAxis().setAxisMaximum(0 + 
    barChart.getBarData().getGroupWidth(groupSpace, barSpace) * groupCount);
    barChart.groupBars(0, groupSpace, barSpace);
    barChart.animateY(1000);
    barChart.getData().setHighlightEnabled(true);
    barChart.invalidate();

    //X-axis
    XAxis xAxis = barChart.getXAxis();
    xAxis.setGranularity(1f);
    xAxis.setGranularityEnabled(true);
    xAxis.setCenterAxisLabels(true);
    xAxis.setDrawGridLines(false);
    xAxis.setAxisMaximum(groupCount);
    xAxis.setPosition(XAxis.XAxisPosition.BOTTOM);
    xAxis.setValueFormatter(new IndexAxisValueFormatter(xVals));
    //Y-axis
    barChart.getAxisRight().setEnabled(false);
    YAxis leftAxis = barChart.getAxisLeft();
    leftAxis.setDrawGridLines(true);
    //        leftAxis.setSpaceTop(35f);
    leftAxis.setAxisMinimum(0f);

    barChart.getXAxis().setGranularityEnabled(true);
    barChart.getXAxis().setGranularity(1.0f);
    barChart.getXAxis().setLabelCount(set1.getEntryCount());