【问题标题】:JFreeChart: DynamicTimeSeries with period of n millisecondsJFreeChart:DynamicTimeSeries,周期为 n 毫秒
【发布时间】:2011-07-28 09:45:41
【问题描述】:

我正在尝试定义一个接口,我想在其中绘制一些外部设备接收到的值。 这些值的接收频率可以通过接口设置。当然,情节的周期应该根据用户定义的周期而变化。 于是我开始定义如下图表:

int periodMs = 200;
MilliDTSC dataset = new MilliDTSC(1,100, new MultipleOfMillisecond(periodMs));
dataset.setTimeBase(new MultipleOfMillisecond(periodMs))
dataset.addSeries(zeroSeries()),0,"Zero data") // zeroSeries returs a series with values set to 0
JFreeChart chart = createChart(dataset) // create the chart and set ranges and legends
ChartPanel panel = new ChartPanel(panel);

MilliDTSC 是以下类,建议here

public class MilliDTSC extends DynamicTimeSeriesCollection{
  public MilliDTSC(int nSeries, int nMoments, RegularTimePeriod timeSample){
    super(nSeries, nMoments, timeSample);
    if(timeSample instanceof Millisecond)
      this.pointsInTime = new Millisecond[nMoments]
    else if (timeSample instanceof MultipleOfMillisecond)
      this.pointsInTime = new MultipleOfMillisecond[nMoments]
  }
}

MultipleOfMillisecond 是以下类:

public class MultipleOfMilliseconds extends Millisecond{
  MulitpleOfMilliseconds(int periodMs){
    this.periodMs = periodMs
  }

  public RegularTimePeriod previous(){
    RegularTimePeriod result = null;
    if(getMillisecond() - periodMs >= FIRST_MILLISECOND_IN_SECOND)
      result = new Millisecond((int)getMillisecond - periodMs, getSecond());
    else{
      Second previous = (Second)getSecond().previous();
      if(previous!=null)
        result = new Millisecond((int)(getMillisecond() - periodMS + LAST_MILLISECOND_IN_SECOND + 1), previous);
    }
    return result;
  }
  // similar for next()
}

我通过以下方式将样本添加到系列中:

dataset.advanceTime();
dataset.appendData(newData);

我所期望的是,一旦我将周期固定为 200 毫秒,图表就会在 X 标签上报告或多或少 5 个时间值:

00:00:00.000 00:00:05.000 00:00:10.000 00:00:15.000 00:00:20.000

我预计每个“空间”中有 25 个样本。

相反,我对每个“空间”有 25 个样本,但图表在 X 标签上报告了以下值:

00:00:00.000 00:00:00.025 00:00:00.050 00:00:00.075 00:00:00.100

似乎周期是 1 毫秒,但我添加的样本非常 200 毫秒。

我该如何解决这个问题? 如果我不清楚,请告诉我。 谢谢!!

【问题讨论】:

    标签: java jfreechart


    【解决方案1】:

    我想是因为你有这个:

    public class MultipleOfMilliseconds extends Millisecond
    //                                          ^^^^^^^^^^^
    

    这是true

    if(timeSample instanceof Millisecond)
    

    如果你改变测试的顺序,你可能会有更好的运气:

    if(timeSample instanceof MultipleOfMillisecond)
      this.pointsInTime = new MultipleOfMillisecond[nMoments];
    else if (timeSample instanceof Millisecond)
      this.pointsInTime = new Millisecond[nMoments];
    

    【讨论】:

    • 你是对的,这是一个错误。无论如何它不起作用。它引发了一个异常
    • 我修复了异常。它是在 next 和 previuos 方法中返回毫秒而不是 MultimpleOfMillisecond。无论如何它不起作用。
    • 是的,我可以,如果我更新问题或其他内容会更好吗?我想我找到了一个很好的解决方案
    • 我想更新问题,但如果您已经解决了问题,也许您可​​以将其作为解决方案发布并可能也接受。
    • 是的,我必须等待发布我的 awn 答案,因为我没有足够的声誉。
    【解决方案2】:

    这是我实施的解决方案。 我只报告了我改变的方法。这是一个愚蠢的错误:D

    public MilliDTSC(int nSeries, int nMoments, RegularTimePeriod timeSample) {
      super(nSeries, nMoments, timeSample);
      if(timeSample instanceof MultipleOfMillisecond){
        this.pointsInTime = new MultipleOfMillisecond[nMoments];
      }else if (timeSample instanceof Millisecond) {
        this.pointsInTime = new Millisecond[nMoments];
      } 
    }
    
    public class MultipleOfMillisecond extends Millisecond {
    
      private static final long serialVersionUID = 1L;
      private int periodMs = 100;
    
      public MultipleOfMillisecond(int periodMs){
        super();
        this.periodMs = periodMs;
      }
    
      public MultipleOfMillisecond(int periodMs, int millisecond, Second second){
        super(millisecond, second);
        this.periodMs = periodMs;
      }
    
      @Override
      public RegularTimePeriod next() {
        
        RegularTimePeriod result = null;
        if(getMillisecond() + periodMs <= LAST_MILLISECOND_IN_SECOND){
            result = new MultipleOfMillisecond( periodMs, (int)(getMillisecond() + periodMs), getSecond());
        }else{
            Second next = (Second)getSecond().next();
            if(next != null){
                result = new MultipleOfMillisecond(periodMs, (int)(getMillisecond() + periodMs - LAST_MILLISECOND_IN_SECOND - 1), next);
            }
        }
        return result;
        
      }
    
      @Override
      public RegularTimePeriod previous() {
        
        RegularTimePeriod result = null;
        if(getMillisecond() - periodMs >= FIRST_MILLISECOND_IN_SECOND){
            result = new MultipleOfMillisecond(periodMs, (int)getMillisecond() - periodMs, getSecond());
        }else{
            Second previous = (Second)getSecond().previous();
            if(previous != null){
                result = new MultipleOfMillisecond(periodMs, (int)(getMillisecond() - periodMs + LAST_MILLISECOND_IN_SECOND + 1), previous);
            }
        }
        return result;
        
      } 
    }
    

    现在我在 5 秒内有 10 个样本,我将周期设置为 500 毫秒

    【讨论】:

    • +1 现在我明白你的意思了。这看起来比创建一个单独的HemiSecond 类更灵活。您可能还需要实现Comparable
    • 也许是的。我认为以毫秒为单位实现的类似方法对我的班级也有好处。
    • 感谢您发布您的解决方案,顺便说一句。我建议接受@msandiford 富有洞察力的答案,因为您接受除您自己之外的答案会得到两分。详情请参阅faq
    【解决方案3】:

    改为使用原始的MilliDTSCMillisecond,并调用advanceTime() 并在附加新数据之前根据需要附加旧数据。以 200 ms 为例,执行如下操作:

    float[] newData = new float[1];
    float[] oldData = new float[1];
    
    @Override
    public void actionPerformed(ActionEvent e) {
        newData[0] = randomValue();
        oldData[0] = newData[0];
        for (int i = 0; i < 200; i++) {
            dataset.advanceTime();
            dataset.appendData(oldData);
        }
        dataset.appendData(newData);
    }
    

    请注意,现在每秒有 5 个样本,间隔 200 毫秒。

    【讨论】:

    • 对不起。它不适合我。我有一个方法update(float value),每次收到新数据时都会调用它,所以每次每 200 毫秒。如果我将您在 actionPerformed 方法中编写的代码放入 update 方法中,我的图表会报告一行。
    • 好的,我认为您正在绘制相同的值 200 次,因此您的系列比 100 长得多(正如我在代码中定义的那样)。无论如何,我不想看到这些值之间的步骤。这不是系统的真实行为。我想要一条倾斜的线,它取决于以下两个值之间的差异。
    • 然后只需调用advanceTime()omit appendData(oldData)`。
    • 谢谢,但它对我不起作用。我通过扩展毫秒类找到了解决方案。我将在三个小时内发布它。我没有足够的声誉,所以我无法在 8 小时内回答我的问题。
    猜你喜欢
    • 2011-10-14
    • 1970-01-01
    • 2017-08-17
    • 2014-10-12
    • 1970-01-01
    • 1970-01-01
    • 2019-12-24
    • 2015-12-17
    • 1970-01-01
    相关资源
    最近更新 更多