Метки MP Chart часто повторяются и не позволяют создавать группы

Я использую библиотеку Android MPChart для отображения нескольких полос в группе, но у меня возникает проблема с повторением некоторых меток в x-axis. я пробовал с

  ValueFormatter xAxisFormatter = new DayAxisValueFormatter(chart, array);
    XAxis xAxis = chart.getXAxis();
    xAxis.setCenterAxisLabels(true);//To align Center
    xAxis.setGranularity(1f); // only intervals of 1 day
    xAxis.setGranularityEnabled(false); // To remove duplicate values
    xAxis.setPosition(XAxis.XAxisPosition.BOTTOM);
    xAxis.setDrawGridLines(false);
    xAxis.setLabelCount(dayDataList.size(), true);

Но я не уверен, почему я получаю неправильные значения при использовании

   xAxis.setValueFormatter(new IAxisValueFormatter() {
        @Override
        public String getFormattedValue(float value, AxisBase axis) {
            Log.e("TAG_VALUE", " is "+(int)value);
            return xAxisLabel.get((int) value);
        }
    });

Метки MP Chart часто повторяются и не позволяют создавать группы

Здесь я добавляю полный исходный код, который показывает, как я добавляю данные

private void initializeView() {
    chart.setOnChartValueSelectedListener(this);
    chart.setDrawBarShadow(false);

    //Hide/Display texts over bars
    chart.setDrawValueAboveBar(false);

    chart.getDescription().setEnabled(false);

    // if more than 60 entries are displayed in the chart, no values will be
    // drawn
    chart.setMaxVisibleValueCount(60);

    chart.setDrawGridBackground(false);
    chart.setScaleEnabled(false);

    String[] array = null;
    final ArrayList<String> xAxisLabel = new ArrayList<>();

    //X-Axis for 24hours data
    if (dayDataList != null && dayDataList.size() > 0) {
        //TODO : Static Array
        array = new String[]{"1","2","3", "4","5", "6","7" ,"8","9", "10", "11","12", "13","14",
                "15","16", "17","18", "19","20","21", "22","23", "24"};

        for (int i = 1; i <= 24; i++) {
            xAxisLabel.add(String.valueOf(i));
        }
    }


    //X-axis
    ValueFormatter xAxisFormatter = new DayAxisValueFormatter(chart, array);
    XAxis xAxis = chart.getXAxis();
    xAxis.setCenterAxisLabels(true);//To align Center
    xAxis.setGranularity(1f); // only intervals of 1 day
    xAxis.setGranularityEnabled(false); // To remove duplicate values
    xAxis.setPosition(XAxis.XAxisPosition.BOTTOM);
    xAxis.setDrawGridLines(false);
    xAxis.setLabelCount(dayDataList.size(), true);
    xAxis.setValueFormatter(new IAxisValueFormatter() {
        @Override
        public String getFormattedValue(float value, AxisBase axis) {
            Log.e("TAG_VALUE", " is "+(int)value);
            return xAxisLabel.get((int) value);
        }
    });


    //Left Side Y-axis
    ValueFormatter custom = new MyValueFormatter("$");
    YAxis leftAxis = chart.getAxisLeft();
    leftAxis.setLabelCount(8, false);
    leftAxis.setValueFormatter(custom);
    leftAxis.setPosition(YAxis.YAxisLabelPosition.OUTSIDE_CHART);
    leftAxis.setSpaceTop(15f);
    leftAxis.setAxisMinimum(0f); // this replaces setStartAtZero(true)

    //Right side Y-axis
    YAxis rightAxis = chart.getAxisRight();
    rightAxis.setDrawGridLines(false);
    rightAxis.setLabelCount(8, false);
    rightAxis.setValueFormatter(custom);
    rightAxis.setSpaceTop(15f);
    rightAxis.setAxisMinimum(0f); // this replaces setStartAtZero(true)

    //To hide/Display Y axis labels
    rightAxis.setEnabled(false);
    leftAxis.setEnabled(false);

    Legend l = chart.getLegend();
    l.setVerticalAlignment(Legend.LegendVerticalAlignment.BOTTOM);
    l.setHorizontalAlignment(Legend.LegendHorizontalAlignment.LEFT);
    l.setOrientation(Legend.LegendOrientation.HORIZONTAL);
    l.setDrawInside(false);
    l.setForm(Legend.LegendForm.SQUARE);
    l.setFormSize(9f);
    l.setTextSize(11f);
    l.setMaxSizePercent(1f);
    l.setXEntrySpace(4f);

    XYMarkerView mv = new XYMarkerView(getActivity(), xAxisFormatter);
    mv.setChartView(chart); // For bounds control
    chart.setMarker(mv); // Set the marker to the chart

    //Set Data
    setData();
    chart.invalidate();
    chart.setGridBackgroundColor(Color.rgb(234, 244, 255));//Set as a black
    chart.setDrawGridBackground(true);//set this to true to draw the grid background, false if not
}


private void setData() {

    int startYear = 1980;
    int endYear = startYear +24;

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

    /*for (int i = startYear; i < endYear; i++) {
        yVals1.add(new BarEntry(i, 0.4f));
    }
    for (int i = startYear; i < endYear; i++) {
        yVals2.add(new BarEntry(i, 0.7f));
    }*/


    ArrayList<BarEntry> values1 = new ArrayList<>();
    ArrayList<BarEntry> values2 = new ArrayList<>();

    if (dayDataList != null && dayDataList.size() > 0) {

        for (int i = 0; i < dayDataList.size(); i++) {
            values1.add(new BarEntry(i, (dayDataList.get(i).getDownloadedData()).floatValue()));
            values2.add(new BarEntry(i, (dayDataList.get(i).getUploadedData()).floatValue()));
        }

    }

    BarDataSet set1, set2;
    if (chart.getData() != null && chart.getData().getDataSetCount() > 0) {

        set1 = (BarDataSet) chart.getData().getDataSetByIndex(0);
        set2 = (BarDataSet) chart.getData().getDataSetByIndex(1);

        set1.setValues(values1);
        set2.setValues(values2);

        set1.setValues(yVals1);
        set2.setValues(yVals2);
        chart.getData().notifyDataChanged();
        chart.notifyDataSetChanged();

    } else {
        // create 2 DataSets
        set1 = new BarDataSet(values1, "Company A");
        set1.setColor(Color.rgb(104, 241, 175));
        set2 = new BarDataSet(values2, "Company B");
        set2.setColor(Color.rgb(164, 228, 251));

        BarData data = new BarData(set1, set2);
        data.setValueFormatter(new LargeValueFormatter());
        chart.setData(data);
    }

    set1.setDrawIcons(false);
    set1.setDrawValues(false);//TODO: To hide/show text above bars

    set2.setDrawIcons(false);
    set2.setDrawValues(false);

    int startColor = ContextCompat.getColor(getActivity(), R.color.colorPrimary);
    int endColor = ContextCompat.getColor(getActivity(), R.color.colorPrimaryDark);
    set1.setGradientColor(startColor, endColor);

    int set2StartColor = ContextCompat.getColor(getActivity(), R.color.colorOrange);
    int set2EndColor = ContextCompat.getColor(getActivity(), R.color.colorRedWifi);
    set2.setGradientColor(set2StartColor, set2EndColor);

    ArrayList<IBarDataSet> dataSets = new ArrayList<>();
    dataSets.add(set1);
    dataSets.add(set2);

    BarData data = new BarData(dataSets);
    data.setValueTextSize(10f);
    data.setBarWidth(0.4f);
    chart.getLegend().setEnabled(false);
    chart.setData(data);
    chart.setEnabled(true);

    float barSpace = 0.02f;
    float groupSpace = 0.1f;
    int groupCount = dayDataList.size();

    data.setBarWidth(0.15f);
    chart.getXAxis().setAxisMinimum(0);
    chart.getXAxis().setAxisMaximum(0 + chart.getBarData().getGroupWidth(groupSpace, barSpace) * groupCount);
    chart.groupBars(0, groupSpace, barSpace);
   }

Надеюсь, кто-то может помочь мне в этом.

Можете ли вы поделиться, как вы установили свои данные?

Robert LaFondue 09.04.2019 16:59

@RobertLaFondue, пожалуйста, проверьте сейчас.

Anshul Tyagi 10.04.2019 10:51
0
2
548
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Первое, что я вижу, это то, что вы изменяете диаграмму после вызова Invalidate(), теперь вы должны, чтобы Invalidate() разрешил обновить диаграмму, любые изменения после этого не будут применяться, лучше сделайте что-то вроде:

//Set Data
setData();
chart.setGridBackgroundColor(Color.rgb(234, 244, 255));//Set as a black
chart.setDrawGridBackground(true);//set this to true to draw the grid background, false if not
chart.invalidate();

Что касается ваших данных, я не знаю, почему вы дважды вызываете chart.setData(), вы можете сделать:

private void setData() {

    int startYear = 1980;
    int endYear = startYear +24;

   //This is not use you can remove it
   /*List<BarEntry> yVals1 = new ArrayList<BarEntry>();
    List<BarEntry> yVals2 = new ArrayList<BarEntry>();

    for (int i = startYear; i < endYear; i++) {
        yVals1.add(new BarEntry(i, 0.4f));
    }
    for (int i = startYear; i < endYear; i++) {
        yVals2.add(new BarEntry(i, 0.7f));
    }*/


    ArrayList<BarEntry> values1 = new ArrayList<>();
    ArrayList<BarEntry> values2 = new ArrayList<>();

    if (dayDataList != null && dayDataList.size() > 0) {

        for (int i = 0; i < dayDataList.size(); i++) {
            values1.add(new BarEntry(i, (dayDataList.get(i).getDownloadedData()).floatValue()));
            values2.add(new BarEntry(i, (dayDataList.get(i).getUploadedData()).floatValue()));
        }

    }

    BarDataSet set1, set2;
    if (chart.getData() != null && chart.getData().getDataSetCount() > 0) {

        set1 = (BarDataSet) chart.getData().getDataSetByIndex(0);
        set2 = (BarDataSet) chart.getData().getDataSetByIndex(1);

        set1.setValues(values1);
        set2.setValues(values2);

        //set1.setValues(yVals1);
        //set2.setValues(yVals2);

        chart.getData().notifyDataChanged();
        chart.notifyDataSetChanged();

    } else {
        // create 2 DataSets
        set1 = new BarDataSet(values1, "Company A");
        set1.setColor(Color.rgb(104, 241, 175));
        set2 = new BarDataSet(values2, "Company B");
        set2.setColor(Color.rgb(164, 228, 251));

        //You will add your data later again, no need of this one
        /*BarData data = new BarData(set1, set2);
        data.setValueFormatter(new LargeValueFormatter());
        chart.setData(data);*/
    }

    set1.setDrawIcons(false);
    set1.setDrawValues(false);//TODO: To hide/show text above bars

    set2.setDrawIcons(false);
    set2.setDrawValues(false);

    int startColor = ContextCompat.getColor(getActivity(), R.color.colorPrimary);
    int endColor = ContextCompat.getColor(getActivity(), R.color.colorPrimaryDark);
    set1.setGradientColor(startColor, endColor);

    int set2StartColor = ContextCompat.getColor(getActivity(), R.color.colorOrange);
    int set2EndColor = ContextCompat.getColor(getActivity(), R.color.colorRedWifi);
    set2.setGradientColor(set2StartColor, set2EndColor);

    //No need of this
    /*ArrayList<IBarDataSet> dataSets = new ArrayList<>();
    dataSets.add(set1);
    dataSets.add(set2);*/

    BarData data = new BarData(set1, set2);
    data.setValueTextSize(10f);
    data.setBarWidth(0.4f);
    chart.getLegend().setEnabled(false);
    chart.setData(data);
    chart.setEnabled(true);

    float barSpace = 0.02f;
    float groupSpace = 0.1f;
    int groupCount = dayDataList.size();

    data.setBarWidth(0.15f);
    chart.groupBars(0, groupSpace, barSpace);
    chart.getXAxis().setAxisMinimum(0);
    chart.getXAxis().setAxisMaximum(groupCount);
   } 

Другие вопросы по теме