2016-02-06 1 views
12

Как сравнить два набора данных с помощью BarChart из MPAndroidChart.Как создать BarChart с сгруппированными барами с MPAndroidChart?

Это должно выглядеть ниже этой картинки: enter image description here

Я редактировал код, я получаю от проекта образца в GitHub. как я могу собрать 100f and 110f значение в одном Xaxis этикетке Whole Number

 Score score1 = new Score(100f, 0, "Whole Number"); 
     mRealm.copyToRealm(score1); 
     Score score2 = new Score(110f, 0, "Whole Number"); 
     mRealm.copyToRealm(score2); 

ответ

13

Да, это можно сделать довольно легко.

Что вам нужно, это BarChart с несколькими BarDataSets, где каждый комплект (в вашем случае) представляет собой один секс (мужчины или женщины).

Пример кода (без realm.io)

List<String> xValues = ...; // "Denmark", "Finland", ... 

    XAxis xAxis = chart.getXAxis(); 
    xAxis.setValueFormatter(new MyValueFormatter(xValues)); 

    // create 2 datasets 
    BarDataSet set1 = new BarDataSet(valuesMen, "Men"); 
    set1.setColor(Color.BLUE); 
    BarDataSet set2 = new BarDataSet(valuesWomen, "Women"); 
    set2.setColor(Color.RED); 

    BarData data = new BarData(set1, set2); 
    chart.setData(data); 
    chart.groupBars(...); // available since release v3.0.0 
    chart.invalidate(); // refresh 

Если вам нужна дополнительная помощь, здесь a detailed tutorial по сгруппированным BarChart доступны на wiki.

Если вы хотите «стек» значения в BarChart друг над другом, необходимо создать сложенных шкальный: Android Stacked Bars Chart

+2

Phillipp конструктор BarData изменился! Вам необходимо обновить свой код! – lidox

8

Так произошло обновление BarData конструктора необходимо использовать следующий код:

 BarChart barChart = (BarChart) view.findViewById(R.id.chart); 

     barChart.setDrawBarShadow(false); 
     barChart.setDrawValueAboveBar(true); 
     barChart.setDescription(""); 
     barChart.setMaxVisibleValueCount(50); 
     barChart.setPinchZoom(false); 
     barChart.setDrawGridBackground(false); 

     XAxis xl = barChart.getXAxis(); 
     xl.setGranularity(1f); 
     xl.setCenterAxisLabels(true); 
     xl.setValueFormatter(new AxisValueFormatter() { 
      @Override 
      public String getFormattedValue(float value, AxisBase axis) { 
       return String.valueOf((int) value); 
      } 

      @Override 
      public int getDecimalDigits() { 
       return 0; 
      } 
     }); 

     YAxis leftAxis = barChart.getAxisLeft(); 
     leftAxis.setValueFormatter(new AxisValueFormatter() { 
      @Override 
      public String getFormattedValue(float value, AxisBase axis) { 
       return String.valueOf((int) value); 
      } 

      @Override 
      public int getDecimalDigits() { 
       return 0; 
      } 
     }); 
     leftAxis.setDrawGridLines(false); 
     leftAxis.setSpaceTop(30f); 
     leftAxis.setAxisMinValue(0f); // this replaces setStartAtZero(true 
     barChart.getAxisRight().setEnabled(false); 

     //data 
     float groupSpace = 0.04f; 
     float barSpace = 0.02f; // x2 dataset 
     float barWidth = 0.46f; // x2 dataset 
     // (0.46 + 0.02) * 2 + 0.04 = 1.00 -> interval per "group" 

     int startYear = 1980; 
     int endYear = 1985; 


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


     BarDataSet set1, set2; 

     if (barChart.getData() != null && barChart.getData().getDataSetCount() > 0) { 
      set1 = (BarDataSet)barChart.getData().getDataSetByIndex(0); 
      set2 = (BarDataSet)barChart.getData().getDataSetByIndex(1); 
      set1.setValues(yVals1); 
      set2.setValues(yVals2); 
      barChart.getData().notifyDataChanged(); 
      barChart.notifyDataSetChanged(); 
     } else { 
      // create 2 datasets with different types 
      set1 = new BarDataSet(yVals1, "Company A"); 
      set1.setColor(Color.rgb(104, 241, 175)); 
      set2 = new BarDataSet(yVals2, "Company B"); 
      set2.setColor(Color.rgb(164, 228, 251)); 

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

      BarData data = new BarData(dataSets); 
      barChart.setData(data); 
     } 

     barChart.getBarData().setBarWidth(barWidth); 
     barChart.getXAxis().setAxisMinValue(startYear); 
     barChart.groupBars(startYear, groupSpace, barSpace); 
     barChart.invalidate(); 

Вот как это будет выглядеть Result

+0

Привет, лидокс, спасибо за ваш ответ. вы спасли мне много дней. Можете ли вы помочь мне с ярлыками. как я могу установить метки в центре, как это происходит в вашем графическом изображении. Мои ярлыки начинаются с индекса 0 и не идут посередине. Заранее спасибо. – Devraj

2
  • этапы с 1 Разделите первое число групп в гистограмме. Как показано ниже пример кода для 5 групп. В каждой группе есть 5 баров.

      xaxis0 = new ArrayList<>(); 
          for (int i = 0; i < cData.size(); i++) { 
    
           String str = cData.get(i).get("count"); 
           str = str.replaceAll("\\[", "").replaceAll("\\]", ""); 
           String[] finalString = str.split(","); 
           if (i == 0) { 
            for (int k = 0; k < finalString.length; k++) { 
    
             int data22 = Integer.parseInt(finalString[k]); 
             BarEntry v1e1 = new BarEntry(data22, position); 
             valueSet1.add(v1e1); 
            } 
           } 
           if (i == 1) { 
            for (int k = 0; k < finalString.length; k++) { 
             int data22 = Integer.parseInt(finalString[k] + ""); 
             BarEntry v1e1 = new BarEntry(data22, position); 
             valueSet2.add(v1e1); 
            } 
           } 
           if (i == 2) { 
            for (int k = 0; k < finalString.length; k++) { 
             int data22 = Integer.parseInt(finalString[k] + ""); 
             BarEntry v1e1 = new BarEntry(data22, position); 
             valueSet3.add(v1e1); 
            } 
           } 
           if (i == 3) { 
            for (int k = 0; k < finalString.length; k++) { 
             int data22 = Integer.parseInt(finalString[k] + ""); 
             BarEntry v1e1 = new BarEntry(data22, position); 
             valueSet4.add(v1e1); 
            } 
           } 
           if (i == 4) { 
            for (int k = 0; k < finalString.length; k++) { 
             int data22 = Integer.parseInt(finalString[k] + ""); 
             BarEntry v1e1 = new BarEntry(data22, position); 
             valueSet5.add(v1e1); 
            } 
           } 
           xaxis0.add(i, xdata.get(i).get("date")); 
    
  • Step2 В коде выше вы замечаете, что 5 групп данных входа бар загрузки в цикле каждого valueset - ArrayList valueSet2 = новый ArrayList <>(); Initialize перед этим valuesets и

  • Step3 И нагрузка, 5 комплектов для Bardataset, как показано ниже

    `BarDataSet barDataSet1 = новый BarDataSet (valueSet1, "Set1"); barDataSet1.setColors (whitecolors); barDataSet1.setValueTextColor (Color.WHITE);

    BarDataSet barDataSet2 = новый BarDataSet (значениеSet2, "Set2"); barDataSet2.setColors (whitecolors); barDataSet2.setValueTextColor (Color.WHITE);

    BarDataSet barDataSet3 = новый BarDataSet (значениеSet3, «Set3»); балкаDataSet3.setColors (whitecolors);

    barDataSet3.setValueTextColor (Color.WHITE); BarDataSet barDataSet4 = новый BarDataSet (valueSet4, "Set4");

    barDataSet4.setColors (whitecolors); barDataSet4.setValueTextColor (Color.WHITE);

    BarDataSet barDataSet5 = новый BarDataSet (значениеSet5, "Set5"); barDataSet5.setColors (whitecolors);

    barDataSet5.setValueTextColor (Color.WHITE); dataSets = new ArrayList <>(); dataSets.add (barDataSet1); dataSets.add (barDataSet2); dataSets.add (barDataSet3); dataSets.add (barDataSet4); dataSets.add (barDataSet5); `

  • Последний шаг нужно прикрепленным к этим данным, как Bardata ниже кода

BarData Данные11 = новые BarData (xaxis0, DataSets); data11.setGroupSpace (100f);

   holder.chart.setData(data11); 

       XAxis xAxis = holder.chart.getXAxis(); 

       xAxis.setPosition(XAxis.XAxisPosition.BOTTOM); 

       xAxis.setDrawGridLines(true); 

xAxis.setGridColor (context.getResources() GetColor (R.color.white).);

   xAxis.isDrawLabelsEnabled();  

xAxis.setAxisLineColor (context.getResources() GetColor (R.color.accentColor).); xAxis.setTextColor (context.getResources(). GetColor (R.color.white));

   xAxis.isAdjustXLabelsEnabled(); 

       xAxis.setAdjustXLabels(true); 

       holder.chart.setDescription(""); 

       holder.chart.animateXY(2000, 2000); 
holder.chart.getAxisLeft().setTextColor(context.getResources().getColor(R.color.white)); 
       holder.chart.getAxisRight().setTextColor(context.getResources().getColor(R.color.white)); 
       holder.chart.setDrawGridBackground(false); 
       holder.chart.getAxisRight().setEnabled(false); 
       holder.chart.setDrawValueAboveBar(true); 
       holder.chart.getAxisLeft().setEnabled(false); 
       holder.chart.setSoundEffectsEnabled(true); 
       holder.chart.getXAxis().setDrawGridLines(false); 
       holder.chart.setTransitionGroup(true); 
       YAxis yAxis = holder.chart.getAxisLeft(); 
       yAxis.setDrawGridLines(false); 
       yAxis.setLabelCount(5); 
       yAxis = holder.chart.getAxisRight(); 
       yAxis.setDrawGridLines(false); 
       yAxis.setTextColor(context.getResources().getColor(R.color.white)); 
       Legend l = holder.chart.getLegend(); 
       l.setEnabled(false);  
       Paint p = holder.chart.getPaint(Chart.PAINT_INFO); 
       p.setTextSize(10); 
       p.setColor(context.getResources().getColor(R.color.white)); 
       p.setTypeface(gotham); 
       holder.chart.invalidate(); 
       l.setPosition(Legend.LegendPosition.BELOW_CHART_CENTER); 
       l.setTextSize(200); 
       yAxis.setValueFormatter(new LargeValueFormatter()); 

    # Thats it if you have doubt about this code ask me any time .......