【问题标题】:Displaying multiple y values for a single x in MPAndroidChart在 MPAndroidChart 中显示单个 x 的多个 y 值
【发布时间】:2017-02-19 15:41:47
【问题描述】:

对于折线图,我发现如果单个 x 有多个 y 值,只要它不是最终的 x,它就可以正常工作。如果是最后一个 x,它只显示第一个条目。是否有已知的解决方法?

例子:

//firstTimestamp is earlier than secondTimestamp

data.add(new Entry(firstTimestamp, 10));
data.add(new Entry(firstTimestamp, 20)); //won't show unless you uncomment below
data.add(new Entry(firstTimestamp, 30)); //won't show unless you uncomment below

//data.add(new Entry(secondTimestamp, 40));

第二个时间戳注释掉时的图表:

未注释第二个时间戳的图表(请注意,现在包括 20 和 30,而之前没有):

编辑:

我相信我已经找到了这个问题的原因,并且可以通过以下方式解决它,通过更改

public abstract class BarLineScatterCandleBubbleRenderer extends DataRenderer {

    // ... lines removed ... //

    public void set(BarLineScatterCandleBubbleDataProvider chart, IBarLineScatterCandleBubbleDataSet dataSet) {
        float phaseX = Math.max(0.f, Math.min(1.f, mAnimator.getPhaseX()));

        float low = chart.getLowestVisibleX();
        float high = chart.getHighestVisibleX();

        Entry entryFrom = dataSet.getEntryForXValue(low, Float.NaN, DataSet.Rounding.DOWN);
        Entry entryTo = dataSet.getEntryForXValue(high, Float.NaN, DataSet.Rounding.UP);

        min = entryFrom == null ? 0 : dataSet.getEntryIndex(entryFrom);
        max = entryTo == null ? 0 : dataSet.getEntryIndex(entryTo);
        range = (int) ((max - min) * phaseX);
    }

    // ... lines removed ... //
}

对此,我相信这将解决问题:

public abstract class BarLineScatterCandleBubbleRenderer extends DataRenderer {

    // ... lines removed ... //

    public void set(BarLineScatterCandleBubbleDataProvider chart, IBarLineScatterCandleBubbleDataSet dataSet) {
        float phaseX = Math.max(0.f, Math.min(1.f, mAnimator.getPhaseX()));

        float low = chart.getLowestVisibleX();
        float high = chart.getHighestVisibleX();

        Entry entryFrom = dataSet.getEntryForXValue(low, Float.NaN, DataSet.Rounding.DOWN);

        //my edits here
        int indexTo = dataset.getEntryIndex(high, Float.NaN, DataSet.Rounding.UP);
        List<Entry> values = dataset.getValues();
        while (indexTo + 1 < values.size() && values.get(indexTo + 1).getX() == high) {
            indexTo++;
        }
        Entry entryTo = values.get(indexTo);
        //my edits end here

        min = entryFrom == null ? 0 : dataSet.getEntryIndex(entryFrom);
        max = entryTo == null ? 0 : dataSet.getEntryIndex(entryTo);
        range = (int) ((max - min) * phaseX);
    }

    // ... lines removed ... //
}

如何子类化/使用这些编辑?

【问题讨论】:

  • 我注意到您接受了答案。你让它工作了吗?
  • 我只是将所有类复制到我需要更改的类,然后使用这些类而不是原始包中的类。无法让 jar 方法工作。
  • 好的 - 感谢您的接受。感觉很好,今天我帮助了一个人。

标签: android graph timestamp time-series mpandroidchart


【解决方案1】:

请注意,LineChart 条目唯一受支持的用例是将它们按升序添加。这记录在the wiki:

请注意,此库不正式支持从条目列表中绘制 LineChart 数据,该条目列表未按条目的 x 位置以升序方式排序。

这样做的原因是渲染器针对唯一的升序条目进行了优化。

如果你想解决这个问题,我建议你查看LineChartRenderer 的源代码。您将不得不放置断点并找到导致它以您演示的方式呈现的问题。然后您可以考虑对渲染器进行子类化以满足您的要求。本质上,您将删除优化以支持额外的用例(非唯一值)。

编辑:如果您不愿意操纵现有的对象图来获得您想要的行为,您可能需要考虑使用更改来分叉库。然后你可以为你的 fork 构建一个.jar 并将它包含在你的 Android 项目中。请参阅以下答案中的说明:

How to make a .jar from an Android Studio project

How to add a .jar as a library in Android Studio

【讨论】:

猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-10-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-01-29
相关资源
最近更新 更多