Java MPAndroidChart条形图-如何在组之间使用随机x轴间隔对条形图进行分组?

Java MPAndroidChart条形图-如何在组之间使用随机x轴间隔对条形图进行分组?,java,android,bar-chart,android-view,mpandroidchart,Java,Android,Bar Chart,Android View,Mpandroidchart,我想制作一个条形图,在每个数据点将3个不同的数据集组合在一起,如下所示: 但是,我无法使用库提供的groupbar方法将条形图分组在一起,因为无论我为条目设置了什么x值,它都会根据我在其参数中指定的间隔对条形图进行分组 例如,如果我生成一个具有条目x值{0,5,13,17…50}的数据集,并调用“groupBars”,则我的所有条目都会以1 x值的间隔进行收集,如下所示: 我想要的是将每个条分组,并且每个条在其指定的x值处可见。如果我简单地删除groupbar调用,我会得到一些类似于我想要的

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

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

例如,如果我生成一个具有条目x值{0,5,13,17…50}的数据集,并调用“groupBars”,则我的所有条目都会以1 x值的间隔进行收集,如下所示:

我想要的是将每个条分组,并且每个条在其指定的x值处可见。如果我简单地删除
groupbar
调用,我会得到一些类似于我想要的东西,但不是完全一样,因为这些条都是重叠的,如下所示:

如何在每个数据集的条形图完全可见的情况下获得与上图类似的结果?以下是生成数据集和对条形图进行分组的代码:

        ArrayList<BarEntry> happinessValues = new ArrayList<>();
        ArrayList<BarEntry> stressValues = new ArrayList<>();
        ArrayList<BarEntry> painValues = new ArrayList<>();

        for (int i = 0; i < 50; ++i) {
            happinessValues.add(new BarEntry(
                    i,
                    datapoint.getHappiness()));
            stressValues.add(new BarEntry(
                    i,
                    datapoint.getStress()));
            painValues.add(new BarEntry(
                    i,
                    datapoint.getPain()));
        }

        HappinessDataset happyDataset;

        BarDataSet stressDataset, painDataset;

            happyDataset = new HappinessDataset(happinessValues, "Happiness");

            stressDataset = new BarDataSet(stressValues, "Stress");

            painDataset = new BarDataSet(painValues, "Pain");

            BarData data = new BarData(happyDataset, stressDataset, painDataset);

            mChart.setData(data);

        mChart.getXAxis().setAxisMinimum(0);
        mChart.getXAxis().setAxisMaximum(50);


      float groupSpace = 0.4f;
        float barSpace = 0f; // x3 DataSet
        float barWidth = 0.2f; // x3 DataSet
        // (0.2 + 0) * 3 + 0.4 = 1.00 -> interval per "group"
        mChart.groupBars(startTime, groupSpace, barSpace);
ArrayList happinessValues=new ArrayList();
ArrayList stressValues=新的ArrayList();
ArrayList=新的ArrayList();
对于(int i=0;i<50;++i){
快乐价值观。添加(新巴伦特里)(
我
datapoint.getHappiness());
压力值。添加(新BarEntry(
我
datapoint.getStress());
painValues.add(新巴伦特里)(
我
datapoint.getPain());
}
快乐数据集快乐数据集;
BarDataSet压力数据集、painDataset;
happyDataset=新的HappinessDataset(happinessValues,“幸福”);
stressDataset=新的BarDataSet(stressValues,“Stress”);
painDataset=新的BarDataSet(PainValue,“疼痛”);
BarData数据=新的BarData(快乐数据集、压力数据集、痛苦数据集);
mChart.setData(数据);
mChart.getXAxis().setAxisMinimum(0);
mChart.getXAxis().setaxis最大值(50);
浮动组空间=0.4f;
浮动条空间=0f;//x3数据集
浮动条宽度=0.2f;//x3数据集
//(0.2+0)*3+0.4=1.00->每个“组”的间隔
组栏(开始时间、组空间、组空间);

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

我用这三个数据集创建了一个新的BarData类,并将条形宽度(我们称之为
bar_width
)设置为0.2(也就是说,三个条形加在一起将占用0.6个单位的空间,数据集之后将有0.4个单位的间距)

对于任何给定的条形输入,我将第一个条形放置在我想要的x值处(称之为
I
),第二个条形放置在x值
I+bar\u宽度
,第三个条形放置在
I+2*bar\u宽度
。结果是一组以我想要的任意x值为中心的3个条形条目,如下所示:

因此,在我的上述代码中,将条目的创建代码修改为:

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

我认为解决办法是使用

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

XAxis xAxis = chart.getXAxis();
xAxis.setCenterAxisLabels(true);
以便将X轴标签设置到杆组的中心


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

您遗漏的两件事是:

  • mChart.getXAxis().setaximum(0+barChart.getBarData().getGroupWidth(groupSpace,barSpace)*groupCount)

  • 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),那么

    此处,条形宽度的计算如下所示

    (条宽+条间距)*条数+组间距=1


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

    我有同样的问题,我正试图从一周内解决它。此外,我看到如果我使用“groupBars”方法,并且我有很多数据,这些条不会调整大小,但我只看到第一个条(我没有概述),如果你找到解决方案,你能分享一下吗?如果我找到了,我也会这么做one@GracePii请参阅我发布的解决方案,但如何对齐x轴标签?他们不是有点左对齐吗?嗨@sudesh,你能回答我关于XAxis标签问题的悬赏问题吗?这里是问题Hi sudesh,你能帮我解决这个条形图问题吗:
        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);
            }