MPAndroidChart线图未连接的数据点

时间:2015-08-11 10:52:15

标签: android mpandroidchart

我正在调查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.

1 个答案:

答案 0 :(得分:4)

这是我最终想出来解决这个问题 - 对于未来的任何人。它迭代并在数据集中创建新条目,直到它达到空值,然后它创建数据集,其中“假”条目在条目构造函数中使用布尔值。布尔可以在

中找到
  

“entry.getData()”

然后您可以使用它来设置数据集不可见

  

“mLineDataSet.setVisible(假);”

注意:不要尝试将数据集颜色设置为透明 - 该库有一个错误,如果某些条目为空,则图形甚至不会出现。

    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;
        }