2017-04-09 30 views
1

所以我有3个不同的时间序列折线图:如何绘制另一个时间序列,而不在JFreeChart的影响当前的时间序列

enter image description here

由于“电压”行就是代表实时数据和全“高”和 “低”系列实际上是从文件中动态加载的(每当用户点击LOAD按钮时)。

这里的问题是,如果我从CSV文件中加载整个“高”和“低”系列,然后在实时数据到来时绘制它,它将只显示“高” “和”低“系列,然后我们必须等待那段时间内的实时数据(这是可以理解的)。

然后,我的想法解决这个问题是从“电压”系列的第一个点的时间段到当前日期轴的最大时间段时添加“高”和“低”一个新的“电压”系列。

public void add(Data data) throws ParseException, CloneNotSupportedException { 
    Date date = new SimpleDateFormat(PATTERN).parse(data.getDate()); 
    Millisecond milis = new Millisecond(date); 
    timeSeries.add(milis, data.getNumber()); 
    Date maxDate = axis.getMaximumDate(); 
    Date minDate = dataset.getSeries(0).getTimePeriod(0).getStart(); 
    Millisecond maxMili = new Millisecond(maxDate); 
    Millisecond minMili = new Millisecond(minDate); 
    // highSeries and lowSeries are loaded from csv file 
    TimeSeries tempHighSeries = highSeries.createCopy(minMili, maxMili); 
    TimeSeries tempLowSeries = lowSeries.createCopy(minMili, maxMili); 
    TimeSeriesCollection collection = new TimeSeriesCollection(); 
    collection.addSeries(tempHighSeries); 
    collection.addSeries(tempLowSeries); 
    plot.setDataset(1, collection); 
} 

结果就是上面的图片。不过,我真正想要的是这样的:

enter image description here

我希望用户仍然可以看到这些边缘的下一部分(当“高”和“低”系列中的下一分不中,实时数据的范围)

任何指针?

+1

为什么不将高/低数据与实时电压数据合并为后者? – trashgod

+0

您能否以一些代码行为例给我更多细节? – Forrest

+0

是的,为[示例](http://stackoverflow.com/a/13205322/230513)添加数据到'process()'的实现中。 – trashgod

回答

1

您需要解决几个问题才能获得理想的结果。假设3个TimeSeries具有键"High""Low""Voltage"

  • 在使用SwignWorker背景收集数据,如图here

  • 在你执行process(),加新到的值"Voltage",并在相关时间合并的"High""Low"现有值。

  • t n是这样的时间。在t n + 1,要添加下一个值,例如"High"还为时过早。相反,使用linear interpolation确定位于"High"的投影上的新点的值,如here所示。每条这样的线将以"High"的连续值为界,在图中以粗糙的手绘蓝色显示。新点可以临时添加,在连续值之间更新,最后在新值为"High"时更换。

  • "Low"也这样做。

  • 您可以通过重写getItemShape()来省略临时点的形状,如所示,并根据需要返回空白形状。