JFreechart SeriesException - PullRequest
       9

JFreechart SeriesException

3 голосов
/ 31 мая 2011

Я пытаюсь построить гистограмму, используя временные ряды, введя дату начала и окончания, но у меня возникла проблема с указанием даты окончания: Исключение в ветке "main" org.jfree.data.general.SeriesException: вы пытаетесь добавить наблюдение за период с 4 мая 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);
}

Ответы [ 3 ]

6 голосов
/ 02 июня 2011

Предполагая, что вы создаете основанную на времени гистограмму, используя 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.

1 голос
/ 12 июля 2013

Если вы измените 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 голосов
/ 23 октября 2013

Я считаю, что это коренная причина проблемы. При добавлении списка времени / значения в TimeSeries добавленный момент времени должен быть уникальным для всего списка.
series2.add (new Day (intermediateate), 500);

В противном случае, используя addOrUpdate, если есть возможности времени в списке.
series2.addOrUpdate (новый день (посреднический), 500);

...