在MPAndroidChart中为单个x显示多个y值

在MPAndroidChart中为单个x显示多个y值,android,graph,timestamp,time-series,mpandroidchart,Android,Graph,Timestamp,Time Series,Mpandroidchart,对于折线图,我发现如果一个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.

对于折线图,我发现如果一个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 ... //
}
公共抽象类BarLineScatterCandleBubbleRenderer扩展了DataRenderer{
//…线路已删除//
公共无效集(BarlineScatterCandleBobbleDataProvider图表,iBarlineScatterCandleBobbleDataSet数据集){
float phaseX=Math.max(0.f,Math.min(1.f,mAnimator.getPhaseX());
float low=chart.getLowestVisibleX();
浮点高=chart.getHighestVisibleX();
Entry entryFrom=dataSet.getEntryForXValue(低,Float.NaN,dataSet.Rounding.DOWN);
//我的编辑在这里
int indexTo=dataset.getEntryIndex(高,Float.NaN,dataset.Rounding.UP);
列表值=dataset.getValues();
while(indexTo+1

如何对此编辑进行子分类/使用这些编辑?

请注意,
折线图
条目唯一支持的用例是按升序添加它们。这记录在:

请注意,此库不正式支持条目列表中的图形折线图数据,该条目列表未按条目的x位置升序排序

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

如果你想避开这个问题,我建议你看看这个问题的来源。您必须放置断点,并找到导致它以您演示的方式呈现的问题。然后,您可以考虑渲染器的子类以满足您的需求。基本上,您将删除优化以支持额外用例(非唯一值)

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


另请参见。我注意到您接受了答案。你让它工作了吗?我只是将所有的类复制到我需要更改的类,并使用它们而不是原始包中的类。无法使jar方法工作。好的-谢谢您的接受。感觉很好,我今天帮了别人。