【问题标题】:How to make real-time multiple line graph?如何制作实时多折线图?
【发布时间】:2015-09-22 01:48:09
【问题描述】:

我想使用MPAndroidChart 制作实时多折线图。

只用一个数据做实时图是没有问题的。 (以下代码)

private void addEntry(int count) {
    LineData data = mChart.getData();

    if (data != null) {
        LineDataSet set = data.getDataSetByIndex(0);

        if (set == null) {
            set = createSet();
            data.addDataSet(set);
        }

        data.addXValue("");

        data.addEntry(new Entry(getPressure(), set.getEntryCount()), 0);

        data.setDrawValues(false);
        data.setHighlightEnabled(false);

        // let the chart know it's data has changed
        mChart.notifyDataSetChanged();

        // limit the number of visible entries
        mChart.setVisibleXRange(0, count);

        // move to the latest entry
        mChart.moveViewToX(data.getXValCount() - (count + 1));
    }
}

而且,使用以下代码制作多折线图也没有问题。

private void setData(int count, float range) {
    ArrayList<String> xValues = new ArrayList<String>();
    for (int i = 0 ; i < count ; i++) {
        xValues.add((1 + i) + "");
    }

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

    for (int k = 0 ; k < 3 ; k++) {
        ArrayList<Entry> yValues = new ArrayList<Entry>();

        for (int i = 0 ; i < count ; i++) {
            if (k == 0) {
                yValues.add(new Entry(getSetPressure(), i));
            }
            else if (k == 1) {
                yValues.add(new Entry(getCurrentPressure(), i));
            }
            else {
                yValues.add(new Entry(getSuctionPressure(), i));
            }
        }

        String s;
        String c;
        if (k == 0) {
            s = "Set Pressure";
            c = "#ed1f24";
        }
        else if (k == 1) {
            s = "Current Pressure";
            c = "#004bf6";
        }
        else {
            s = "Suction Pressure";
            c = "#ffba00";
        }

        LineDataSet set = new LineDataSet(yValues, s);

        set.setAxisDependency(YAxis.AxisDependency.LEFT);
        set.setDrawCubic(false);
        set.setDrawCircles(false);
        set.setCircleColor(Color.parseColor(c));
        set.setCircleSize(8f);
        set.setCircleColorHole(Color.BLACK);
        set.setDrawCircleHole(false);
        set.setLineWidth(3f);
        set.setColor(Color.parseColor(c));
        set.setDrawHorizontalHighlightIndicator(false);
        set.setDrawVerticalHighlightIndicator(false);

        dataSets.add(set);
    }

    LineData data = new LineData(xValues, dataSets);

    data.setDrawValues(false);
    data.setHighlightEnabled(false);

    mChart.setData(data);
}

但是,我不知道如何制作多个实时折线图。

如何制作多个实时折线图?

【问题讨论】:

    标签: android real-time mpandroidchart


    【解决方案1】:

    您实际上在您的问题中发布了您的问题的答案。

    这一行是关键:

    data.addEntry(... , 0);
    

    末尾的0 指定应插入条目的数据集索引。

    因此,您需要做的只是创建与您想要的行一样多的空DataSets,然后使用上述方法和正确的索引将您的Entries 添加到您想要的任何DataSet

    Here您可以找到动态和实时数据的官方 wiki 条目。

    【讨论】:

    • @Narendra 在OP的第一个代码中,有一行 data.addEntry(new Entry(getPressure(), set.getEntryCount()), 0); -----这里,将最后一个参数中的0设为1,并将数据集称为data1。并填写要绘制数据的参数。添加第二个图类似于第一个图。唯一的事情是,将索引从 0 变为 1。
    • @zwarrior yes make uniqueIndex 来维护每个图表行。
    • @Narendra Yup 成功了。现在看看如何在 X 轴上添加当前时间。
    【解决方案2】:
    private void addEntry(int min, int max) {
        data = mChart.getData();
        if (data != null) {
            LineDataSet dataSetGraphA = data.getDataSetByIndex(0);
            LineDataSet dataSetGraphB = data.getDataSetByIndex(1);
            LineDataSet dataSetGraphC = data.getDataSetByIndex(2);
            LineDataSet dataSetGraphD = data.getDataSetByIndex(3);
            // LineDataSet set1= data.getDataSetByIndex(1);
            // set.addEntry(...); // can be called as well
            if (dataSetGraphA == null) {
                dataSetGraphA = setLineDataSet(0);
                data.addDataSet(dataSetGraphA);
            }
            if (dataSetGraphB == null) {
                dataSetGraphB = setLineDataSet(1);
                data.addDataSet(dataSetGraphB);
            }
            if (dataSetGraphC == null) {
                dataSetGraphC = setLineDataSet(2);
                data.addDataSet(dataSetGraphC);
            }
            if (dataSetGraphD == null) {
                dataSetGraphD = setLineDataSet(3);
                data.addDataSet(dataSetGraphD);
            }
            Calendar c = Calendar.getInstance();
    
            // yyyy-MM-dd.HH.mm.ss.SS
            SimpleDateFormat df = new SimpleDateFormat("HH:mm:ss.SS");
            String formattedDate = df.format(c.getTime());
            // Now formattedDate have current date/time
            System.out.println("Current time = " + formattedDate);
            Toast.makeText(this, formattedDate, Toast.LENGTH_SHORT).show();
            // add a new x-value first
            data.addXValue(formattedDate);
            data.addEntry(
                    new Entry(randomInRange(min, max), dataSetGraphA
                            .getEntryCount()), 0);
            data.addEntry(
                    new Entry(randomInRange(min, max), dataSetGraphB
                            .getEntryCount()), 1);
            data.addEntry(
                    new Entry(randomInRange(min, max), dataSetGraphC
                            .getEntryCount()), 2);
            data.addEntry(
                    new Entry(randomInRange(min, max), dataSetGraphD
                            .getEntryCount()), 3);
    
            // let the chart know it's data has changed
            mChart.notifyDataSetChanged();
    
            mChart.setVisibleXRangeMaximum(6);
            mChart.setVisibleYRangeMaximum(15, AxisDependency.LEFT);
            //
            // // this automatically refreshes the chart (calls invalidate())
            mChart.moveViewTo(data.getXValCount() - 7, 50f, AxisDependency.LEFT);
        }
    }
    

    【讨论】:

    • 请补充说明。代码墙只鼓励盲目复制粘贴。
    【解决方案3】:

    这是一个简单的例子:

    private void addEntry() {
    
        LineData data = mChart.getData();
    
        LineDataSet set0 = (LineDataSet) data.getDataSetByIndex(0);
        LineDataSet set1 = (LineDataSet) data.getDataSetByIndex(1);
    
        if (set0 == null || set1 == null) {
            // creation of null
            set0 = createSet();
            set1 = createSet();
    
            data.addDataSet(set0);
            data.addDataSet(set1);
        }
    
        data.addXValue("");
    
        data.addEntry(new Entry((float) (Math.random() * 20) + 2f, set0.getEntryCount()), 0);
        data.addEntry(new Entry((float) (Math.random() * 20) + 2f, set1.getEntryCount()), 1);
    
        mChart.notifyDataSetChanged();
    
        mChart.setVisibleXRangeMaximum(6);
    
        mChart.moveViewToX(data.getXValCount() - 7);            
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-03-30
      • 1970-01-01
      • 1970-01-01
      • 2019-02-18
      • 2021-04-06
      • 1970-01-01
      相关资源
      最近更新 更多