Постройте несколько диаграмм в одной в MPAndroidChart

Мне нужно построить два разных набора данных на одном графике.

Набор данных-1

    String[] xAxisOne = new String[] {
            "0", "1", "2", "3", "4", "5", "6"
    };

    float[] dataInput = {
            1f, 2f, 3f, 4f, 5f, 6f, 7f
    };

Набор данных-2

    String[] xAxisTwo = new String[] {
            "0", "2", "4", "5", "6", "8", "9"
    };

    float[] dataIn = {
            3f, 4f, 5f, 6f, 7f, 8f, 9f
    };

В приведенных выше данных DataSet-1 является ссылкой, по которой создается график. Набор данных-2 должен быть построен в том же виде с другим набором X-значений {xAxisTwo}.

В существующей реализации первые 6 значений {dataInput} наносятся на график, а следующие 6 значений {dataIn} наносятся на график со ссылкой на xAxisOne, как построить график по мере необходимости.


person VenomVendor    schedule 11.11.2014    source источник


Ответы (3)


Вы можете сделать это с помощью LineChart и унификации xAxis и игнорирования «нулевой» точки для каждого набора данных. См. код ниже:

//float[] dataInput = {
//      1f, 2f, 3f, 4f, 5f, 6f, 7f
//};

//values for datainput Dataset1 at your axisone positions
ArrayList<Entry> dataset1 = new ArrayList<Entry>();
dataset1.add(new Entry(1f, 0));
dataset1.add(new Entry(2f, 1));
dataset1.add(new Entry(3f, 2));
dataset1.add(new Entry(4f, 3));
dataset1.add(new Entry(5f, 4));
dataset1.add(new Entry(6f, 5));
dataset1.add(new Entry(7f, 6));

//float[] dataIn = {
//      3f, 4f, 5f, 6f, 7f, 8f, 9f
//};

//values for datainput Dataset2 at your axisone positions
ArrayList<Entry> dataset2 = new ArrayList<Entry>();
dataset2.add(new Entry(3f, 0));
dataset2.add(new Entry(4f, 2));
dataset2.add(new Entry(5f, 4));
dataset2.add(new Entry(6f, 5));
dataset2.add(new Entry(7f, 6));
dataset2.add(new Entry(8f, 7));
dataset2.add(new Entry(9f, 8));

//String[] xAxisOne = new String[] {
//      "0", "1", "2", "3", "4", "5", "6"
//};

///String[] xAxisTwo = new String[] {
///     "0", "2", "4", "5", "6", "8", "9"
///};


// Union from xAxisOne and xAxisTwo
String[] xAxis = new String[] {"0", "1", "2", "3", "4", "5", "6", "8", "9"};


ArrayList<LineDataSet> lines = new ArrayList<LineDataSet> ();

LineDataSet lDataSet1 = new LineDataSet(dataset1, "DataSet1");
lDataSet1.setColor(Color.RED);
lDataSet1.setCircleColor(Color.RED);
lines.add(lDataSet1);
lines.add(new LineDataSet(dataset2, "DataSet2"));

LineChart chart = (LineChart) getView().findViewById(R.id.chart);
chart.setData(new LineData(xAxis, lines));

Конечным результатом будет:

Окончательный график

Похоже, что красная линия набора данных1 имеет на 2 точки больше, чем синяя линия. Если в наборе данных1 есть только эти две точки (в позициях 1 и 3), например:

ArrayList<Entry> dataset1 = new ArrayList<Entry>();
    dataset1.add(new Entry(2f, 1));
    dataset1.add(new Entry(4f, 3));

это будет результат:

введите описание изображения здесь

person Guilherme Muniz    schedule 07.08.2015
comment
получение проблемы varargs mismatch; String[] cannot be converted to ILineDataSet - person Faisal Shaikh; 22.03.2019

вы можете использовать эту линейную диаграмму, передавая несколько наборов данных

LineChart lineChart1 = (LineChart) findViewById(R.id.chart1);

    ArrayList<Entry> entries = new ArrayList<>();
    entries.add(new Entry(4f, 0));
    entries.add(new Entry(8f, 1));
    entries.add(new Entry(6f, 2));
    entries.add(new Entry(10f, 3));
    entries.add(new Entry(18f, 4));
    entries.add(new Entry(9f, 5));

    ArrayList<Entry> entry = new ArrayList<>();
    entry.add(new Entry(3f, 0));
    entry.add(new Entry(10f, 1));
    entry.add(new Entry(4f, 2));
    entry.add(new Entry(14f, 3));
    entry.add(new Entry(12f, 4));
    entry.add(new Entry(5f, 5));
    ArrayList<LineDataSet> lines = new ArrayList<LineDataSet> ();
    String[] xAxis = new String[] {"1", "2", "3", "4", "5","6"};
    LineDataSet lDataSet1 = new LineDataSet(entries, "DataSet1");
    lDataSet1.setDrawFilled(true);
    lines.add(lDataSet1);

    LineDataSet lDataSet2 = new LineDataSet(entry, "DataSet2");
    lDataSet2.setDrawFilled(true);
    lines.add(lDataSet2);

    lineChart1.setData(new LineData(xAxis, lines));
    lineChart1.animateY(5000);
}
person Krishna Mohan Singh    schedule 23.08.2016
comment
Можно ли сделать это на одной строке с разным цветом заливки? - person hpAndro; 30.11.2017
comment
@hpAndro set1.setColor(Color.RED); - person Ashif; 12.07.2021

Что ж, для версии 3 потребуется обновление:

Для нескольких строк вам потребуется несколько наборов данных. Предположим, вы создали два набора данных.

LineDataSet dataSetReported = new LineDataSet(entriesReported, "Reported");
LineDataSet dataSetCalculated = new LineDataSet(entriesCalculated, "Calculated");

Вам понадобится список ILINEDATASET для размещения обоих созданных наборов данных. Просто создайте список и добавьте наборы данных.

List<ILineDataSet> lines = new ArrayList<ILineDataSet>();
lines.add(dataSetReported);
lines.add(dataSetCalculated);

Отобразите это на графике как:

LineData data = new LineData(lines);
chart.setData(data);
chart.invalidate();

См. здесь документацию от оригинального автора.

person Angad Cheema    schedule 22.07.2021