【问题标题】:Problems with MPAndroidChart configuration. Xaxis, bar backgroundMPAndroidChart 配置问题。 X轴,条形背景
【发布时间】:2018-08-11 14:54:55
【问题描述】:

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

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

所以,长话短说。 我正在努力实现的目标

还有我现在拥有的。

别笑了。

所以我有三个问题:

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

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

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

【问题讨论】:

    标签: android android-layout charts views mpandroidchart


    【解决方案1】:

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

    • 同一数据集中的条之间的空间
    • 数据集之间的空间

      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 轴标签,请创建 IAxisValueFormatter 并将其设置为 x 轴的 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);
    

    【讨论】:

    • 嗨!感谢您的回复我已经尝试了您的解决方案#2,它对我的​​数据进行了分组。但不完全是我想要的分组方式。加上颜色不是,它们现在应该如何。我会附上截图,也许你可以给我一些建议。先感谢您!! prntscr.com/imlv7o
    • 要设置条形的颜色,请使用bar1Set1.setColor(Color.rgb(255, 0, 0));。我的答案已更新以反映这一点。
    • 我已经尝试了解决方案 #3。我有 5 个条形条目的列表和 5 个字符串对象的列表。我正在按照您的建议进行所有操作,但它不起作用:(
    • 好的,所以快速更新。它将数据分组为 3 个数据集。但是,您添加了一条评论,我们需要对某些公式严格以在单个栏中显示 3 个数据集。您对我如何准确显示第一篇文章中的图像中的条有任何建议吗? (第一个)。具有中等大小的条形和数据集之间的大距离。但仍然非常感谢您的帮助!
    • 这是我当前的代码:gist.github.com/Progern/f65381775ef28e5342342ccb24b3964d 这是现在屏幕上的屏幕截图:prntscr.com/io0cty
    【解决方案2】:

    您可以通过以下示例实现此目的:

        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());
    

    【讨论】:

    • 如果需要进一步的帮助,请告诉我伙计。编码快乐!
    • 嗨!感谢您的答复!作为@shuwn Yuan tee 的响应,它对具有 3 个条形的 DataSet 来说就像一个魅力。我应用错了。但我会检查她的答案是否合适,因为它是第一个。谢谢你的帮助!我真的很感激。
    猜你喜欢
    • 2014-12-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-12-13
    • 1970-01-01
    • 2013-02-26
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多