如何绘制另一个时间序列而不影响JFreeChart

时间:2017-04-09 15:01:57

标签: java swing jfreechart linechart

所以我有一个包含3个不同时间序列的折线图:

enter image description here

"电压" line是表示实时数据和整个" High"和 "低"系列实际上是从文件中动态加载的(每当用户单击“加载”按钮时)。

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

然后我解决这个问题的想法是绘制" High"和"低"只是从"电压"的第一点开始。当我向"电压"添加新点时,系列到当前日期的最大时间段。系列。

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 个答案:

答案 0 :(得分:1)

您需要解决几个问题才能获得所需的结果。假设有三个TimeSeries拥有密钥"High""Low""Voltage"

  • 使用SwignWorker在后台收集数据,如图here所示。

  • process()的实施中,将新到达的值添加到"Voltage",并在相关时间合并"High""Low"的现有值。

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

  • 同样适用于"Low"

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