2017-08-31 4 views
1

Ich muss ein Diagramm erstellen, das Zeit entlang der X-Achse und einen Bereich entlang der Y-Achse hat. Das Programm zeichnet Daten über eine bestimmte Zeitdifferenz für eine Aktivität auf und zeigt die Daten in einem Diagramm an, etwa so ->https://i.stack.imgur.com/s4MiC.png, wobei aber jeder andere Balken alternierende Farben hätte, die einer separaten Aktivität entsprechen. Ich konnte mit MPAndroidChart noch keinen Weg finden, dies zu tun, jeder Eintrag scheint eine feste Breite zu haben. Wenn jemand weiß, wie dies mit MPAndroidChart oder einer anderen Open-Source-Bibliothek erreicht werden kann, wäre die Hilfe dankbar, danke!MPAndroidChart Balkendiagramm mit verschiedenen Balkenbreiten

EDIT:

Dies ist der Code, den ich versucht habe, mit zu arbeiten:

protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_data_report); 

    BarChart barChart = (BarChart) findViewById(R.id.barChart); 
    List<BarEntry> entries = generateBarEntries(); 
    BarDataSet set = new BarDataSet(entries, "BarDataSet"); 
    BarData data = new BarData(set); 
    barChart.setData(data); 
} 

private List<BarEntry> generateBarEntries() { 
    List<BarEntry> entries = new ArrayList<>(); 
    for (int i = 0; i < timeValues.size(); i++) { 
     float x = timeValues.get(i); 
     float y = areaValues.get(i); 
     entries.add(new BarEntry(x, y)); 
    } 
    return entries; 
} 

timeValues ​​ist eine Arraylist mit Werten in Sekunden wie [3, 9, 21, 26, 33 ] und areaValues ​​ist auch eine ArrayList mit der gleichen Größe wie timeValues, wobei jeder Wert vorerst 30 ist (dh [30, 30, 30, 30, 30]).

+0

Bitte schreiben Sie Code von dem, was Sie bisher versucht haben. – petryuno1

+0

@ petryuno1 siehe editierten Beitrag –

Antwort

2

Okay, also habe ich herausgefunden, wie das geht. Anstatt ein Balkendiagramm zu erstellen, habe ich gerade ein Liniendiagramm mit horizontalen Linien erstellt und den Bereich unter jeder Linie ausgefüllt.

LineChart timeChart = (LineChart) findViewById(R.id.timeChart); 
List<ILineDataSet> dataSets = generateLineData(); 
LineData data = new LineData(dataSets); 
timeChart.setData(data); 
timeChart.invalidate(); 

private List<ILineDataSet> generateLineData() { 
    List<ILineDataSet> dataSets = new ArrayList<>(); 
    for (int i = 0; i < areaValues.size(); i++) { 
     List<Entry> barPoints = new ArrayList<>(); 
     Entry barPoint1; 
     Entry barPoint2; 
     LineDataSet dataSet; 
     if (areaValues.get(i) >= 0) { 
      barPoint1 = new Entry(timeValues.get(i), areaValues.get(i)); 
      barPoint2 = new Entry(timeValues.get(i+1), areaValues.get(i)); 
      barPoints.add(barPoint1); 
      barPoints.add(barPoint2); 
      dataSet = new LineDataSet(barPoints, ""); 
      dataSet.setColor(getResources().getColor(R.color.green)); 
      dataSet.setFillDrawable(ContextCompat.getDrawable(this, R.color.green)); 
     } 
     dataSet.setDrawCircles(false); 
     dataSet.setDrawFilled(true); 
     dataSet.setDrawValues(false); 
     dataSets.add(dataSet); 
    } 
    return dataSets; 
} 

Funktioniert fantastisch.

+0

Können Sie mir bitte eine Probe für Ihre ** AreaValues ​​** und ** timeValues ​​**? –

+0

Danke ........... –

+0

@RahulSharma die AreaValues ​​wurden nur zufällig Zahlen für meinen Zweck generiert. Und die timeValues ​​müssen nur jedes mal erhöht werden und timeValues ​​sollten immer einen weiteren Eintrag als areaValues ​​haben. Ein Beispieleintrag könnte sein: timeValues ​​= [0, 12, 15, 19, 33] areaValues ​​= [20, 9, 12, 16] –

0

Sample, what i did

Es gibt keine einfache Möglichkeit, dies zu erreichen. Sie müssen im Quelltext von BARCHART in MPAndroidChart suchen und eine Klasse namens BarBuffer finden. Es gibt eine Methode namens addBar(). Dort können Sie die Balkenbreiten ändern. In meinem Beispiel habe ich noch 24 separate Balken, aber wenn Sie die Breite ändern, können Sie es wie große Blöcke aussehen lassen.

protected void addBar(float left, float top, float right, float bottom) { 

    buffer[index++] = left; 
    buffer[index++] = top; 
    buffer[index++] = right; 
    buffer[index++] = bottom; 
} 
Verwandte Themen