2011-05-31 70 views
3

我想通過引入開始日期和結束日期來繪製使用時間序列的條形圖,但是我遇到了它指示的結束日期的問題: 線程「main」中的異常org.jfree.data.general.SeriesException:您正試圖添加對時間段4-mai-2011的觀察,但該系列已經包含該時間段的觀察結果。重複是不允許的。嘗試使用addOrUpdate()方法。JFreechart SeriesException

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); 
} 
+0

對不起人:$這只是一個變量不匹配的問題 – Jihath 2011-05-31 17:29:39

+0

你可以刪除你的問題,或者如果你認爲別人可能會受益,你可以在答案中擴大你的發現。有關詳細信息,請參閱[faq](http://stackoverflow.com/faq)。 – trashgod 2011-05-31 20:16:33

+0

實際上,而不是把中間字符串datedate在日期轉換命令,我把dateend,因爲我試過我所能做的(經過一些搜索當然),我認爲這是一個api錯誤使用,然後我添加了很多system.out.println我發現問題:無論如何,這種方法提出了一種方法來動態地設置jfree中的時間序列,如果有一些優化,我會很高興得到它們 – Jihath 2011-06-01 09:24:32

回答

6

假設你正在使用ChartFactory.createXYBarChart()IntervalXYDataset創建一個基於時間的條形圖,只需構建你TimeSeries域用合適的TimePeriod

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; 
} 

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

+0

非常感謝:)這是更好的方式:) – Jihath 2011-06-02 08:56:05

+1

非常好。請考慮通過點擊左側的空白複選框來接受此答案。 – trashgod 2011-06-02 16:44:19

0

如果將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); 
0

我相信這是問題的根源。在TimeSeries中添加時間/值列表時,添加的時間點在整個列表中必須是唯一的。
series2.add(new Day(intermediatedate),500);

否則,如果列表中有時間可能,則使用addOrUpdate。
series2.addOrUpdate(new Day(intermediatedate),500);