2017-08-27 13 views
1

金額と日付をグラフ上に月の値として表示します。このため私はライブラリMPAndroid Chartを検索しました。グラフMPAndroidChartでデータセットを表示するには?

しかし、データセットを追加して日付を月に変換する方法を知りません。

私はこのようなグラフ表示する:

enter image description here

私は金額と日付を持つOrderオブジェクトのリストを持っています。

私はこのコードを試してみました:

totalOrdersList = new ArrayList<>(); 
     mChart = (BarChart) view.findViewById(R.id.chart); 
     // mChart.setOnChartValueSelectedListener(Dashboard2Fragment.this); 
     // mChart.setHighlightEnabled(false); 

     mChart.setDrawBarShadow(false); 

     mChart.setDrawValueAboveBar(true); 
     mChart.setBackgroundColor(ContextCompat.getColor(getActivity(),R.color.lightGrey)); 

     mChart.getDescription().setEnabled(false); 

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

     // scaling can now only be done on x- and y-axis separately 
     mChart.setPinchZoom(false); 

     // draw shadows for each bar that show the maximum value 
     // mChart.setDrawBarShadow(true); 

     mChart.setDrawGridBackground(false); 

     XAxis xl = mChart.getXAxis(); 
     xl.setPosition(XAxis.XAxisPosition.BOTTOM); 
     xl.setDrawAxisLine(true); 
     xl.setDrawGridLines(false); 
     xl.setGranularity(10f); 


     YAxis yl = mChart.getAxisLeft(); 
     yl.setDrawAxisLine(true); 
     yl.setDrawGridLines(true); 
     yl.setAxisMinimum(0f); // this replaces setStartAtZero(true) 
//  yl.setInverted(true); 

     YAxis yr = mChart.getAxisRight(); 
     yr.setDrawAxisLine(true); 
     yr.setDrawGridLines(false); 
     yr.setAxisMinimum(0f); // this replaces setStartAtZero(true) 
//  yr.setInverted(true); 

    // setData(); 
     mChart.setFitBars(true); 
     mChart.animateY(2500); 


     Legend l = mChart.getLegend(); 
     l.setVerticalAlignment(Legend.LegendVerticalAlignment.BOTTOM); 
     l.setHorizontalAlignment(Legend.LegendHorizontalAlignment.LEFT); 
     l.setOrientation(Legend.LegendOrientation.HORIZONTAL); 
     l.setDrawInside(false); 
     l.setFormSize(8f); 
     l.setXEntrySpace(4f); 




    private void setData() { 

     mChart.setScaleEnabled(false); 

     int i=0; 

     barEntries = new ArrayList<>(); 

     ArrayList<String> amountArray = new ArrayList<>(); 
     ArrayList<String> dateArray = new ArrayList<>(); 

     for(Order order : totalOrdersList) 
     { 

      amountArray.add(order.getAmount()); 
      dateArray.add(order.getDate()); 

     } 

     for (String amount : amountArray) 
     { 
      barEntries.add(new BarEntry(1,Float.parseFloat(amount))); 
     } 

     BarDataSet completed = new BarDataSet(barEntries, "Amount"); 

     completed.setValues(barEntries); 

     completed.setValueTextColor(Color.WHITE); 

     completed.setValueTextSize(12f); 

     Legend legend = new Legend(); 


     legend = mChart.getLegend(); 

     legend.setEnabled(true); 

     mChart.setEnabled(false); 
     mChart.setPinchZoom(false); 

     mChart.setHighlightPerTapEnabled(false); 
     mChart.setDrawValueAboveBar(true); 
     mChart.setDoubleTapToZoomEnabled(false); 
     mChart.setHighlightPerDragEnabled(false); 
     mChart.setDragDecelerationEnabled(false); 


     XAxis xl = mChart.getXAxis(); 
     xl.setPosition(XAxis.XAxisPosition.BOTTOM); 
     xl.setDrawAxisLine(true); 
     xl.setDrawGridLines(false); 
     xl.setDrawLabels(true); 
     xl.setTextColor(Color.WHITE); 

     mChart.setDrawGridBackground(false); 

     YAxis yl = mChart.getAxisLeft(); 
     yl.setDrawAxisLine(true); 
     yl.setDrawGridLines(false); 
     yl.setDrawLabels(true); 


     YAxis yll = mChart.getAxisRight(); 
     yll.setDrawAxisLine(false); 
     yll.setAxisLineColor(Color.WHITE); 
     yll.setDrawGridLines(false); 
     yll.setDrawLabels(false); 

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

     BarData data = new BarData(dataSets); 

     mChart.setData(data); 

     mChart.invalidate(); 


    } 

が、このようにグラフを取得:間違って何が起こっている

enter image description here

答えて

1

問題:あなたはすべてのあなたのbarEntries

for (String amount : amountArray) 
    { 
     barEntries.add(new BarEntry(1, Float.parseFloat(amount))); 
    } 

あなたは次のようにそれを変更する必要が同じインデックスに設定されている

int index = 0; 

for (String amount : amountArray) 
    { 
     barEntries.add(new BarEntry(index, Float.parseFloat(amount))); 
     index++; 
    } 

EDIT:

X軸に日付を表​​示するには、このthreadに記載されている素晴らしい例があります。別のarrayListlongに作成して、日付をミリ秒で格納することができます。

private List<Long> timestampList = new ArrayList<>(); 

for (String dateString : dateArray) { 
     try { 
      SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MMMM-dd"); 
      Date date = sdf.parse(dateString); 

      long startDate = date.getTime(); 

      Log.d("timestamp:", String.valueOf(startDate)); 

      timestampList.add(startDate); 

     } catch (ParseException e) { 
      e.printStackTrace(); 
     } 
    } 

あなたはX軸の値をフォーマットするIAxisValueFormatterインタフェースを使用する必要が月にこれらのミリ秒を表示します。あなたは

xl.setGranularity(1f); //So that the X-Axis values become 0, 1, 2, and so on...to query the timestampList() index 
xl.setValueFormatter(formatter); 

getFormattedValueは、すべてのX軸値のために呼び出されます呼び出すことができるX軸の値を設定するために最後に

//Interface to get custom values for X-axis 
    IAxisValueFormatter formatter = new IAxisValueFormatter() { 
     @Override 
     public String getFormattedValue(float value, AxisBase axis) { 
      Calendar calendar = Calendar.getInstance(); 
      calendar.setTimeInMillis(timestampList.get((int) value)); 
      int month = calendar.get(Calendar.MONTH); 
      calendar.set(Calendar.MONTH, month); 
      return new SimpleDateFormat("MMM").format(calendar.getTime());   } 
    }; 

、その後、次のことができます。あなたは自分の価値観をフォーマットするには、以下のようなものを使用することができますそれに応じて月を得る。

+0

x軸に日付を追加するには?今私はx軸とy軸の量を取得しています。 – Sid

+0

上記のIAxisValueFormatterを使用してください –

+0

日付はtotalOrderListから取得してx軸に表示するのに必要な乱数ではありません。 – Sid

関連する問題