MPAndroidChart条形图 – 如何在组之间对随机x轴间隔的条形图进行分组?

我想制作一个条形图,其中3个不同的数据集在每个数据点组合在一起,如下所示:

在此处输入图像描述

但是,我无法使用库提供的groupBars方法将条形组合在一起,因为无论我为条目设置了什么x值,它都会根据我在参数中指定的间隔对条形图进行分组。

例如,如果我生成一个带有条目x值{0,5,13,​​17 … 50}并调用`groupBars’的数据集,那么我的所有条目都会被收集1 x值,如下所示:

在此处输入图像描述

我想要的是每个被分组的条形图,每个条形图在其指定的x值处可见。 如果我只是删除groupBars调用,我会得到类似于我想要的东西但不完全,因为条形图都是重叠的,如下所示:

在此处输入图像描述

如何获得与上图类似的结果,但每个数据集的条形图是否完全可见? 这是我生成数据集和分组条形码的代码:

  ArrayList happinessValues = new ArrayList(); ArrayList stressValues = new ArrayList(); ArrayList painValues = new ArrayList(); for (int i = 0; i  interval per "group" mChart.groupBars(startTime, groupSpace, barSpace); 

我通过修改每个条形条的x值和条宽来解决了这个问题。

我用三个数据集创建一个新的BarData类,并将条宽度(我们称之为BAR_WIDTH )设置为0.2(即三个条在一起将占用空间中的0.6个单位,并且在数据集之后将有0.4个单位的间距) 。

对于任何给定的条形条目,我将第一个条形图放在我想要的x值(让我们称之为i ),第二个条形图位于x值i+BAR_WIDTH ,第三个条形图位于i+2*BAR_WIDTH 。 结果是一组以我想要的任何x值为中心的3个条形条目,如下所示:

http://i.imgur.com/KrKTE45l.jpg

所以在上面的代码中,修改条形码创建代码如下:

 final float BAR_WIDTH = 0.2f; happinessValues.add(new BarEntry( i, datapoint.getHappiness())); stressValues.add(new BarEntry( i + BAR_WIDTH, datapoint.getStress())); painValues.add(new BarEntry( i + 2 * BAR_WIDTH, datapoint.getPain())); mChart.getBarData().setBarWidth(BAR_WIDTH); 

你错过的两件事是:

  1. mChart.getXAxis().setAxisMaximum(0 + barChart.getBarData().getGroupWidth(groupSpace, barSpace) * groupCount);

  2. mChart.getXAxis().setCenterAxisLabels(true);

在使用setCenterAxisLabels之前

在此处输入图像描述

将setCenterAxisLabels设置为true后

在此处输入图像描述

这是我用来将标签与每组组的中心对齐的代码片段

 float barSpace = 0.02f; float groupSpace = 0.3f; int groupCount = 4; data.setBarWidth(0.15f); barChart.getXAxis().setAxisMinimum(0); barChart.getXAxis().setAxisMaximum(0 + barChart.getBarData().getGroupWidth(groupSpace, barSpace) * groupCount); barChart.groupBars(0, groupSpace, barSpace); // perform the "explicit" grouping 

如果你不确定分组条形图的数量(这里是4)那么

  float defaultBarWidth = -1; int groupCount = xAxisValues.size(); defaultBarWidth = (1 - groupSpace)/barDataSets.size() - barSpace; if(defaultBarWidth >=0) { barData.setBarWidth(defaultBarWidth); } if(groupCount != -1) { mChart.getXAxis().setAxisMinimum(0); mChart.getXAxis().setAxisMaximum(0 + mChart.getBarData().getGroupWidth(groupSpace, barSpace) * groupCount); mChart.getXAxis().setCenterAxisLabels(true); } 

这里的条宽计算如下

(barwidth + barspace)* no of bars + groupspace = 1

所有这些空格的总和应该等于1,以使标签与分组条形图的中心对齐。

我认为解决方案是使用

 barChart.groupBars(fromX, groupSpace, barSpace); barChart.notifyDataSetChanged() 

随着

 XAxis xAxis = chart.getXAxis(); xAxis.setCenterAxisLabels(true); 

为了将X轴标签设置为条形组的中心。

有关更多详细信息,请参阅GroupedBarChart部分。