2017-02-19 111 views
0

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

实施例:

//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 ... // 
} 

我该如何继承这个/使用这些编辑?

+0

我注意到你接受了答案。你有没有得到它的工作? –

+0

我只是复制了所有需要更改的类,并且只是使用那些而不是原始包中的类。无法获得jar方法的工作。 – user7588928

+0

好的 - 非常感谢接受。感觉很好,我今天帮了别人。 –

回答

0

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

请注意,这个库并不正式支持从没有在上升方式中的条目的x位置排序的条目列表绘制线型图数据。

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

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

编辑:如果您不愿意操作现有的对象图来获取所需的行为,则可能需要考虑使用该更改分叉库。然后,您可以构建您的分支的.jar并将其包含在您的Android项目中。参照说明书以下为同一答案:

How to make a .jar from an Android Studio project

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

+0

请参阅[此问题](https:// stackoverflow。COM /问题/ 40532564/mpandroidchart创造-A-封闭图表圆形线-图表)。 –