MPAndroidChart 折线图未连接数据点

5
我正在调查MPAndroidChart在我们公司的Android和iOS应用程序中的使用,并发现了一个问题,需要解决才能使用这个框架。
该应用程序将主要使用线状图功能,提供的数据可能包含NULL条目。我已经看到其他帖子讨论了这个问题,显然还没有解决显示NULL值的方法。MPAndroidChart with null values 作者建议简单地不将数据点添加到集合中,但在我的情况下,非常重要的是在图形中有一个“空洞”,其中有两个连续的NULL值(或者其他表示方法),即图形在两个NULL值之间不连续。有没有办法使用这个框架实现这一点?
我一直在研究将数据点分成不同的数据集的可能性,但似乎有点麻烦。
谢谢!
数据集示例:
[1 2 10 NULL NULL NULL 20 25 30]
The Line must NOT connect the numbers 10 and 20.

你解决了这个问题吗? - HannahCarney
不,正是这个细节让我转向了AndroidPlot。 - Joakim
1个回答

5
这是我为解决这个问题所想出的方法 - 供以后需要的人参考。它通过迭代并创建新的数据条目,直到遇到空值,然后创建带有“虚假”条目的数据集,使用条目构造函数中的布尔值。可以从“entry.getData()”中找到布尔值,然后可以使用它来设置该数据集不可见:“mLineDataSet.setVisible(false);”。注意:不要尝试将数据集颜色设置为透明 - 如果某些条目为空,则库存在某些情况下会出现图形不显示的错误。
    private void createDataSets() {
          for (int index = 0; index < mGraph.getGraphDataSets().size(); index++) {
                    lastIndexCreated = 0;
                    final GraphDataSet mDataSet = mGraph.getGraphDataSets().get(index);
                    final ArrayList<Entry> mEntries = getEntries(mDataSet.getYValues(), lastIndexCreated);
                    final LineDataSet mLineDataSet = getDataSet(mEntries, mDataSet, color);
                    mGraphLineData.addDataSet(mLineDataSet);
                    lastIndexCreated = mEntries.size() - 1;
                    while (lastIndexCreated < mDataSet.getYValues().size() - 1) {

                        final LineDataSet set = getDataSet(mEntriesSet, mDataSet, colorSecondary);
                        if (mEntriesSet.size() != 0)
                            mGraphLineData.addDataSet(set);
                        lastIndexCreated = (int) mEntriesSet.get(mEntriesSet.size() - 1).getX();
                    }
                }
    }

    private ArrayList<Entry> getEntries(final List<Float> yValues, final int firstValueIndex) {
            final ArrayList<Entry> mEntries = new ArrayList<>();
            for (int i = firstValueIndex; i < yValues.size(); i++) {
                if (yValues.get(i) != null)
                 //boolean here is false means that dataset is not fake and should be shown
                    mEntries.add(new Entry(i, yValues.get(i), false));
                else if (firstValueIndex == i) {
                //add a "Fake" data entry, and use mEntry.getData to set line to not be visible.
                    mEntries.add(new Entry(i, 0, true));
                    break;
                } else {
                    break;
                }
            }
            return mEntries;
        }

它是否按预期工作?图表是否仍然感觉流畅? - Joakim
非常顺畅 - HannahCarney

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接