2016-11-10 7 views
2

Мне нужно нарисовать «закрытую схему» в моем Android приложение, как это:MPAndroidChart: Создание замкнутого графика (линия диаграммы круговой)

a line chart that forms a rough circle

xIndex данных сначала увеличивается, а затем уменьшается. Как и в этом примере:

[3,3],[4,4],[5,5],[6,4],[7,3],[6,2],[5,1],[4,2],[3,3] 

Когда я пытаюсь рисовать LineСhart с этими данными в MPAndroidChart, он делает только первую половину данных (до падения xIndex). Другие данные не отображаются.

Как я могу правильно нарисовать эти данные с помощью MPAndroidChart?

ответ

1

sample app on the Google Play Store дает пример любого вида диаграммы, доступной в библиотеке. Аналогичным образом, вы можете осмотреть source code и посмотреть, есть ли у него функция.

Кроме того, the wiki конкретно указывает, что записи в неупорядоченной строке не поддерживаются.

Обратите внимание, что эта библиотека официально не поддерживает рисование данных LineChart из списка записей, не отсортированных по положению позиций по возрастанию.

При этом, если вы готовы предварительно обработать свои данные, вы сможете достичь того, чего хотите. Вам нужно будет взять ваши данные и извлечь два разных набора данных, к которым вы будете применять один и тот же стиль. Я был в состоянии достичь чего-то подобного эффекта, который вы хотите использовать эту технику:

a "closed chart" in blue

Вот код:

import android.graphics.Color; 
import android.os.Bundle; 
import android.support.annotation.NonNull; 
import android.view.Menu; 
import android.view.WindowManager; 
import android.widget.SeekBar; 
import android.widget.TextView; 

import com.github.mikephil.charting.charts.LineChart; 
import com.github.mikephil.charting.components.Legend; 
import com.github.mikephil.charting.components.Legend.LegendForm; 
import com.github.mikephil.charting.components.XAxis; 
import com.github.mikephil.charting.components.YAxis; 
import com.github.mikephil.charting.data.Entry; 
import com.github.mikephil.charting.data.LineData; 
import com.github.mikephil.charting.data.LineDataSet; 
import com.github.mikephil.charting.interfaces.datasets.ILineDataSet; 
import com.xxmassdeveloper.mpchartexample.notimportant.DemoBase; 

import java.util.ArrayList; 
import java.util.Random; 

public class LineChartActivity4 extends DemoBase { 

    private LineChart mChart; 
    private Random rand; 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     rand = new Random(); 
     getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN, 
       WindowManager.LayoutParams.FLAG_FULLSCREEN); 
     setContentView(R.layout.activity_linechart); 

     mChart = (LineChart) findViewById(R.id.chart1); 
     mChart.setDrawGridBackground(false); 
     mChart.getDescription().setEnabled(false); 
     mChart.setTouchEnabled(true); 
     mChart.setScaleXEnabled(true); 
     mChart.setScaleYEnabled(true); 
     mChart.setPinchZoom(true); 
     mChart.getLegend().setEnabled(false); 
     YAxis leftAxis = mChart.getAxisLeft(); 
     leftAxis.removeAllLimitLines(); // reset all limit lines to avoid overlapping lines 
     leftAxis.enableGridDashedLine(10f, 10f, 0f); 
     leftAxis.setDrawZeroLine(false); 
     leftAxis.setDrawLimitLinesBehindData(true); 
     mChart.getAxisRight().setEnabled(true); 
     mChart.setDragOffsetX(20); 
     mChart.setData(generateClosedData(90, 180, 15)); 
     mChart.animateX(2500); 
    } 

    private LineData generateClosedData(float offset, float range, float delta) { 
     ArrayList<Entry> topEntries = new ArrayList<>(); 
     ArrayList<Entry> bottomEntries = new ArrayList<>(); 

     for (int x = 0; x <= 180; x++) { 
      float val1 = offset + generateValue(x, range, delta); 
      float val2 = offset - generateValue(x, range, delta); 
      topEntries.add(new Entry(x, val1)); 
      bottomEntries.add(new Entry(x, val2)); 
     } 

     LineDataSet set1 = generateLineDataSet(topEntries); 
     LineDataSet set2 = generateLineDataSet(bottomEntries); 

     ArrayList<ILineDataSet> dataSets = new ArrayList<>(); 
     dataSets.add(set1); 
     dataSets.add(set2); 
     LineData data = new LineData(dataSets); 
     return data; 
    } 

    private float generateValue(int x, float range, float delta) { 
     float sine = (float) Math.sin(Math.toRadians(x)); 
     float scaledSine = sine * range; 
     if (x == 0 || x == 180) { 
      return scaledSine; 
     } 
     else { 
      return scaledSine + rand.nextFloat() * delta; 
     } 
    } 

    @NonNull 
    private LineDataSet generateLineDataSet(ArrayList<Entry> topEntries) { 
     LineDataSet set; 
     set = new LineDataSet(topEntries, ""); 
     set.setColor(Color.BLUE); 
     set.setDrawCircles(false); 
     set.setLineWidth(4f); 
     set.setValueTextSize(9f); 
     set.setFormSize(15.f); 
     return set; 
    } 

    @Override 
    public boolean onCreateOptionsMenu(Menu menu) { 
     getMenuInflater().inflate(R.menu.line, menu); 
     return true; 
    } 
} 
+1

я решил таким же образом, но я подумал, что это правильно решение. Спасибо за ответ – gearquicker

+0

@gearquicker не волнуйтесь - ваше решение правильно! –