【问题标题】:JFreechart SeriesExceptionJFreechart 系列异常
【发布时间】:2011-05-31 17:12:18
【问题描述】:

我试图通过引入开始日期和结束日期来使用时间序列绘制条形图,但我遇到了它指示的结束日期的问题: 线程“main”org.jfree.data.general.SeriesException 中的异常:您正在尝试添加时间段 4-mai-2011 的观察,但该系列已包含该时间段的观察。不允许重复。尝试使用addOrUpdate() 方法。

final TimeSeries series2 = new TimeSeries("ip max", Day.class);

String datebegin = "04/29/2011 02:00:01";
String dateend = "05/04/2011 02:00:01";
DateFormat formatter;
Date date;
formatter = new SimpleDateFormat("MM/dd/yyyy HH:mm:ss");
date = formatter.parse(datebegin);
Calendar cal1 = Calendar.getInstance();
cal1.setTime(date);
Date date2;
date2 = (Date) formatter.parse(dateend);
Calendar cal2 = Calendar.getInstance();
cal2.setTime(date2);
while (((cal1.compareTo(cal2)) != 0))  {
    cal1.add(Calendar.HOUR, 24);
    String intermediatestringdate = formatter.format(cal1.getTime());
    System.out.println( intermediatestringdate);
    Date intermediatedate = (Date) formatter.parse(dateend);
    series2.add(new Day(intermediatedate),500);
}

【问题讨论】:

  • 对不起,伙计们:$这只是变量不匹配的问题
  • 您可以删除您的问题,或者如果您认为其他人可能会受益,您可以在答案中扩展您的发现。详情请参阅faq
  • 实际上,我没有将中间字符串日期放入日期转换命令中,而是放入 dateend ,因为我已经尝试了所有我能做的事情(当然经过一些搜索)我认为这是一个 api 误用,然后我添加了很多 system.out.println 我发现了问题:无论如何,这个方法提供了一种在 jfree 中动态设置时间序列的方法,如果有一些优化我会很高兴得到它们

标签: exception jfreechart


【解决方案1】:

假设您使用ChartFactory.createXYBarChart()IntervalXYDataset 创建基于时间的条形图,只需使用合适的TimePeriod 构造TimeSeries 的域。

private static IntervalXYDataset createDataset() {
    TimeSeries series = new TimeSeries("Series");
    RegularTimePeriod day = new Day(29, 4, 2011);
    RegularTimePeriod end = new Day(4, 5, 2011);
    int i = 1;
    while (day.compareTo(end) < 1) {
        series.addOrUpdate(day, i++);
        day = day.next();
    }
    TimeSeriesCollection dataset = new TimeSeriesCollection();
    dataset.addSeries(series);
    return dataset;
}

另外,请注意TimeSeries 不再需要Day.class

【讨论】:

  • 非常感谢 :) 这样会好很多 :)
  • 优秀。请考虑通过单击左侧的空白复选框来接受此答案。
【解决方案2】:

如果您将 TimeSeries 和 TimeSeriesCollection 更改为 TimePeriodValues 和 TimePeriodValuesCollection,您将没有唯一的时间约束来处理。

这就是我所做的,我能够沿 x 轴绘制与毫秒相同的时间值:

    TimePeriodValues data = new TimePeriodValues("duration"); 
    for(int x=0; x<_stats.getDataPoints().size();x++)
    {
        DataPoint dp = _stats.getDataPoints().get(x); 
        data.add(new Millisecond(dp._date),dp._duration); 
    }
    TimePeriodValuesCollection dataset = new TimePeriodValuesCollection(); 

    dataset.addSeries(data); 
    JFreeChart chart = ChartFactory.createScatterPlot("Title", "start time", "duration (millis)", dataset, PlotOrientation.VERTICAL, true, true, false);
    XYPlot plot = chart.getXYPlot();
    plot.setDomainAxis(new DateAxis()); 
    DateAxis domainAxis = (DateAxis)plot.getDomainAxis(); 
    domainAxis.setDateFormatOverride(new SimpleDateFormat("yyyy/MM/dd HH:mm:ss.SSS")); 
    ChartUtilities.saveChartAsPNG(new File(_reportFolder+File.separator+uuid+".png"), chart, 500, 300);

【讨论】:

    【解决方案3】:

    我相信这是问题的根本原因。在 TimeSeries 中添加时间/值列表时,添加的时间点在整个列表中必须是唯一的。
    series2.add(new Day(intermediateate),500);

    否则,如果列表中有时间的可能性,则使用 addOrUpdate。
    series2.addOrUpdate(new Day(intermediatedate),500);

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-10-19
      • 2015-04-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多